一条消息是如何写入的

消息结构

public class ProducerRecord<K, V> {
    private final String topic; //消息发往的主题
    private final Integer partition;//消息要发往的分区号
    private final Headers headers; //消息头部
    private final K key; //键
    private final V value; //值,与业务相关的消息体
    private final Long timestamp;  //消息的时间戳
    //省略其他成员方法和构造方法
}

其中:

  • key是指定消息的键,可以用来计算分区号以发往特定的分区;有key的消息还能支持日志压缩,压缩后会保留最后一条数据。
  • value:是指发送的具体消息
    topic和value必填,其他字段选填。

生产者整体架构

整体架构

整个生产者客户端包括主线程和 Sender 线程(发送线程)两部分。其中,在主线程中由 KatkaProducer创建消息,然后通过可能的拦截器、序列化器和分区器的作用之后缓存到消息累加器(RecordAccumulator,也称为消息收集器)中。Sender 线程负责从RecordAccumulator 中获取消息并将其发送到Kafka 中。下面将详细说明各部分的作用。

拦截器

拦截器包括生产者拦截器和消费者拦截器,可以根据某个规则过滤不符合要求的消息、修改消息的内容等。

序列化器

生产者需要用序列化器把对象转换成字节数组才能通过网络发送给 Kafka。而
消费者需要用反序列化器把从Katka中收到的字节数组转换成相应的对象,序列化是必须的,且序列化和反序列化方法必须一一对应。

分区器

如果消息中没有指定分区字段,则分区器需要根据Key来计算分区值,目的就是为了消息分配。
如果指定了key,那么会对Key进行哈希计算,根据得到的哈希值来计算分区号,在分区数不变的情况下,可保证相同Key的消息写入同一分区;如果没有指定key,则是以轮询的方式发送到各个可用的分区。

消息累加器

RecordAccumulator主要用来缓存消息以便Sender线程可以批量发送,目的是为了减少网络传输的资源消耗以提升性能。
在Recordaccumulator的内部为每个分区都维护了一个双端队列,主线程中发送过来的消息都会被追加到RecordAccumulator的某个双端队列中,队列中的内容就是批量消息(ProducerBatch),包含多条生产者创建的消息(producerRecord),批量消息的大小可由参数控制。消息写入缓存时,追加到双端队列的尾部;sender在读消息时,是从头部开始读取。
当一条新的消息到达累加器时,会先根据分区找到对应的双端队列,然后在双端队列尾部寻找producerBatch,如果不存在则新建;如果存在,则判断producerBatch是否还能容纳新的消息,如果能则写入,如果不能在新建producerBatch。

Sender线程

Sender从累加器中获取一个批次的消息之后,跟进行数据的转换,这种主要做了两件事:一是根据partiton得到要发送到的Broker的地址;二是将按照kafka内置的请求协议将消息转换成对应的request,进而发往各个broker。
请求在发送到broker之前,会被写入InFlightRequest中(连接维度,即broker维度的缓存队列),主要目的是记录已发送但是没收到响应的请求,最多缓存的请求数量可以通过配置参数设置,当缓存的请求数达到最大数量限制时,便不再向对应的broker发送更多请求。

消息存储

todo这部分主要介绍:

  1. 消息是如何存储的?
  2. kafka为什么使用磁盘作为存储介质?如何实现高吞吐和低延迟?
  3. 如何检索指定消息?
  4. 消息不可能无线存储,清理规则是什么?

参考书籍:《深入理解kafka核心设计与实践原理》

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

推荐阅读更多精彩内容