在说到消息中间件的时候,我们通常都会谈到一个特性:消息的顺序消费问题。这个问题看起来很简单:Producer发送消息1, 2, 3。。。 Consumer按1, 2, 3。。。顺序消费。
但实际情况却是:无论RocketMQ,还是Kafka,缺省都不保证消息的严格有序消费!
这个特性看起来很简单,但为什么缺省他们都不保证呢?
“严格的顺序消费”有多么困难
下面就从3个方面来分析一下,对于一个消息中间件来说,”严格的顺序消费”有多么困难,或者说不可能。
发送端
发送端不能异步发送,异步发送在发送失败的情况下,就没办法保证消息顺序。
比如你连续发了1,2,3。 过了一会,返回结果1失败,2, 3成功。你把1再重新发送1遍,这个时候顺序就乱掉了。
存储端
对于存储端,要保证消息顺序,会有以下几个问题:
(1)消息不能分区。也就是1个topic,只能有1个队列。在Kafka中,它叫做partition;在RocketMQ中,它叫做queue。 如果你有多个队列,那同1个topic的消息,会分散到多个分区里面,自然不能保证顺序。
(2)即使只有1个队列的情况下,会有第2个问题。该机器挂了之后,能否切换到其他机器?也就是高可用问题。
比如你当前的机器挂了,上面还有消息没有消费完。此时切换到其他机器,可用性保证了。但消息顺序就乱掉了。
要想保证,一方面要同步复制,不能异步复制;另1方面得保证,切机器之前,挂掉的机器上面,所有消息必须消费完了,不能有残留。很明显,这个很难!!!
接收端
对于接收端,不能并行消费,也即不能开多线程或者多个客户端消费同1个队列。
总结
从上面的分析可以看出,要保证消息的严格有序,有多么困难!
发送端和接收端的问题,还好解决一点,限制异步发送,限制并行消费。但对于存储端,机器挂了之后,切换的问题,就很难解决了。
你切换了,可能消息就会乱;你不切换,那就暂时不可用。这2者之间,就需要权衡了。
业务需要全局有序吗?
通过上面分析可以看出,要保证一个topic内部,消息严格的有序,是很困难的,或者说条件是很苛刻的。
那怎么办呢?我们一定要使出所有力气、用尽所有办法,来保证消息的严格有序吗?
这里就需要从另外一个角度去考虑这个问题:业务角度。正如在下面这篇博客中所说的:
http://www.jianshu.com/p/453c6e7ff81c
实际情况中:
(1)不关注顺序的业务大量存在;
(2) 队列无序不代表消息无序。
第(2)条的意思是说:我们不保证队列的全局有序,但可以保证消息的局部有序。
举个例子:保证来自同1个order id的消息,是有序的!
下面就看一下在Kafka和RocketMQ中,分别是如何对待这个问题的:
Kafka中:发送1条消息的时候,可以指定(topic, partition, key) 3个参数。partiton和key是可选的。
如果你指定了partition,那就是所有消息发往同1个partition,就是有序的。并且在消费端,Kafka保证,1个partition只能被1个consumer消费。
或者你指定key(比如order id),具有同1个key的所有消息,会发往同1个partition。也是有序的。
RocketMQ: RocketMQ在Kafka的基础上,把这个限制更放宽了一步。只指定(topic, key),不指定具体发往哪个队列。也就是说,它更加不希望业务方,非要去要一个全局的严格有序。
关键点:这个放开,其实牵涉到一个更大的问题。就是RocketMQ和Kafka在底层存储上面的重大差异。这个我在上1篇,”拨乱反正“”续篇中,有过介绍。
后面在源码分析序列中,会进一步分析这个问题。
关于“消息顺序”这个问题,就讨论到此为止。
原文:https://blog.csdn.net/chunlongyu/article/details/53977819
相关推荐
- **文件系统存储**:如Kafka、RocketMQ和RabbitMQ,通过将消息刷盘到本地文件系统实现高吞吐量的持久化。这种方式高效、可靠,但依赖于磁盘稳定性。 - **关系型数据库**:如ActiveMQ使用MySQL,但在高并发和大...
- **顺序消费**:确保消息按照特定顺序被处理。 - **集群消费**:多消费者共享消息,提高消费效率。 - **广播消费**:每个消费者都收到所有消息,适用于全量同步场景。 3. **RocketMQ的事务消息**: - 通过两...
当Broker的Buffer达到饱和时,RocketMQ 可能会采取类似CORBA Notification规范中的策略,如拒绝新事件、按特定策略丢弃已有的消息,例如按照时间顺序、优先级顺序或过期时间顺序等。这些策略旨在保持系统的正常运行...
6. ** 消息的顺序性 **:RocketMQ支持顺序消息,通过特定的队列分配策略和发送方式,保证消息的顺序消费。 7. ** 消息重复与幂等性 **:理解如何处理消息重复的问题,以及如何设计消费者的幂等性,确保即使消息重复...
3. **顺序消息**:RocketMQ 在特定场景下可以保证消息的全局顺序,适合对消息顺序有严格要求的应用。 4. **分布式事务协调**:RocketMQ 使用 GroupOffset 和 BrokeOffset 实现消费者组的事务协调,确保消息的正确...
本篇文章将深入探讨四种常用的消息中间件:RabbitMQ、ActiveMQ、RocketMQ和Kafka,以及它们在实际应用中的特点和使用经验。 首先,RabbitMQ是一款基于AMQP(Advanced Message Queuing Protocol)协议的开源消息...
8. **顺序消息**:RocketMQ支持全局顺序和局部顺序消息,保证消息按照特定顺序消费,这对于某些业务场景(如日志记录、库存更新)至关重要。 9. **高可用与容灾**:RocketMQ通过主备切换、镜像复制等方式保证服务的...
- **消息重试**:处理消息消费失败的策略,包括顺序和无序消息。 - **死信队列**:处理无法正常消费的消息。 - **消费幂等**:防止重复消费同一消息。 - **消息堆积**:分析原因及优化策略。 - **消息查询**:...
在技术选型方面,Kafka与其他消息队列如RocketMQ、ActiveMQ、RabbitMQ等存在一些差异,每个产品都有各自的特点和适用场景,这需要根据实际业务需求来选择。 在编程模型方面,Kafka支持流式处理,开发者可以利用解释...
涵盖消息存储、高可用机制、消息投递、重试、死信队列、消费幂等、消息堆积、查询、Rebalance和源码分析等多个方面,详细讲解了RocketMQ的高级特性和优化策略。 **总结** RocketMQ作为一款强大的消息中间件,提供...
spring-kafka中提供了多种消息监听器容器和消息生产者,支持同步和异步消息的生产和消费。此外,还可以使用webflux集成Kafka,以响应式的方式构建数据管道,适用于高并发的场景。 集群搭建是Kafka作为分布式消息...
RabbitMQ、RocketMQ、Kafka、ActiveMQ 消息中间件常见的面试题目 了解消息中间件的使用场景是非常重要的,面试官可能会问你为什么使用消息队列,消息队列都有哪些使用场景,然后你项目里具体是什么场景,说说你在这...
- **消息有序性**:通过分区和顺序消费策略,保证特定消息的顺序处理。 - **消息堆积**:通过调整队列容量、消费者数量及负载均衡策略,避免消息积压。 5. **RocketMQ与Kafka对比** - **事务消息**:RocketMQ...
深入学习 RocketMQ 还包括了解其高可用策略(如主从复制、集群部署)、消息的顺序性保证、事务消息、延迟消息、死信消息等特性。通过实践操作和理解这些概念,你可以熟练地运用 RocketMQ 解决实际项目中的问题。
- **RocketMQ**则因其支持严格的消息顺序、亿级消息堆积能力等特点,在订单处理、交易确认、充值、消息推送等领域有着广泛的应用。 下面将进一步探讨RocketMQ的特性及其应用场景。 #### 三、RocketMQ的关键特性 ...
一致性问题**:消息的顺序性、丢失和重复可能导致一致性问题。 ### 1.5 MQ产品比较 - **ActiveMQ**:基于Java,具有较高的成熟度,适合处理万级数据吞吐。 - **RabbitMQ**:采用Erlang实现,处理速度快,适用于万...
- 接收方:验证消费者能否正常接收消息,包括批量消费、顺序消费、广播消费等模式,以及消费的幂等性,避免重复消费。 2. **消息可靠性**: - 消息确认:测试ACK机制,确保生产者接收到消息成功投递的确认,同时...
此外,RocketMQ还支持消息顺序、事务消息、消息回溯、消息过滤、消息重试、消息确认(ACK)等多种特性,为复杂分布式系统提供了强大的消息支撑能力。在面试中,理解这些核心概念和技术细节对于展示你的RocketMQ理解...
顺序消息处理是RocketMQ的一个重要特性,它能够确保消息按照特定的顺序被处理,这对于某些业务场景尤为重要。顺序消息的主要挑战在于如何平衡顺序性和性能: 1. **顺序消息的缺陷**: - 无法充分利用集群的...