Java开发中的消息队列及选型

作者:Kinglong    发表时间:2022-12-25 21:51   

关键词:RabbitMQ  RocketMQ  Kafka  

1.为什么要使用消息队列

使用消息队列,比较核心的目的有3个:解耦、异步、削峰。

解耦:以松耦合的方式实现系统之间的通信,保障各系统之间的独立性,更方便、灵活地实现系统的扩展和变更。

异步:将任务中的耗时步骤交给MQ及消息订阅模块处理,避免阻塞,提高响应速度。

削峰:将短暂的高峰期请求积压在MQ中,然后以数据库能够承受的速度从消息队列中逐渐拉取出来进行处理。将并发请求高峰时段的压力由数据库IO操作转移到MQ中,避免服务器因为超负荷请求而崩溃。

2.使用消息队列会面临哪些问题

(1)系统可用性降低:如果MQ挂掉,造成整套系统崩溃。

(2)系统复杂性提高:增加消息的重复消费、消息丢失、消息传递顺序性等问题。

(3)数据一致性问题:多个系统订阅消息,如果某一个系统写库失败,造成整套系统数据出现不一致情况。

3.常见消息队列

ActiveMQ、RabbitMQ、RocketMQ、Kafka、Pulsar等。

单机吞吐量:ActiveMQ、RabbitMQ都是万级,RocketMQ、Kafka、Pulsar是10万级。因此前两者更适用于小型规模系统并发量有限的情况,后两者则能适应大型系统更高并发的需求。

topic数量对吞吐量的影响:RocketMQtopic数量达到几百/几千级,吞吐量有小幅下降,这是一大优势。Kafka从几十到几百时,吞吐量大幅下降,Kafka适用于topic数量不过多的情况。

时效性:RabbitMQ是微秒级,延迟最低。其他都是毫秒及(ms)。

可用性:ActiveMQ 高、RabbitMQ 高,RocketMQ和Kafka非常高,分布式架构,Pulsar分布式

消息可靠性:ActiveMQ 有较低概率丢失,RabbitMQ 基本不丢,RocketMQ和Kafka经参数优化可0丢失。

功能:ActiveMQ完善,RabbitMQ 性能好、延时低,基于erlang开发,不便Java系统二次开发,RocketMQ功能较完善,Kafka功能较简单。

4.消息队列选型

ActiveMQ是早期用得多,欠缺大规模吞吐量场景优势,现在不推荐用了。

RabbitMQ后续用得较多,集群模式有性能瓶颈,基于Erlang不利于二次开发。开源的,社区活跃度高,中小型公司,技术实力较为一般,用 RabbitMQ 是不错的选择

RocketMQ越来越多的公司在用GitHub上的活跃度不算高,有中文社区,对国内Java开发友好大型公司,基础架构研发实力较强,用 RocketMQ 是很好的选择。

Kafka 大数据领域的实时计算、日志采集等场景,用 Kafka 是业内标准的。

Pulsar 计算存储分层架构,具备多租户、高一致、高性能、百万 topic、数据平滑迁移等诸多优势,支持队列与流两种消息消费模型,社区非常活跃,还在一个快速迭代的过程中。

 

内容参考来源:

https://zhuanlan.zhihu.com/p/476239303?utm_id=0

https://zhuanlan.zhihu.com/p/98843447?utm_id=0