关于消息幂等一共有以下思想:
At most once:生产消息最多一次(不会重复,但是可能丢失数据); At least once:生产消息至少投递一次(不会丢失,但是会导致重复) Exactly once: 生产消息刚好一次(生产消息确认机制,不丢不重)
新版的Kafka,最终实现了Exactly once且性能不受影响;
producer每次启动后,首先向broker申请一个全局唯一的pid,用来标识本次会话。 mySeq:每次生产消息前,生产者会用会话的pid拿到seq,然后在外部自增+1 MemeorySeq:内存中维护的就是这个会话最终的序列号;
mySeq=MemeorySeq+1: 正常消息,外部自增的结果和内部自增结果一致 mySeq<=MemeorySeq: 重复消息; 外部自增的结果小于内部的实际值,某种原因,消息重复拿了导致序列落差于内部实际值,直接丢失重复的 mySeq>MemeorySeq+1: 消息丢失;外部自增的结果大于内部自增结果,某种原因,一次会话拿多了,重试调整指针!直到mySeq=MemeorySeq+1
以上就是ack机制的实现思路
……有点难度,目前没找到靠谱的资料来说明这些api操作
利用Kafka有时候我们想到原子性的业务运行,就是么全部写入成功,要么全部失败;(整个过程中,对外部不可见,非事务授权的消费者不可以操作事务消息);