丁香人才网官方网站,开发公司五一节前安全生产工作部署会,网站地图怎样做,decorum wordpress使用消息队列#xff0c;我们肯定希望不丢消息#xff0c;也就是消息队列组件#xff0c;需要保证消息的可靠交付。消息交付的可靠性保障#xff0c;有以下三种承诺#xff1a;
最多一次#xff08;at most once#xff09;#xff1a;消息可能会丢失#xff0c;但绝…使用消息队列我们肯定希望不丢消息也就是消息队列组件需要保证消息的可靠交付。消息交付的可靠性保障有以下三种承诺
最多一次at most once消息可能会丢失但绝不会被重复发送。至少一次at least once消息不会丢失但有可能被重复发送。精确一次exactly once消息不会丢失也不会被重复发送。
默认是一般是 至少一次也就是 Broker 收到并成功提交消息并且 Producer 成功应答才会认为消息已经发送。
某些情况下比如网络波动等导致应答没有成功送达会导致 Producer 重试从而导致消息的重复发送。
这就要提到主角——幂等性 Producer 了。
幂等性比如数学中的乘法运算乘以 1 就是一个幂等操作。因为不管执行多少次乘法结果都是一样的。
幂等性 Producer 就是在向 Broker 发送数据时可以避免同个分区下的消息重复。
开启方式仅需指定 enable.idempotence 为 true
但是
有个很重要的一点它针对的是单个分区下的幂等而且是单个会话内的幂等也就是说如果进程重启就没办法保证幂等性了。
而幂等性的实现原理就得提到 ProducerID 和 SequenceNumber 了。
ProducerIDProducer 初始化会被分配一个唯一标识对客户端无感知重启会发生变化SequenceNumber对于每个主题和分区都对应一个从 0 开始单调递增的 SequenceNumber 值Broker 也会存储。
判断重复的逻辑原理就很简单了
通过 ProducerID 和 SequenceNumber去 Broker 查询队列 ProducerStateEntry.Queue默认队列长度为 5是否存在
如果 Producer SequenceNumber Broker SequenceNumber 1接收消息如果 Producer SequenceNumber 0 Broker SequenceNumber MaxInt接收消息刚初始化否则就是重复了拒绝接收。
由此看出ProducerID 和 SequenceNumber 可以避免消息的重复发送也避免消息乱序因为 SequenceNumber 单调递增。
做到幂等性也就意味着可以安全重试任何操作。从而做到了消息的可靠传输。
然而还有个很重要的一点就是上面说的上面讲的都是分区下的幂等多个分区的幂等性需要通过 事务 来解决。
限于篇幅今天先记录到这里事务的待我好好研究下再写哈哈最后祝大家新年快乐 文章来源于本人博客发布于 2023-01-01原文链接https://imlht.com/archives/414/