1. 概念
- 用户对于同一操作发起的一次请求或者多次请求的结果是一致的,比如在mysql数据当中的乐观锁就可以用来保障幂等性。
- 在业务高峰期最容易产生消息重复消费问题,比如当消费者消费完消息时,在给生产者返回ack时由于网络中断,导致生产者未收到确认信息,该条消息就会重新发送并被消费者消费,但实际上该消费者已成功消费了该条消息,这就造成了重复消费。而幂等性,即消息不会被多次消费,即使我们收到了很多一样的消息。
2. 解决方案:唯一ID+指纹码
- 在消费者消费前先去数据库查询这条消息的指纹码标识是否存在,没有就执行insert操作,如果有就代表已经被消费了,就无需任何处理
- 核心思想:数据库主键id去重
- 唯一ID:业务表的主键id
- 指纹码:为了区别每次正常操作的码,每次操作时生成指纹码;可以用时间戳+业务编号或者标志位(具体视业务场景而定)
3. 优劣势
- 优势:实现简单
- 劣势:高并发场景下有数据库写入瓶颈(解决方案:根据ID进行分库分表算法路由)