直接来正确的思考方式:不管如何,消息重复问题不可避免,消费端直接就想想收到了重复的消息怎么办就行了。那自然就引出了第一个要解决的问题,就是消费端先考虑怎么知道两个消息是重复的?那又自然引出了两种解决办法。第一种,消息体里面放一个 ID,消费端自己根据这个 ID 来判断是不是同一个消息。第二种,mq 提供一种机制,可以查询一条消息是否已经发送过。两种方式,一种交给自己,一种交给别人,搞定了消息是不是重复的这个判断问题。接下来,解决如果重复了怎么办?那这个问题就十分业务了,可以放飞自我回答,但也分两种思想。第一种,业务端不在乎,重复就重复了,比如一篇文章的阅读数,多一个少一个,不在乎。第二种,各种办法实现幂等,比如数据库弄唯一标识,重复插入就直接报错。或者单独弄一张表,把消息唯一标识存起来,来一条消息时先判断是否在这个表里,如果已经存在了就什么都不做。其实,也是一种交给业务逻辑自己处理,一种交给其他人比如 mysql 处理。