You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@rocketmq.apache.org by "wdragon1983@163.com" <wd...@163.com> on 2017/07/04 00:18:48 UTC

回复: Re: rocketmq 顺序消息的问题

你的意思 普通消费顺序 就是 保证生产者 - queue - 消费者是一对一对一的关系。严格消息顺序 是要整个topic只有 一个queue。不能并行消费?
下面文档上面的缺陷 


指的是 普通消息顺序的缺陷了?



wdragon1983@163.com
 
发件人: Zhanhui Li
发送时间: 2017-07-03 20:35
收件人: users
主题: Re: rocketmq 顺序消息的问题
所谓的"普通顺序消息”, 指的是保持queue内的消息的先后顺序, 学术中, 一般称为”偏序”: https://zh.wikipedia.org/zh-hans/%E5%81%8F%E5%BA%8F%E5%85%B3%E7%B3%BB 发送偏序消息的话, 需要producer自己做好消息和queue的对应关系映射, Producer有send的重载方法, 接受MessageQueueSelector.
所谓”严格顺序”, 指的是全局有序, 这样就要求在同一时刻, 只有一个queue在服务.
不论哪种顺序, 如果使用Push的方式消费, 都要使用MessageListenerOrderly 这个接口.

普通消息, 就是发送和订阅都不要求顺序性.

RocketMQ的事务消息, 确实如你所讲, 是发送者本地事务和发送消息构成的复合事务, 不是通常的分布式事务. 这种事务形态就要求, 消费者通过不断重试, 必须能够成功, 以达到最终一致. 



在 2017年6月29日,下午4:28,wdragon1983@163.com 写道:


你好 ,咨询一个 rocketmq 顺序消息的问题。

文档上面写到 


顺序消息
消费消息的顺序要同发送消息的顺序一致,在RocketMQ中,主要指的是局部顺序,即一类消息为满足顺序性,必须Producer单线程顺序发送,且发送到同一个队列,这样Consumer就可以按照Producer发送的顺序去消费消息。
普通顺序消息
顺序消息的一种,正常情况下可以保证完全的顺序消息,但是一旦发生通信异常,Broker重启,由于队列总数发生变化,哈希取模后定位的队列会变化,产生短暂的消息顺序不一致。
如果业务能容忍在集群异常情况(如某个Broker宕机或者重启)下,消息短暂的乱序,使用普通顺序方式比较合适。
. 严格顺序消息
顺序消息的一种,无论正常异常情况都能保证顺序,但是牺牲了分布式Failover特性,即Broker集群中只要有一台机器不可用,则整个集群都不可用,服务可用性大大降低。



 
  在应用过程中,怎么发送 消息 是普通顺序消息 怎么发送是严格顺序消息。


我的理解是  Producer单线程顺序发送。  消费端 使用 MessageListenerOrderly。 是严格顺序消息。 消费端使用MessageListenerConcurrently,线程池改为单线程模式。是 普通消息顺序。

请问是不是这样的情况?

或者上面两种实现 效果是一致的?

如果是一致的,那么怎么样 才是 普通消息顺序?





对于事物消息 。 rocketmq 是不是做到 , 生产者 本地事物 以及发送消息 被 消费者消费了,作为一个事物。  如果消费者消费了此消息。但是消费的时候出错了,生产者的本地事物依然是完成了。不会回滚。


wdragon1983@163.com