赞
踩
消息队列中间件(MQ)是不同系统之间消息传递,异步通信的常见组件,RabbitMQ、Kafka和RocketMQ是目前业界常见的3种消息中间件,本文重点阐述了他们特性差异、架构设计和处理常见问题的方案。
RabbitMQ适合于中小规模的使用场景,是目前业界使用最广泛的一种MQ,其完全实现了AMQP的协议,实现了非常丰富的消息可靠性的保障机制,和其他MQ相比,其在可靠性方面是最强的,但也正是由于可靠性方面实现机制过于沉重,导致其吞吐量并不高,在生产环境经常会出现消息积压的问题。
Kafka适合于实时流处理的使用场景,在大数据处理领域经常见到,可以用来处理海量的日志数据和IoT海量数据采集,由于其基于文件顺序读写的存储架构和基于zero-copy的IO处理策略,使得他的吞吐量非常之高,性能非常之好,能够达到百万级别的数据处理吞吐量,其可靠性保障主要是基于多副本这种策略,所以可靠性方面明显不如RabbitMQ。
RabbitMQ | Kafka | RocketMQ | |
---|---|---|---|
使用场景 | 中小规模的使用场景 | 实时流处理、海量日志数据处理 | 性能均衡,优势在分布式事务场景 |
可靠性 | 高,AMPQ协议保障 | 低,基于多副本机制保障 | 中等,基于事务的保障 |
吞吐量 | 低,万级别 | 高,基于顺序读写的存储架构,百万级别 | 中等,十万级别 |
时效性 | 毫秒级别 | 毫秒级别 | 毫秒级别 |
优点 | 可靠性非常高 | 吞吐量非常大,性能非常好,集群高可用 | 性能和功能全面,擅长分布式事务方向 |
缺点 | 吞吐量比较低,消息积累会影响性能,基于erlang开发不好定制 | 数据可靠性保障较低,会存在数据丢失 | 客户端只支持Java,官方文档支持较少 |
void basicAck(long deliveryTag, boolean multiple)//确认消息
void basicNack(long deliveryTag, boolean multiple, boolean requeue)//拒绝消息
void basicRecover(boolean requeue)//重发消息
RocketMQ
和kafka类似。
总结:RabbitMQ相比Kafka和RocketMQ,他有跟丰富的可靠性保障机制,包括保障生产者消息的可靠发送、数据的持久化还有消费者的可靠消费。
流控措施主要是为了解决消息积压的问题,如果生产者生成消息速率过快,而消费者消费消息的速率过慢,则会在MQ中形成消息挤压,如果不及时处理就会造成MQ服务不可用或者OOM等问题。
/**
* prefetchSize:服务器传送最大内容量(以八位字节计算),如果没有限制,则为0
* prefetchCount:服务器每次传递的最大消息数,如果没有限制,则为0;
* global:如果为true,则当前设置将会应用于整个Channel(频道)
**/
void basicQos(int prefetchSize, int prefetchCount, boolean global)
总结:流控措施的几种方式主要包括:(1)扩大下游消费者的消费速率和流量;(2)增大消费者的数量,扩大消费能力;(3)调整MQ的副本或分区数,发挥下游消费者的最大消费能力;(4)拉取或推送模式的权衡。
重复性消费问题主要需要解决是幂等性问题,对于重复下发的消息也能保障唯一性消费。
总结:在MQ中处理重复消费的问题主要的思路有:(1)通过给消息加唯一性标识来过滤已经消费的消息,对于像RocketMQ这种存在Messeage ID的,处理起来就比较简单,就只需要对Messeage ID去重即可,对于像RabbitMQ和kafka这种可以将消息状态保存在数据库或缓存中进行唯一性去重;(2)消息确认机制,就是对于消息的消费会主动上报的,每次消费完就会进行确认,在RabbitMQ中是会恢复ACK标识,在kafka中是会恢复offset标识。
本文由博客一文多发平台 OpenWrite 发布!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。