三大经典且成熟的MQ产品介绍及选型:RabbitMQ、RocketMQ、Kafka

122 阅读4分钟

一、各种消息队列简介:

1、RabbitMQ简介:

image

  • producer
  • consumer
  • queue
  • exchange
  • binding
  • routing key
  • vhost
  • channel

2、Kafka简介:

image

  • producer
  • consumer
  • zookeeper
  • broker
  • topic

3、RocketMQ简介:

image

  • 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发送到同一个队列上