1. Producer

  • 生产者将数据写入主题(由分区组成),生产者知道要写入哪个分区(及Kafka代理拥有它);

  • 若kafka broker failure,生产者将自动恢复(automatically recover);

  • 生产者向主题发送消息,并根据key hash等机制将消息分发到分区
    为将消息成功写入主题,生产者必须指定一个确认acknowledgment level;

Producer

2. Message Key

MsgWithKey
  • 生产者可选择发送带有key的消息(String,Number,Binary等);

  • 若key = null,则消息会均匀地分布在主题中的分区中,
    则循环发送数据(分区1,分区2,分区3……);

  • 若key != null,则共享该键的所有消息将始终转到同一partition(hashing);

  • key可用于标识消息的任何信息:字符串、数值、二进制值等;

  • 若需对特定字段(如product_id)进行消息排序,则通常会发送key;

3. Message Anatomy

MsgAnatomy
Entry Memo

Key

消息种Key可选,可为null,字符串,数字或任何对象,然后将key序列化为二进制格式

Value

消息的内容,可为null,格式任意(arbitrary),也被序列化为二进制格式

Compression Type

消息可被压缩,压缩类型可被指定为消息的一部分,
选项:none,gzip,lz4,snappy,zstd

Headers

以键值对的形式列出可选的消息头,通常标头指定有关消息的元数据,尤其用于跟踪

Partition + Offset

一旦消息被发送到主题,就会收到一个partition number
和一个offset id,topic,partition,offset三者唯一标识消息;

Timestamp

时间戳由用户或系统在消息中添加

4. Message Serializer

MsgSerializer
  • kafka只接受来自生产者的字节(byte)输入,并将字节作为输出发送给消费者;

  • 消息序列化(serialization)意味着将对象/数据转换为(transforming into)字节;

  • 序列化用于消息的key和value,常用序列化器(serializer)有:
    String(包括Json),Int,Float,Avro,Protocol Buffer;

5. Message Key Hashing

MsgKeyHashing
  • kafka分区器(partitioner)是代码逻辑,它获取记录并确定将其发送到哪个分区;

  • Key Hashing是确定key到分区映射的过程,
    在默认的partitioner中,使用murmur2算法对key进行hash;

  • 所有具有相同key的消息都将转到同一分区;

targetPartition = Math.abs(Utils.murmur2(keyBytes)) % (numPartitions - 1)