消费者最佳实践
一些对用户有用的提示。
消费者Group和订阅
首先应该注意的是,不同的消费群体可以独立消费同一个主题,并且每个消费群体都有自己的消费补偿。 请确保同一组中的每位消费者订阅相同的主题。
MessageListener
顺序(Orderly)
消费者将锁定每个MessageQueue,以确保它被依次消费。 这会导致性能下降,但在关心消息顺序时非常有用。 不建议抛出异常,您可以返回ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT。
并发
顾名思义,消费者将同时消费这些消息。 建议使用它来获得良好的性能。 不建议抛出异常,您可以返回ConsumeConcurrentlyStatus.RECONSUME_LATER。
消费状态
对于MessageListener而言,目前您可以返回RECONSUME_LATER来告诉消费者,您现在不能使用它,并希望稍后重新使用它。 然后你可以继续使用其他消息。 对于MessageListenerOrderly,由于您关心订单,您不能跳过消息,但可以返回SUSPEND_CURRENT_QUEUE_A_MOMENT告诉消费者等待一会儿。
阻塞
不建议阻塞Listener,因为它会阻塞线程池,并最终可能会停止消费过程。
线程数
消费者使用ThreadPoolExecutor来处理内部消费,因此您可以通过设置setConsumeThreadMin或setConsumeThreadMax来更改它。
ConsumeFromWhere
当一个新的消费Group 建立时,需要决定是否需要消费Broker中已经存在的历史消息。 CONSUME_FROM_LAST_OFFSET将忽略历史消息,并消费之后产生的任何东西。 CONSUME_FROM_FIRST_OFFSET将消费Broker中存在的所有消息。 您也可以使用CONSUME_FROM_TIMESTAMP消费在指定的时间戳之后产生的消息。
复制(Duplication)
许多情况下可能会导致重复,例如:
- 生产者重新发送消息(即,在FLUSH_SLAVE_TIMEOUT的情况下)
- 消费者关闭,一些补偿不及时更新给Broker 。
所以如果你的应用程序不能容忍重复,你可能需要做一些外部的工作来处理这个问题。 例如,您可以检查数据库的主键。