所以用orderly消费,需要特别注意不要无限制重试的问题 2、上面讨论的是每批取出的消息数量是1的情况,如果每批取出数量大于1,SUSPEND_CURRENT_QUEUE_A_MOMENT这个状态代表的是当前批次的所有消息消费不成功,达到最大重试次数后,发送回重试队列,如果其中有一条没有发送成功,整批消息本地重试, 这种设计在极端情况下,也...
顺序消费目前也是两个状态:SUCCESS和SUSPEND_CURRENT_QUEUE_A_MOMENT。SUSPEND_CURRENT_QUEUE_A_MOMENT意思是先暂停消费一下,过SuspendCurrentQueueTimeMillis时间间隔后再重试一下,而不是放到重试队列里。 publicenumConsumeOrderlyStatus{/** * Success consumption */SUCCESS,/** * Rollback consumption(only for binl...
肯定是不能的,如果使用重试机制是无法保证顺序性的。 RocketMQ提供了另一个状态,SUSPEND_CURRENT_QUEUE_A_MOMENT,意思是先等一会,再接着处理这批消息,而不是把这批消息放入重试队列里去处理其他消息。 所以我们只要返回这个状态就可以了。 总结 好了,到这里关于RocketMQ重复消费和乱序问题的产生原因和解决方案我们就...
肯定是不能的,如果使用重试机制是无法保证顺序性的。 RocketMQ提供了另一个状态,SUSPEND_CURRENT_QUEUE_A_MOMENT,意思是先等一会,再接着处理这批消息,而不是把这批消息放入重试队列里去处理其他消息。 所以我们只要返回这个状态就可以了。 总结 好了,到这里关于RocketMQ重复消费和乱序问题的产生原因和解决方案我们就...
return ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT; 2. return null; 3. 抛出异常 DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("retry_consumer_grp_01"); consumer.setNamesrvAddr("127.0.0.1:9876"); consumer.subscribe("tp_demo_04", "*"); ...
*/SUSPEND_CURRENT_QUEUE_A_MOMENT; } 如果消费消息时发生异常,则结果默认为SUSPEND_CURRENT_QUEUE_A_MOMENT。 publicbooleanprocessConsumeResult(finalList<MessageExt> msgs,finalConsumeOrderlyStatus status,finalConsumeOrderlyContext context,finalConsumeRequest consumeRequest ...
思考一个问题,如果consumer消费的时候失败了,我们返回重试,这时候消息的顺序就乱了,这种情况要如何处理呢? RocketMQ提供了SUSPEND_CURRENT_QUEUE_A_MOMENT状态,当返回这个状态后,MQ会暂停一段时间再消息,不会把消息放入重试队列。 延迟消息 RocketMQ提供了延迟消息的功能,非常方便。其实它的实现原理就是给延迟的消息新...
.SUSPEND_CURRENT_QUEUE_A_MOMENT == status) { log.warn("consumeMessage Orderly return not OK, Group: {} Msgs: {} MQ: {}", ConsumeMessageOrderlyService.this.consumerGroup, msgs, messageQueue); } long consumeRT = System.currentTimeMillis...
顺序消费:消费者将锁住消息队列,确保消息按照顺序一个一个的被消费掉,顺序消费会引起一部分性能损失。在消费消息的时候,如果出现异常,不建议直接抛出,而是应该返回SUSPEND_CURRENT_QUEUE_A_MOMENT这个状态,它将告诉消费者过一段时间后,会重新消费这个消息。
所以玩顺序消息时。consume消费消息失败时,不能返回reconsume——later,这样会导致乱序,应该返回suspend_current_queue_a_moment,意思是先等一会,一会儿再处理这批消息,而不是放到重试队列里。 (2)无须消息的重试 对于无序消息(普通、定时、延时、事务消息),当消费者消费消息失败时,您可以通过设置返回状态达到消息重试...