MQ常用的使用场景十分广泛:解耦、削峰、异步等,在实际的应用中,经常也会牵扯到吞吐量、消息可靠性、消息一致性、业务幂等(重复消费)、顺序消费等问题,本文将对消息中间件做初步探讨。
主流MQ对比
先贴一张网上流传的对比表格:
网图作为参考,以现阶段技术发展来说明:
ActiveMQ
:支持JMS规范、支持事务、支持XA协议,没有生产大规模支持场景、官方维护越来越少
RabbitMQ
:由 erlang语言开发、性能好、高并发,支持多种语言,社区、文档方面有优势,erlang语言不利于java程序员的二次开发,依赖开源社区的维护和升级,需要学习AMQP协议、学习成本相对较高
kafka
:高性能,高可用,生产环境有大规模使用场景,单机容量有限(超过64个分区响应明显变长)、社区更新慢,单机吞吐量已经达到百万级(异步打包发送、零拷贝机制)
RocketMQ
:java实现,方便二次开发、设计参考了kafka,高可用、高可靠,社区活跃度一般、支持语言较少,单机吞吐量已经达到十万级
进一步对比
RabbitMQ:特有routingKey和bindingKey在业务作为路由规则对消息就行分发。
RocketMQ:特有Group消息组(一个组可以订阅多个Topic),Tag消息标签(表示消息的第二级类型),还有messageId可以作为幂等的处理依据。
Kafka:集群极赖Zookeeper,存储broke(topic)、consumer信息
问题探讨
如果保证消息可靠
ACK机制,集群中的ISR机制,手工提交Offset,使用事务消息(Half消息)
如何做消息一致性
强一致性:生产者100%投递(事务消息),消费者Exactly Once控制;
最终一致性:大多数还是选择借助数据库持久化消息。
如何实现消息幂等
中间件:提供messageId
业务实现:业务判断唯一ID
如何顺序消费消息
中间件:顺序队列
业务实现:生产者将消息放入一个队列,消费者只订阅这个队列。
原文链接:https://www.jianshu.com/p/0ffd69346226