`
m635674608
  • 浏览: 5032274 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

分布式消息队列RocketMQ&Kafka -- 消息的“顺序消费”-- 一个看似简单的复杂问题

    博客分类:
  • MQ
 
阅读更多

在说到消息中间件的时候,我们通常都会谈到一个特性:消息的顺序消费问题。这个问题看起来很简单: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篇,”拨乱反正“”续篇中,有过介绍。

后面在源码分析序列中,会进一步分析这个问题。

关于“消息顺序”这个问题,就讨论到此为止。

 

http://m.blog.csdn.net/chunlongyu/article/details/53977819

分享到:
评论

相关推荐

    消息中间件的一点经验 rabbitmq、activemq、rocketmq、kafka-mq-research.zip

    本篇文章将深入探讨四种常用的消息中间件:RabbitMQ、ActiveMQ、RocketMQ和Kafka,以及它们在实际应用中的特点和使用经验。 首先,RabbitMQ是一款基于AMQP(Advanced Message Queuing Protocol)协议的开源消息...

    springboot 整合消息队列kafka(kafka-with-springboot.rar)

    Apache Kafka是一个分布式流处理平台,它允许我们处理和存储大量实时数据。Spring Boot简化了Java应用程序的开发,尤其是微服务架构。结合两者,我们可以构建出强大的消息传递解决方案。 首先,我们需要在Spring ...

    kafka-python-2.0.2.tar.gz

    在`kafka-python`中,可以通过创建一个`KafkaProducer`实例并调用其`send()`方法来发送消息: ```python from kafka import KafkaProducer producer = KafkaProducer(bootstrap_servers='localhost:9092') ...

    java开发kafka-clients所需要的所有jar包以及源码

    Apache Kafka是一个分布式流处理平台,用于构建实时数据管道和流应用。它提供了一个高吞吐量、低延迟的消息传递系统,可以处理大量实时数据。 2. **Kafka-clients**: Kafka-clients是Kafka的核心组件之一,它...

    kafka-clients-2.4.1-API文档-中文版.zip

    赠送jar包:kafka-clients-2.4.1.jar; 赠送原API文档:kafka-clients-2.4.1-javadoc.jar; 赠送源代码:kafka-clients-2.4.1-sources.jar; 赠送Maven依赖信息文件:kafka-clients-2.4.1.pom; 包含翻译后的API文档...

    分布式消息系统Kafka项目-生产者消费者代码实现(基于5台虚拟机完全分布式)

    本项目将探讨如何在基于5台虚拟机的环境中实现Kafka的完全分布式配置,以便构建一个高可用、高性能的消息传递平台。我们将重点关注生产者和消费者的代码实现,以及与Hadoop等大数据框架的集成。 Kafka是一个开源的...

    kafka-clients源码.zip

    3. **延迟消息**:虽然Kafka本身不支持延迟消息,但可以通过生产者API设置消息的延迟时间,结合`延时队列`实现类似功能。 三、连接与网络层 1. **连接管理**:`Selector`类负责网络I/O,包括连接、断开、重试等...

    kafka-clients-2.4.1-API文档-中英对照版.zip

    赠送jar包:kafka-clients-2.4.1.jar; 赠送原API文档:kafka-clients-2.4.1-javadoc.jar; 赠送源代码:kafka-clients-2.4.1-sources.jar; 赠送Maven依赖信息文件:kafka-clients-2.4.1.pom; 包含翻译后的API文档...

    flink-connector-kafka-0.10-2.11-1.10.0-API文档-中文版.zip

    赠送jar包:flink-connector-kafka-0.10_2.11-1.10.0.jar; 赠送原API文档:flink-connector-kafka-0.10_2.11-1.10.0-javadoc.jar; 赠送源代码:flink-connector-kafka-0.10_2.11-1.10.0-sources.jar; 赠送Maven...

    5、kafka监控工具Kafka-Eagle介绍及使用

    Apache Kafka 是一个分布式流处理平台,常用于构建实时的数据管道和应用。Kafka 提供了高吞吐量、低延迟的消息传递能力,是大数据领域中重要的消息队列(MQ)解决方案。Kafka-Eagle 是针对 Kafka 集群设计的一款高效...

    flink-connector-kafka-base-2.11-1.10.0-API文档-中文版.zip

    赠送jar包:flink-connector-kafka-base_2.11-1.10.0.jar; 赠送原API文档:flink-connector-kafka-base_2.11-1.10.0-javadoc.jar; 赠送源代码:flink-connector-kafka-base_2.11-1.10.0-sources.jar; 赠送Maven...

    kafka-clients-0.10.0.1-API文档-中文版.zip

    赠送jar包:kafka-clients-0.10.0.1.jar; 赠送原API文档:kafka-clients-0.10.0.1-javadoc.jar; 赠送源代码:kafka-clients-0.10.0.1-sources.jar; 赠送Maven依赖信息文件:kafka-clients-0.10.0.1.pom; 包含...

    kafka-manager 编译好的 可以直接使用

    这款工具旨在提供一个直观的界面,帮助管理员管理和监控Kafka集群,包括主题、消费者组、配置管理和故障排查等功能。在标题中提到的“kafka-manager 编译好的 可以直接使用”,意味着这是一个已经经过Sbt(Scala ...

    kafka-manager 最新版本 已经编译好,可直接使用

    它提供了一个用户友好的界面,使得Kafka集群的管理和监控变得更加直观和便捷。在本压缩包中,你获得的是kafka-manager的最新版本——1.3.3.18,这个版本已经预先使用Sbt(Scala Build Tool)完成了编译,用户可以...

    Kafka分布式消息队列的高性能研究.pdf

    Kafka是一种高吞吐量的分布式消息队列系统,它最初由LinkedIn开发,后来成为了Apache软件基金会的顶级项目。Kafka的主要设计目标是提供低延迟、高可扩展性和容错性的消息传递服务。在大数据处理场景中,Kafka常用于...

    kafka-manager-1.3.3.7.zip

    说明:kafka-manager 自己下载编译速度巨慢,此资源是编译好的 kafka-manager,版本是:kafka-manager-1.3.3.7(适用于较新的版本,kafka版本是kafka_2.11-2.0.1)。 安装配置说明: 1. 里头有个自己写的启动脚本,...

    高效部署分布式消息队列

    今天要给大家分享的是分布式消息中间件。消息中间件主要是实现分布式系统中解耦、异步消息、流量销锋、日志处理等...现在生产中用的最多的消息队列有Activemq,rabbitmq,kafka,rocketmq等。分布式消息队列学习必备

    一种分布式消息队列研究与测试.pdf

    在设计一个分布式消息队列系统时,需要考虑消息的持久化、集群管理、消息分区策略、负载均衡、故障恢复机制等多个方面。Kafka在这些方面做出了创新和优化,使其能够在大数据处理中发挥重要的作用。 总结来看,Kafka...

    kafka-python开发文档

    KafkaConsumer是kafka-python提供的一个高级消息消费者API,它与官方的Java客户端尽可能地相似。它支持通过Kafka broker的Group APIs实现完全的消费者组协调,需要Kafka 0.9+版本支持。KafkaConsumer的API和配置细节...

Global site tag (gtag.js) - Google Analytics