kafka在0.11之后,开始支持幂等发送和事务,那么分别是如何实现的呢?
幂等发送
引入producerid +seqnum的设计
对于每一个生产者,初始化是分配一个producerid,发送消息的时候会有一个单调递增的seqnum,消息包含producerid+ seqnum
对于broker,会缓存一个最大的producerid+ seqnum,如果接收到消息的seq小于之前缓存的seq,直接返回幂等结果,不要写入日志文件。 这个幂等只能在相同生产者session和相同partition级别保证,不同的生产者或者不同的partition保证不了。
事务
引入事务协调者,事务日志,transactionid的设置
对于消费,转换,写入这样的场景,将消费的offset 更新,和写入的commit放在一个事务中,只有全部成功,消费的offset才会进行更新。否则,重新消费。
事务隔离级别,有read commited和read uncommited两种。
对于read commited级别,consumer会过滤掉那些终止事务的消息(比如写入场景,有些写入成功,有些写入失败)。
网友评论