介绍
用户对同一操作发起的一次请求或多次请求的结果是一致的。
方式用户重复提交。
也就是消息被重复消费了。
消费者在消费mq中的消息时,mq已经把消息发送给消费者,消费者在给mq返回ack时网络中断,故mq未收到确认消息,该条消息会重新发给其他消费者,或者在网络重连后再次发送给该消费者,但实际上该消费者已经成功消费了该条消息,造成消费者消费了重复的消息。
解决思路
一般使用全局id,或者写一个唯一标识比如:时间戳, UUID, 按自己的规则生成一个全局唯一id。每次消费消息时用该id判断该消息是否被消费过。
消费端的幂等性保证
在海量订单生成的业务高峰期,生产端有可能会重复发生了消息,这时候消费端就要实现幂等性,这就意味着我们的消息永远不会被重复消费多次,即使我们收到了一样的消息。
业界主流的幂等性操作有两种:
1.唯一Id+指纹码机制。
指纹码:我们的一些规则或者时间戳加别的服务给到的唯一信息码,它并不一定是我们系统生成的,基本是我们的业务规则拼接而来,但是一定保证唯一性,然后利用查询语句进行判断这个id是否存在于数据库中,优点就是实现简单的一个拼接,然后查询判断是否重复。缺点是在高并发时,如果是单个数据库就会有写入性能瓶颈,当然可以采用分库分表提升性能,但也不是最佳的推荐方式。
2.利用redis的原子性去实现。
利用redis的setnx命令,天然具有幂等性,从而实现不重复消费。