生产者客户端架构

1生产者发送消息到broker 需要经过拦截器,序列化器,分区器。那么经过这些之后,是怎么到达broker的?


主线程,消息累加器(RecordAccumulator),sender线程,kafka cluster

主线程 追加消息到 消息累加器中, sender线程从 消息累加器中拉取消息 添加到 kafka cluster中

1、主线程中,主要是用户线程的发送流程,拦截器,序列化器,分区器

2、消息累加器:

    2.1)主要用于缓存主线程发送的消息,由sender线程批量获取 发送到broker中。 (RecordAccumulator 的大小可以通过生产者参数设置buffer.memory 来设置,默认是32MB,如果生产者主线程发送速度大于sender线程拉取的速度,就会造成生产者空间不足。 要么 KafkaProducer.send()方法被阻塞或者抛出异常,这由max.block.ms 配置 默认60s)

    2.2)producerBatch 不是 ProducerRecord,而是一个ProducerRecord的集合,一个producerBatch中有一个或者多个producerRecord。(多个较小的producerRecord拼接成一个较大的producerBatch 这样可以减少网络请求的数量,增大吞吐量)

       2.2. 1每条消息进入消息累加器的时候 都会找到对应的队列,没有则新建,然后获取队尾的producerBatch,没有则新建,看producerBatch的剩余大小是否可以存放进入消息,不够则新增 一个合适大小的ProducerBatch加入队列尾部。

        2.3.2.ProducerBatch的大小由batch.size和producerRecord来判断,如果producerRecord小于这个值,则创建一个 batch.size大小的空间来存储(默认16KB),如果大于这个值,则新增一个 producerRecord 大小相同的空间存储。

        2.3.4 消息在网络发送是以字节bety的形式传送的,在发送之前需要创建一块内存来保存对应的消息。为了减少频繁的创建和释放,消息累加器内部实现的有bufferPool,他主要是用来复用Deque<ProducerBatch> 中 batch.size 大小的 空间。 不是batch.size 大小的空间将不受他管理。

    2.3)消息累加器为每个分区都维护了一个 双端队列 Deque<ProducerBatch> 生产者主线程写入时放入队尾,sender线程拉取时从队列头部获取。

3、sender线程

    3.1 sender线程从消息累加器中获取到消息之后,会再次将消息转化,将<分区,Deque<ProducerBatch>>转换为<Node,List<ProducerBatch>> Node表示为具体的broker节点,对于生产者客户端是与具体的broker链接,并不关心到底是哪个分区。 消息转换为<Node,List<ProducerBatch>>后会再次转换为<Node,request>(如上图第6步) ,   发送给selector 发送到 kafka cluster 上

    3.2 在消息转换为<Node,request>后,在传给selector的同时还会传送给InFlightRequest模块中,结构为Map<NodeId,Deque<request>> ,字符串NodeId 为节点id,request为请求,整个InFlightRequest 中 存储的都是请求了 但是未响应的消息(未第10步)。InFlightRequest 中还提供了许多管理类的方法,并且通过配置参数还可以限制每个链接 (客户端与node之间的连接)最多缓存的为获取响应的请求数量(默认为5  配置max.in.flight.requests.pre.connection可以修改),如果真的有连接超过5个未响应的请求,那么就不能再通过该连接发送更多的请求了,因为这个连接响应较慢,再继续发送的话会增大请求超时的可能。

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

推荐阅读更多精彩内容