一、各种消息队列简介:
1、RabbitMQ简介:
- producer
- consumer
- queue
- exchange
- binding
- routing key
- vhost
- channel
2、Kafka简介:
- producer
- consumer
- zookeeper
- broker
- topic
3、RocketMQ简介:
- producer
- consumer
- nameServer
- broker
- commitLog
- consumerQueue
二、消息队列使用场景
1、解耦
如常用ABCD系统中,BCD系统都需要从A系统中调用接口返回数据,这时候突然来了E系统,也需要A系统数据,又或者C系统不想要用这个接口数据了,而且A系统还得考虑,如果BCD接收不到数据,接收失败咋整之类的问题。如果基于消息队列,这些问题就迎刃而解了。A系统直接把数据扔到Mq中,BCDE系统直接从Mq中消费,如果消费失败,则重试消费。
2、异步
比如下订单系统中,会调用库存系统,会调用仓库系统,积分系统等,用户订单操作会直接返回给用户信息,提示订单完成,至于库存减少,或者仓库发货又或者积分的增加等,都是异步完成。极大的提高用户响应速度。
3、削峰
例如我们做得考试系统中,用户通过人脸识别登录系统,考虑到考试系统的特殊性,三万名考生参加考试,需要记录人脸识别登录照片。从考试完结果上看,用户最大并发数在6000,于是我们采用MQ来进行异步消费用户人脸识别图片,当时统计MQ每秒2000消费消息。及时反馈了考生人脸识别登录成功,对数据库写操作也起到很大的缓冲功能。
三、各种消息队列优缺点
1、RabbitMQ:
- 优点:几万级数据量,跨平台,基于erlang语言开发,因此响应速度快、延迟小,自带可视化界面
- 缺点:数据吞吐量相对与小一些,并且是基于erlang语言开发,比较重的问题难以维护。
2、kafka
- 优点:几十万级别数据量,高吞吐量,使用了NIO、顺序读写、零拷贝、生产消息批处理等技术。
- 缺点:每个partition对应一个或多个segment文件,当partition多的时候性能会下降,生产消息批处理有可能导致丢消息,延迟相对其他MQ比较高。
3、RocketMQ
- 优点:几十万级别数据量,基于Java开发,应对了淘宝双十一考验,使用了NIO、顺序写随机读、零拷贝。
- 缺点:吞吐量比kafka稍微弱些
四、各种消息队列区别
1、延迟队列
- RabbitMQ:支持
- Kafka:不支持
- RocketMQ:支持
2、死信队列
- RabbitMQ:支持
- Kafka:不支持
- RocketMQ:支持
3、重试队列
- RabbitMQ:支持
- Kafka:不支持
- RocketMQ:支持
4、优先级队列
- RabbitMQ:支持
- Kafka:不支持
- RocketMQ:支持
5、消费模式
- RabbitMQ:pull + push
- Kafka:pull
- RocketMQ:pull + 长轮询
6、广播模式
- RabbitMQ:点对点模式
- Kafka:发布订阅模式
- RocketMQ:发布订阅模式
7、幂等性
- RabbitMQ:不支持
- Kafka:支持
- RocketMQ:不支持
8、刷盘策略
- RabbitMQ:默认是内存存储
- Kafka:默认是异步刷盘
- RocketMQ:默认同步刷盘
9、高可用:
- RabbitMQ:可用镜像模式和主备集群
- Kafka:使用partition的副本机制和isr选举机制
- RocketMQ:通过broker的master和slave实现高可用
五、消息队列常见处理方案
1、保证消息可靠性:
- 生产阶段:消息从producer端生产出来发送到broker端。采用请求确认机制,正确处理返回值或捕获异常
- 存储阶段:消息在broker端存储。数据写入磁盘成功再相应,如果是集群的话,节点刷盘成功数过半通过
- 消费阶段:消息从broker端到consumer端。采用请求确认机制,业务逻辑完成后再发送消费确认
2、重复消息处理:
- 利用数据库的唯一索引
- 使用CAS方式给更新的数据设置前置条件
- 记录并检查
3、消息堆积处理:
- 当发送变快时:增加消费端的实例,系统降级关闭一些不重要的业务
- 当消费变慢:排查变慢原因,消费失败导致一条消息反复消费的情况变多,消费线程是不是阻塞住了
4、保证消息有序性:
- 主题层面是没法保证消息有序性的,只有在分区(队列)上才能保证有序性
- 如果是全局有序性,可以配置成一个队列一个生产者一个消费者
- 如果是局部有序性,可以取一个key,用一致性哈希算法计算出队列编号,保证相同的key发送到同一个队列上