Kafka 交付语义 机制详解

上一篇提到了如何利用ISR完成“消息不丢失”,接下来看看如何整体来说,如何实现Kafka的交付语义。
Kafka 或者所有的消息队列中都存在的交付语义:最多一次至少一次精确一次,如何去理解这些语义,并用在合适的业务场景是十分重要的,看Kafka 社区中经常有吐槽丢消息等,其实通常来说不是Kafka 丢消息,而是用户用的不是那么明白,没有选择实现合适的交付语义,没有按照Kafka 规范来使用交付策略,下面具体来看看这几种交付语义。

最多一次(at most once)&使用场景 (Kafka 提供的不是这种机制)

最多一次是指,消息存在丢失的可能性,但能保证最多只处理一次。在一些消息宁愿丢失也不愿多处理一次的场景就比较合适了,但是如果存在精准一次的实现的话,还是精准一次比较合适。但是相对消息是否丢失没有那么执着的话,最多一次就够了,毕竟实现精准一次的代价是比起最多一次要高的。

至少一次(at least once)&使用场景(Kafka 默认实现方式)

至少一次是指,消息肯定会被处理,但是存在被处理多次的可能。这个在实现精准一次处理之前的场景,并且在Kafka 0.11.0.0 版本之前经常使用的就是这种模式,但是同一条消息被消费多次(这里的消费指的是成功拉取到消息并且返回,而不是说业务上对这个消息已经成功使用),因为网络抖动等原因可能会导致没有收到对应的响应而重复发送导致消息的多次消费或上传。Kafka 最起码的保证就是至少一次,因为ISR机制,Kafka消息一旦提交成功(产生副本之后),这条消息近乎可以认为是不可能丢失的,所以至少一次被消费。

精准一次(exactly once)&使用场景(Kafka 支持机制)

精确一次指的是消息被处理且只会被处理一次。在0.11.0.0 之后支持事务和幂等性之后,使用较广的就变成精确一次了。

幂等性producer(Idempotent producer)

首先幂等性的概念:若一个操作执行n次(n>1)与执行一次的结果是相同的,那么这个操作就是幂等操作。在producer 端,当出现发送消息无响应或者响应超时之后,不管消息成功没,都会有一个重试策略,这就导致了消息的重复提交问题,那如何实现幂等性呢,Kafka提供了一个enable.idempotent参数,设置为true时,就开启幂等了。
幂等的实现方式是给所提交的消息都赋予一个序列号用于消息去重(TCP 的方式),但是和TCP 实现不同的是,这个序列号不会舍弃,始终随消息持久化保存,可以简单的理解为消息的一部分。这么做的目的是 防止leader副本挂掉之后,没法儿进行去重操作。并且强制要求用户显指定一个producer id(严格单调递增的),这样一来,一个(producer id,分区号)都有一个对应的序列号值,这就为去重操作提供了便利,当发送消息的序列化小于或者等于broker端保存的序列号时,broker就会拒绝这条消息。
当实现上述的Idempotent producer 就保证了消息可以重试n次直到提交成功,并且提交多次也仅会成功保存一次,进而从producer端保证了,消息只会被成功提交一次。

事务

事务在Kafka中是指,把一组消息放入一个原子性单元中一次性统一处理。为实现Kafka的事物 client端必须提供一个唯一的id来标示事务(TransactionalId),并且要求在所有的会话上是唯一的(简单就理解为全局唯一吧),这个事务id是由producer自行分配的(注意区分开,transactionalId和producer id 不是一个东西)
当存在Kafka事务之后,就能完成的保证跨程序会话之间的幂等发送语义了,也支持了跨会话间的事务恢复(当某个producer挂掉了,能够保证下个实例完成之前未完成的事务)
就上面幂等性和事务来说,好像是仅仅对于producer 来说的,consumer 因为本身特性的原因对于这些特性的支持要弱一些(我觉着更合适的描述是 consumer的使用场景并没有说对事务的强要求或者必要),因为producer 是一种提交并持久化的过程,而consumer是一种消费并删除的过程,当事务中的部分消息被删除(比如事务跨日志段导致老的日志段被删除)、seek定位事务的指定位置、仅消费部分消息。
Kafka 为实现事务提供了一个叫做事务控制消息的消息,这个和普通消息的差异就是消息属性字段是否为1。消费/生产 到每个分区的消息都带着对应的事务控制信息,来完成具体的事务控制。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容