RabbitMQ 如何保证消息幂等
贫贱不能移的意思就是,穷就好好在家呆着,哪儿也别去。
什么是幂等?
幂等(idempotent、idempotence)是一个数学与计算机学概念。简单的来说就是一个操作多次执行产生的结果与一次执行产生的结果一致。
在高并发的情况下,会有大量的消息到达MQ,消费端需要监听大量的消息。这样的情况下,难免会出现消息的重复投递,网络闪断等等。如果不去做幂等,则会出现消息的重复消费。消费端实现幂等性,就意味着,我们的消息永远不会被消费多次,即使我们收到了多条一样的消息,也只会执行一次。
出现的原因:
- Broker 发送应答消息的时候,消息未到达生产者
- 消费者在发送应答的时候,消费者挂掉了
解决方案:构建唯一标识的方案
实现方案
方案一:唯一ID+指纹码机制(唯一ID + 指纹码机制,利用数据库主键去重,保证唯一性!)
好处:实现简单
坏处:高并发下有数据库写入的性能瓶颈
方案二:Redis 原子特性实现
最简单使用Redis的自增。
好处:实现简单,实现唯一ID
坏处:引入新的组件,可靠性方案需要保障
方案三:利用 twitter 开源的 snowflake-(雪花算法)
snowflake 是 twitter 开源的一个分布式的 ID 的生成算法,结果是一个 long 的ID,使用 41bit 作为毫秒数,10bit 作为机器 ID(5个 bit 是数据中心,5个 bit 是机器 ID) 12 bit 作为毫秒内的流水号(每个节点每毫秒可以产生 2^12 = 4096 个 ID)最后是一个符号位
好处:不依赖数据库和其他的中间件,且性能尚可
坏处:是有依赖时间的,如果各个机器的失重不同步就会出现不适全局递增的情况