1消费过程幂等
RocketMQ无法避免消息重复(Exactly-Once),所以如果业务对消费重复非常敏感,务必要在业务层面进行去重处理。
可以借助关系数据库进行去重。首先需要确定消息的唯一键,可以是msgld,也可以是消息内容中的唯一标识字段,例如订单ld等。
在消费之前判断唯一键是否在关系数据库中存在。如果不存在则插入,并消费,否则跳过。(实际过程要考虑原子性问题,判断是否存在可以尝试插入,如果报主键冲突,则插入失败,直接跳过)
msgld一定是全局唯一标识符,但是实际使用中,可能会存在相同的消息有两个不同msgld的情况(消费者主动重发、因客户端重投机制导致的重复等),这种情况就需要使业务字段进行重复消费。
2消费速度慢的处理方式
提高消费并行度
绝大部分消息消费行为都属于10密集型,即可能是操作数据库,或者调用RPC,这类消费行为的消费速度在于后端数据库或者外系统的吞吐量。
通过增加消费并行度,可以提高总的消费吞吐量,但是并行度增加到一定程度,反而会下降。
所以,应用必须要设置合理的并行度。如下有几种修改消费并行度的方法:
●同一个ConsumerGroup下,通过增加Consumer实例数量来提高并行度(需要注意的是超
过订阅队列数的Consumer实例无效)。可以通过加机器,或者在已有机器启动多个进程的
方式。
●提高单个Consumer的消费并行线程,通过修改参数consumeThreadMin、consumeThreadMax实现。