rocketmq顺序消息原理

什么是消息有序? 答:按照消息的发送的顺序来消费,比如生产者按序发送的A、B消息,那么消费者必须先消费A再消费B;这个顺序只能是分区顺序不是全局顺序,除非全局只有1个分区; 消息顺序问题的原因: 答:逻辑上的TOPIC分布在多个物理Broker上,

什么是消息有序?
答:按照消息的发送的顺序来消费,比如生产者按序发送的A、B消息,那么消费者必须先消费A再消费B;这个顺序只能是分区顺序不是全局顺序,除非全局只有1个分区;

消息顺序问题的原因:
答:逻辑上的TOPIC分布在多个物理Broker上,这时Producer往Topic发送数据,默认使用轮询策略,发送不同的消息到不同的Broker的分区中上,由于中间传输网络、Broker写入效率等原因,无法保障Producer先发送的数据,一定在Borker中的先写入的。 对于Consumer而已,他的消费队列是肯定先进先出的,一个Consumer可能会对于多条Queue;因此这就涉及到了分布式系统中的顺序发送和顺序消费问题

顺序消息的类型有?
答:顺序消息(FIFO消息)是MQ提供的一种严格按照顺序发布合消费的数据类型。顺序消息有两部分:顺序发送和顺序消费;顺序消息包含两种类型:分区顺序、全局顺序;
分区顺序:一个Partition内的所有消息按照先进先出的顺序发送和消费;
全局顺序:一个Topic内的所有消息按照先进先出的顺序发送和消费;

如何保证消息顺序?
答:消息顺序需要有三个阶段去保障

  1. 消息发送时保持顺序:有顺序需求的消息A和B,使用相同的生产者以先A后B的同步顺序的方式发送
    —业务层面实现
  2. 消息存储时保持跟发送时一样的顺序:在同一线程中被发送的A和B消息,在存储位置上保证A在B位置之前;
    —MQ自身实现
  3. 消息消费时保持跟存储、发送时一样的顺序:消费时按照先A后B的顺序处理;
    –=业务层面实现

在这里插入图片描述
RocketMQ顺序消息的实现,生产者端
答:
1 . Producer端要做的就是将顺序需求的消息,按顺序发送至同一分区。通过MessageQueueSelector获取指定的分区,然后发送数据
2. 生产者给每组消息(a、b、c需要保证顺序需求的一组消息)设定一个ID,组内消息的ID一样,根据ID %/ Size取模;获取MessageQueueSelector中的分区,通过组内消息一致的ID可以保证组内消息在同一个分区中。核心思想就是将同一组消息都放到相同队列中,这样队列中的消息肯定是顺序的了

RocketMQ顺序消息的实现,消费者端
答:
1 . 消费者通过MessageListenerOrderly实现;不论1个消费者对应1个队列还是多个队列,都可以保证取出消息是顺序的。

知秋君
上一篇 2024-09-04 14:12
下一篇 2024-09-04 13:48

相关推荐