RocketMq Consumer 最佳实践

RocketMq Consumer 最佳实践

翻译自RocketMQ官方文档

Consumer Group and Subscriptions 消费集群和订阅

第一件你应该关心的是不同的消费集群能独立的消费相同的topic,每一个都有自己的消费偏移量,需要确保在相同群组的consumer订阅了相同的的topic。

MessageListener

  • Orderly
    为了确保消费时按照顺序,这种consumer会锁住每一个MessageQueue。这会造成性能上的丢失,但是也是很有用的当你对顺序消息比较关心。不建议抛出异常,你可以返回ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT来代替抛出异常。

  • Concurrently
    这种consumer会并发的消费,为了高性能时可以使用这种。不建议抛出异常,你可以返回ConsumeConcurrentlyStatus.RECONSUME_LATER来代替抛出异常。

  • Consume Status
    对于MessageListenerConcurrently,你可以返回RECONSUME_LATER来告诉consumer你现在没有正确消费并且希望重新消费。你可以继续消费其他消息。
    对于MessageListenerOrderly,因为你关心顺序,你不能跳到下一条消息,但是你可以返回SUSPEND_CURRENT_QUEUE_A_MOMENT告诉consumer等一会。

  • Blocking
    建议不要阻塞Listener,因为这会锁住线程池,并且通常可能会导致消费进程停下。

Thread Number

consumer使用一个 ThreadPoolExecutor 来执行内部消费,你可以改变这个ThreadPoolExecutor通过两个方法setConsumeThreadMin or setConsumeThreadMax.

ConsumeFromWhere

当创建一个新的consumer集群,需要决定是否需要消费历史仍在Broker存在的消息。CONSUME_FROM_LAST_OFFSET将忽略所有的历史消息,并消费从那之后的消息。CONSUME_FROM_FIRST_OFFSET会消费所有存在于Broker的Message,你还可以选择使用CONSUME_FROM_TIMESTAMP来选择一个时间戳去决定消费从哪个时间戳之后的消息。

Duplication

很多情况可能会导致重复,比如

  • Producer重复发送(在FLUSH_SLAVE_TIMEOUT的场景)
  • Consumer 关闭没有及时更新Broker。
    需要在消费端做去重,比如在唯一主键。

猜你喜欢

转载自blog.csdn.net/doujinlong1/article/details/84141495