消息队列技术选型需要考虑的方面
首先需要考虑:
- 业内常用的MQ有哪些?
- 每一种MQ的各自表现如何?
- 这些MQ在同等机器条件下,能抗多少QPS(每秒抗几千QPS还是几万QPS)?
- 性能有多高(发送一条消息给MQ要2ms还是20ms)?
- 可用性能不能得到保证(要是MQ部署的机器挂了怎么办)?
除此之外,还得考虑:
- 选用的MQ会不会出现丢失数据的问题
- 如果需要的话,能否让MQ机器进行线性的集群扩容(就是多加几台机器)
- 消息中间件经常需要使用的一些功能这些MQ都有吗?(延迟消息、事务消息、消息堆积、消息回溯、死信队列等)
还得考虑:
- MQ的技术文档是否齐全?
- 相关社区是否活跃?
- 在行业内是否广泛运用?
- 用什么语言编写的?
Kafka
```shell 优点: (1)高吞吐量: 每秒的QPS可以达到几十万。 (2)高性能: 发送消息给Kafka都是毫秒级的性能。 (3)高可用性: 支持集群部署,其中部分机器宕机是可以据需运行的。
缺点: (1)丢数据问题。因为Kafka收到消息之后会写入一个磁盘缓冲区里,并没有直接落地到物理磁盘中,所以如果机器本身发生故障,可能会导致磁盘缓冲区里的数据丢失。 (2)功能单一。 主要是支持发送消息给Kafka,然后从里面消费消息。其他就没有额外的高级功能。所以基于Kafka有限的功能,可能适用的场景并不多。
Kafka技术主要使用在用户行为日志的采集和传输上,比如大数据团队要收集APP上用户的一些行为日志,这种日志就是用Kafka来收集和传输的。 因为这种日志适当丢失数据也是没有关系的,而且一般量特别大,要求吞吐量要高,一般就是收发消息,不需要太多的高级功能。
<a name="ty6l1"></a>
### RabbitMQ
```shell
优点:
保证数据的不丢失
保证高可用性,集群部署的时候如果部分机器宕机可以继续运行
支持部分高级功能:死信队列,消息重试等
缺点:
并不具备高的吞吐量,一般就每秒几万的级别,所以如果遇到特别特别高并发的情况下,支撑起来有些困难。
开发语言为erlang,没办法阅读源码甚至修改源代码。
RocketMQ
优点:
高吞吐量,每秒几十万的QPS。
高性能,保证毫秒级的性能。
保证高可用性,可以大规模的集群,支持可以通过配置保证数据绝对不丢失。
支持高级功能:延迟消息,事务消息,消息回溯,死信队列,消息积压等等。
基于Java开发,符合国内大多数公司的技术栈,很容易阅读源码,甚至修改源码。
缺点:
官方文档相较于Kafka和RabbitMQ的官方文档较简单。
基本上,Kafka、RabbitMQ、RocketMQ的社区都还算活跃,更新频率也都可以,而且基本运用都非常广泛。 尤其是Kafka和RabbitMQ,目前Kafka几乎是国内大数据领域日志采集传输的标准,RabbitMQ在各种中小型公司里运用极为广泛,RocketMQ也是开始在一些大公司和其他公司里快速推行。