问题:
image.png
//检查是否已经有消费记录(不分是否已经消费)
boolean b = idempotentService.idempotentCheck(idempotent);
if(b){
//消费消息
this.handleMessage(t);
//更新消费记录为已消费状态
idempotentService.updateExpenseStatusToAlreadyExpense(k.getMsgId());
}
1.每次消费的时候,某消费组中的消费队列和消费者绑定了关系(确定),那么他再次重试的时候,还是走原来的消费者吗?(不知道,得看源码)
- 如果走原来的,那么本地锁就可以满足,如果是投放到其他的消费者或不定,并且,重试的间距很小(一般应该是前一个确认消费或者没有消费才会投递二次吧, 这个问题是,二次重试的条件是什么?是超时时间,还是某种确认机制【消费或未消费。】),如果后一次的消费都需要前一次某种确认机制后才发,那么同一个队列的同一个消息重试并发是不存在的。如果不是某种机制,那么还是需要分布式锁。
3.如果producer投递了不同的消息到不同的broker,或同样的broker(同一个监听者),那么这个时候会不会出现并发。即使两个消息的msgID都不一样,那么也会重复消费的。所以这种时候是需要分布锁的,或者其他什么锁。
以上所有问题都不确认,待研究完源码再定结论。