几种常用消息中间件MQ对比

MQ常用的使用场景十分广泛:解耦、削峰、异步等,在实际的应用中,经常也会牵扯到吞吐量、消息可靠性、消息一致性、业务幂等(重复消费)、顺序消费等问题,本文将对消息中间件做初步探讨。

主流MQ对比

先贴一张网上流传的对比表格:


主流MQ对比

网图作为参考,以现阶段技术发展来说明:
ActiveMQ:支持JMS规范、支持事务、支持XA协议,没有生产大规模支持场景、官方维护越来越少
RabbitMQ:由 erlang语言开发、性能好、高并发,支持多种语言,社区、文档方面有优势,erlang语言不利于java程序员的二次开发,依赖开源社区的维护和升级,需要学习AMQP协议、学习成本相对较高
kafka:高性能,高可用,生产环境有大规模使用场景,单机容量有限(超过64个分区响应明显变长)、社区更新慢,单机吞吐量已经达到百万级(异步打包发送、零拷贝机制)
RocketMQ:java实现,方便二次开发、设计参考了kafka,高可用、高可靠,社区活跃度一般、支持语言较少,单机吞吐量已经达到十万级

进一步对比

RabbitMQ:特有routingKey和bindingKey在业务作为路由规则对消息就行分发。


RabbitMQ

RocketMQ:特有Group消息组(一个组可以订阅多个Topic),Tag消息标签(表示消息的第二级类型),还有messageId可以作为幂等的处理依据。


RocketMQ

Kafka:集群极赖Zookeeper,存储broke(topic)、consumer信息


Kafka

问题探讨

如果保证消息可靠

ACK机制,集群中的ISR机制,手工提交Offset,使用事务消息(Half消息)

如何做消息一致性

强一致性:生产者100%投递(事务消息),消费者Exactly Once控制;
最终一致性:大多数还是选择借助数据库持久化消息。

如何实现消息幂等

中间件:提供messageId
业务实现:业务判断唯一ID

如何顺序消费消息

中间件:顺序队列
业务实现:生产者将消息放入一个队列,消费者只订阅这个队列。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容