1.技术选型的考量条件

  • 业内常用的MQ有哪些?
  • 每一种MQ各自的表现如何?
  • 这些MQ在同等机器条件下,能抗多少QPS(每秒抗几千QPS还是几万QPS)?
  • 性能有多高(发送一条消息给他要2ms还是20ms)?
  • 可用性能不能得到保证(要是MQ部署的机器挂了怎么办)?

2.深层次的考量

  • 他们会不会丢数据?
  • 如果需要的话能否让他们进行线性的集群扩容(就是多加机台机器)?
  • 消息中间件经常需要使用的一些功能他们都有吗(比如说延迟消息、事务消息、消息堆积、消息回溯、死信队列,等待)?

3.Kafka、RabbitMQ以及RocketMQ的调研对比

(1)Kafka

优点:常规的单机配置下,可以达到每秒十几万的QPS,适合大数据场景下使用。

缺点:

  1. 容易丢失数据——kafka收到消息不是直接落盘,而是放内存了,宕机后会导致丢失数据;
  2. 功能单一——只能进行发送消息,然后kafka消费消息,然后……没了

(2)RabbitMQ

优点:可以保证数据不丢失,能保证高可用性,也就是集群部署的时候部分集群宕机可以继续运行;然后支持部分高级功能,比如:死信队列、消息重试之类的。

缺点:吞吐量低,相较于Kafka只有每秒几万的级别,高并发场景下容易达到瓶颈;底层源码问题,他的开发语言是erlang,难以读懂和修改。

提一嘴:笔者之前想过去学一下RabbitMQ,但是在DEBUG看源码时被劝退了,┭┮﹏┭┮。

(3)RocketMQ

优点:吞吐量高,单机可达到10万QPS以上;可以保证高可用性,性能很高;而且支持通过配置保证数据绝对不丢失,可以部署大规模的集群;支持各种高级的功能,比如延迟消息、事务消息、消息回溯、死信队里、消息积压等;底层代码基于Java开发,便于阅读和修改。

缺点:暂无明显缺陷。

(4)活跃的社区和广泛的应用

基本上Kafka、RabbitMQ和RocketMQ的社区都还算活跃,更新效率都还可以,而且基本运用都非常的广泛。

目前Kafka几乎是国内大数据领域日志采集传输的标准,RabbitMQ在各种中小公司里运用极为广泛;RocketMQ在一些大公司和其他公司已经广泛使用,并且RocketMQ已经成为了apache的顶级项目。

(5)关于高可用集群

RabbitMQ是伪分布式的,只能部署镜像集群,集群中国内每台集群存储的数据是一样的,只能垂直的扩展,没能水平扩展。

而Kafka和RocketMQ都是将message拆分后存储到不同的partition上,然后每个partition对应一个主节点,其他机器存储副本。