消息从生产到消费可以经历三个阶段:生产阶段、存储阶段和消费阶段。
在这三个阶段都存在消息可能丢失的情况。
幂等性:一个请求,不管重复来多少次,结果是不会改变的。
RabbitMQ、RocketMQ、Kafka等任何队列不保证消息不重复,如果业务需要消息不重复消费,则需要消费端处理业务消息要保持幂等性
//Redis中操作,判断是否已经操作过 TODO boolean flag = jedis.setNX(key); if(flag){ //消费 }else{ //忽略,重复消费 }
int num = jedis.incr(key); if(num == 1){ //消费 }else{ //忽略,重复消费 }
方式三:数据库去重表
设计一个去重表,某个字段使用Message的key做唯一索引,因为存在唯一索引,所以重复消费会失败
CREATE TABLE message_record
( id
int(11) unsigned NOT NULL AUTO_INCREMENT, key
varchar(128) DEFAULT NULL, create_time
datetime DEFAULT NULL, PRIMARY KEY (id
), UNIQUE KEY key
(key
) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
原文:https://www.cnblogs.com/guanyuehao0107/p/14060611.html