MQ消息幂等性

出现非幂等性的情况

  1. 生产者已把消息发送到 mq,在 mq 给生产者返回 ack 的时候网络中断,故生产者未收到确定信息,生产者认为消息未发送成功,但实际情况是,mq 已成功接收到了消息,在网络重连后,生产者会重新发送刚才的消息,造成 mq 接收了重复的消息。
  2. 消费者在消费 mq 中的消息时,mq 已把消息发送给消费者,消费者在给 mq 返回 ack 时网络中断,故 mq 未收到确认信息,该条消息会重新发给其他的消费者,或者在网络重连后再次发送给该消费者,但实际上该消费者已成功消费了该条消息,造成消费者消费了重复的消息;

解决办法

  1. mq 接收生产者传来的消息

    mq 内部会为每条消息生成一个全局唯一、与业务无关的消息 id,当 mq 接收到消息时,会先根据该 id 判断消息是否重复发送,mq 再决定是否接收该消息。

  2. 消费者消费 mq 中的消息

    也可利用 mq 的该 id 来判断,或者可按自己的规则生成一个全局唯一 id,每次消费消息时用该 id 先判断该消息是否已消费过。