关于kafka:Kafka-分区-消费模式

11次阅读

共计 1503 个字符,预计需要花费 4 分钟才能阅读完成。

具象化模型

下图以订单、运输、告诉等信息,形容与 kafka 交互的过程,业务中的事件(如下单,领取,配送,评估,售后)会产生各类信息,最终以 topic 归类会集到 kafka 中

分区

同一类的音讯都会会集到一个 Topic 中,一个 Topic 能够分为多个 Partition,Partition 是最小的贮存单元,每一个 Partition 贮存着一部分的音讯,每个 Partition 都是一个独自的 log 文件,每条记录都以追加的模式写入

偏移量 & 音讯程序

Partition 中每条记录都会被调配惟一的序号,称为 Offset,即偏移量
Offset 是一个递增的,不可变的数字,由 kafka 主动保护
当一条记录写入 Partition 的时候,它就被追加到 log 文件的开端,并被调配一个序号,作为 Offset

  • 所以从 Partition 来看,单个 Partition 外部是有序的,但从 Topic 来看,音讯在 Partition 之间是无序的;如果心愿音讯保障齐全的程序,就只能存在一个 Partition,又或者发送端指定发送到某个 Partition,生产端指定从某个 Partition 生产

Partition 扩大 & 冗余

kafka 集群由多个 Broker 形成,每个 Broker 中含有集群的局部数据,同一个 Topic 的多个 Partition 将散布在多个 Broker 中;Partition 会生成多个正本,它们会扩散在不同的 Broker 中,
如果某个 Broker 故障了,Consumer 能够在其余 Broker 上找到 Partition 的正本,持续获取音讯

Message 写入

  • 指定 Partition

      Producer 发送音讯时,可指定一个 Partition Key
      这样就能够写入特定的 Partition
      Partition Key 会依据一个 Hash 函数计算出写入哪个 Partition
      Partition Key 雷同的音讯,会被放到雷同的 Partition
      这种形式须要留神数据歪斜问题

  • 随机 Partition

      如果没有应用 Partition Key,kafka 则会应用轮询的形式来决定写入哪个 Partition
      音讯会平衡的写入各个 Partition,这样无奈确保音讯的有序性
    
  • 自定义规定

      Kafka 反对自定义规定,一个 Producer 能够应用本人的分区指定规定。

Message 读取

kafka 的音讯读取采纳的是 pull 形式,Consumer 须要被动从 Topic 的 Partition 拉取音讯,Pull 模式下,Consumer 就能够依据本人的生产能力去决定生产策略
但 Pull 有个毛病是,如果 broker 没有可供生产的音讯,将导致 consumer 一直在循环中轮询,直到新音讯达到
为了防止这点,kafka 有个参数能够让 Consumer 阻塞直到新音讯达到,也能够阻塞直到音讯的数量累积到某个特定的值再读取

音讯的 Offset 就是 Consumer 的游标,依据 Offset 来记录音讯的生产状况
读完一条音讯之后,Consumer 会推动到 Partition 中的下一个 Offset 持续读取音讯
Offset 由 Consumer 负责保护

生产组

Consumer Group 下有一个或多个 Consumer,这些 Consumer 有雷同的 groupId,groupId 是一个字符串,生产组的惟一标识
Topic 中的每个分区只能调配给某个 Consumer Group 的一个 Consumer 生产(该分区还能够被调配给其余生产组)

参考资料:
https://medium.com/event-driv…
本文中大部分的图来自上述博客,应该是一位印度工程师所写,原文为英文且查看须要翻墙
https://www.bilibili.com/read…

正文完
 0