消息中间件是无法保证消息重复消费,所以只能从业务上来保证消费不重复消费,在消费端保证接口的幂等性。有以下两种方案。
- 使用redis加锁机制,生产者向中间价发送消息的时候会生成一个唯一的id,将id作为key使用setnx保存到redis中去。在消费端在去setnx看返回值,消费端代码如下:
//Redis中操作,判断是否已经操作过 TODO
boolean flag = jedis.setNX(key);
if(flag){
//消费
}else{
//忽略,重复消费
}
- 数据库去重表 ,某个字段使用Message的key做唯一索引