MQ【消息中间件选型】
一、作用
异步化提升性能、系统间解耦、流量削峰。
二、类型
ActiveMQ、RabbitMQ、Kafka以及RocketMQ这四大类。
2.1、ActivwMQ
目前不活跃,前几年用的比较多,故略去。
2.2、Kafka
【优点】:
- Kafka最大优势就在于高吞吐量,在普通机器4CPU8G的配置下,一台机器可以抗住十几万的QPS,这一点还是相当优越的。
- Kafka的性能很高,发送消息过去基本都是毫秒级别的。
- 支持集群部署,如果部分机器宕机不可用,不影响Kafka的正常使用。
【缺点】:
- Kafka有可能会造成数据丢失。在收到消息后,并非直接写到物理磁盘,而是先写入到磁盘缓冲区。
- 功能比较的单一 ,主要支持收发消息,高级功能基本没有,会造成适用场景受限。
【业界使用】:
业界一般将kafka用来处理用户的行为日志的采集的传输,用在大数据团队较多。有的公司使用他就只是用来收发消息这种的场景,如用户行为日志等。因为,可以接受数据的丢失,而且要求吞吐量要极高。
关键字:高吞吐量、功能单一、数据可能丢失
2.3、RabbitMQ
【优点】:
- 能保证数据不丢失。
- 能保证高可用,部分机器宕机了还可以继续使用。
- 支持很多高级功能,如消息重试、死信队列。
【缺点】:
- 吞吐量比较低,大概在每秒几万的样子,这样像对于大型电商促销秒杀就不能胜任。
- 集群线性扩展比较麻烦。
- 开发语言是erlang,懂得人不是很多,无法对其改造。
2.4、RocketMQ
阿里巴巴开源的消息中间件,各方面也表现的比较优越,几乎同时解决了Kafka和RabbitMQ它们两个的缺点。
【优点】:
- 吞吐量很高,大概普通机器有十万QPS往上。
- 保证高可用,高性能。
- 保证数据绝对不丢失。
- 支持大规模集群部署,线性扩展方。
- 支持各种高级的功能,如延迟消息、消息回朔。
- java语言开发,满足了国内绝大部分公司技术栈。
三、选择对比
1、如果我们业务只是收发消息这种单一类型的需求,而且可以允许小部分数据丢失的可能性,但是又要求极高的吞吐量和高性能的话,就直接选Kafka就行了,就好比我们公司想要收集和传输用户行为日志以及其他相关日志的处理,就选用的Kafka中间件。
2、如果自己所处公司业务比较平稳,未来几年内不会出现飞速发展,而且没有什么改源码的特殊需求的话,在面对选择MQ的时候就可以选用RabbitMQ。毕竟如今这样的中小公司也就是这么干的。
3、如果自己所处公司发展迅猛,一年经常搞一些特别大的促销秒杀活动,公司技术栈主要是Java语言的话,就直接一步到位选择RocketMQ,这样会省很多事情。
四、整体选项对比