一、如何保证顺序消费

        解决方案:同一语义的消息放入同一个队列。

        实现方式:重写MessageQueueSelector中send方法。将消息放入同一个队列,来保证顺序消费。

        如何放入同一队列:例如,同一订单的N个消息需要保证顺序,则可以根据订单号,Hash取模确定发送到同一个队列。

二、如何避免重复消费

        保证消费幂等,即消费多次对各方无影响

三、如何实现分布式事务

        方案一:两阶段提交和事务状态回查

rocketmq的inetaddressvalidator找不到 rocketmq常见问题_rocketMQ

        

  • Half Message,半消息

        暂时不能被 Consumer消费的消息。Producer已经把消息发送到 Broker端,但是此消息的状态被标记为不能投递,处于这种状态下的消息称为半消息。事实上,该状态下的消息会被放在一个叫做 RMQ_SYS_TRANS_HALF_TOPIC的主题下。

        当 Producer端对它二次确认后,也就是 Commit之后,Consumer端才可以消费到;那么如果是Rollback,该消息则会被删除,永远不会被消费到。

  • 事务状态回查

        我们想,可能会因为网络原因、应用问题等,导致Producer端一直没有对这个半消息进行确认,那么这时候 Broker服务器会定时扫描这些半消息,主动找Producer端查询该消息的状态。当然,什么时候去扫描,包含扫描几次,我们都可以配置。简而言之,RocketMQ事务消息的实现原理就是基于两阶段提交和事务状态回查,来决定消息最终是提交还是回滚的。        

        方案二:通过补偿方式,保证最终一致性。并且如果我们的系统不追求强一致性,那么最常用的还是最终一致性方案

四、如何处理消息堆积

        消息堆积,无外乎两种情况或者是配置错误:

        1. 生产者的生产速度骤增,比如生产者的流量突然骤增
        2. 消费速度变慢,比如消费者实例 IO 阻塞严重或者宕机

        所以,要么降低发送速度,要么增加实例加快消费速度

五、如何重新消费

        重置位点:

        通过调整时间,重置至某个时间点,开始重新消费

        重置位点,切记考虑消息重复消费问题。