RocketMQ-Push模式下并发消费和顺序消费的区别

秒速五厘米 2022-02-25 08:34 650阅读 0赞
  1. 注册的消息监听不同
    并发消费:consumer.registerMessageListener(new MessageListenerConcurrently() {}
    顺序消费:consumer.registerMessageListener(new MessageListenerOrderly() {}
  2. 返回状态码不同

    并发消费:

    1. public enum ConsumeConcurrentlyStatus {
    2. // 消费成功
    3. CONSUME_SUCCESS,
    4. // 消费失败,稍后再从Broker拉取消息重新消费(重新拉取的消息是由Broker复制原消息的新消息)
    5. RECONSUME_LATER;
    6. }

    顺序消费:

    1. public enum ConsumeOrderlyStatus {
    2. // 消费成功
    3. SUCCESS,
    4. /**
    5. * Rollback consumption(only for binlog consumption)
    6. */
    7. @Deprecated
    8. ROLLBACK,
    9. /**
    10. * Commit offset(only for binlog consumption)
    11. */
    12. @Deprecated
    13. COMMIT,
    14. // 消费失败,挂起当前队列,挂起期间,当前消息重试消费,直到消息进入死信队列
    15. SUSPEND_CURRENT_QUEUE_A_MOMENT;
    16. }
  3. 消息重新消费的逻辑不同

    并发消费(重新消费的消息由Broker复制原消息,并丢入重试队列):
    消费者返回ConsumeConcurrentlyStatus.RECONSUME_LATER时, Broker会创建一条与原先消息属性相同的消息,并分配新的唯一的msgId,另外存储原消息的msgId,新消息会存入到commitLog文件中,并进入重试队列,拥有一个全新的队列偏移量,延迟5s后重新消费。如果消费者仍然返回RECONSUME_LATER,那么会重复上面的操作,直到重新消费maxReconsumerTimes次,当重新消费次数超过最大次数时,进入死信队列,消息消费成功。
    顺序消费(重新消费不涉及Broker):
    消费者返回ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT时,当前队列会挂起(此消息后面的消息停止消费,直到此消息完成消息重新消费的整个过程),然后此消息会在消费者的线程池中重新消费,即不需要Broker重新创建新的消息(不涉及重试队列),如果消息重新消费超过maxReconsumerTimes最大次数时,进入死信队列。当消息放入死信队列时,Broker服务器认为消息时消费成功的,继续消费该队列后续消息。

  4. 顺序消费设置自动提交

    1. public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs, ConsumeOrderlyContext context) {
    2. context.setAutoCommit(true);
    3. for (MessageExt msg : msgs) {
    4. // 省略...
    5. }
    6. }
  5. 涉及的主题不同
    RocketMQ有三种主题:NORMAL、RETRY、DLQ
    并发消费:NORMAL、RETRY、DLQ
    顺序消费:NORMAL、DLQ
  6. 顺序消费在拉取任务时需要在Broker服务器上锁定该消息队列

发表评论

表情:
评论列表 (有 0 条评论,650人围观)

还没有评论,来说两句吧...

相关阅读

    相关 rocketMq 顺序消费

    什么是顺序消费? 消息有序指的是一类消息消费时,能按照发送的顺序来消费。例如:一个订单产生了 3 条消息,分别是订单创建、订单付款、订单完成。消费时,要按照这个顺序消费才

    相关 RocktMQ顺序消费

    rocketmq以Topic来管理不同应用的消息。对于生产者而言,发送消息时,需要指定消息的Topic,对于消费者而言,在启动后,需要订阅相应的Topic,然后可以消费响应的消

    相关 06 MQ重复消费 顺序消费

    重复发送消息,怎么保证消息不被重复消费呢? 让消费消息的操作具有幂等性,一个操作具有幂等性是指这个操作任意多次执行所产生的影响与一次执行的影响相同。具体的实现有: 1.

    相关 并发模式(三)——生产者-消费模式

     生产者-消费模式,通常有两类线程,即若干个生产者线程和若干个消费者线程。生产者线程负责提交用户请求,消费者线程负责具体处理生产者提交的任务。两者之间通过共享内存缓冲去进行通信