关于javascript:细说-Kafka-Partition-分区

3次阅读

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

Partition(分区)是 Kafka 的外围角色,对于 Kafka 的存储构造、音讯的生产生产形式都至关重要。

把握好 Partition 就能够更快的了解 Kafka。本文会解说 Partition 的概念、构造,以及行为形式。

一、Events, Streams, Topics

在深刻 Partition 之前,咱们先看几个更高层次的概念,以及它们与 Partition 的分割。

Event(事件)代表过来产生的一个事实。简略了解就是一条音讯、一条记录。

Event 是不可变的,然而很沉闷,常常从一个中央流向另一个中央。

Stream 事件流示意静止中的相干事件。

当一个事件流进入 Kafka 之后,它就成为了一个 Topic 主题。

所以,Topic 就是具体的事件流,也能够了解为一个 Topic 就是一个静止的 Stream。

Topic 把相干的 Event 组织在一起,并且保留。一个 Topic 就像数据库中的一张表。

二、Partition 分区

Kafka 中 Topic 被分成多个 Partition 分区。

Topic 是一个 逻辑概念 ,Partition 是最小的 存储单元,把握着一个 Topic 的局部数据。

每个 Partition 都是一个独自的 log 文件,每条记录都以追加的模式写入。

Record(记录)和 Message(音讯)是一个概念。

三、Offsets(偏移量)和音讯的程序

Partition 中的每条记录都会被调配一个惟一的序号,称为 Offset(偏移量)。

Offset 是一个递增的、不可变的数字,由 Kafka 主动保护。

当一条记录写入 Partition 的时候,它就被追加到 log 文件的开端,并被调配一个序号,作为 Offset。

如上图,这个 Topic 有 3 个 Partition 分区,向 Topic 发送音讯的时候,实际上是被写入某一个 Partition,并赋予 Offset。

音讯的程序性须要留神,一个 Topic 如果有多个 Partition 的话,那么从 Topic 这个层面来看,音讯是无序的。

但独自看 Partition 的话,Partition 内部消息是有序的。

所以,一个 Partition 内部消息有序,一个 Topic 跨 Partition 是无序的。

如果强制要求 Topic 整体有序,就只能让 Topic 只有一个 Partition。

四、Partition 为 Kafka 提供了扩大能力

一个 Kafka 集群由多个 Broker(就是 Server)形成,每个 Broker 中含有集群的局部数据。

Kafka 把 Topic 的多个 Partition 散布在多个 Broker 中。

这样会有多种益处:

  • 如果把 Topic 的所有 Partition 都放在一个 Broker 上,那么这个 Topic 的可扩展性就大大降低了,会受限于这个 Broker 的 IO 能力。把 Partition 扩散开之后,Topic 就能够程度扩大。
  • 一个 Topic 能够被多个 Consumer 并行生产。如果 Topic 的所有 Partition 都在一个 Broker,那么反对的 Consumer 数量就无限,而扩散之后,能够反对更多的 Consumer。
  • 一个 Consumer 能够有多个实例,Partition 散布在多个 Broker 的话,Consumer 的多个实例就能够连贯不同的 Broker,大大晋升了音讯解决能力。能够让一个 Consumer 实例负责一个 Partition,这样音讯解决既清晰又高效。

五、Partition 为 Kafka 提供了数据冗余

Kafka 为一个 Partition 生成多个正本,并且把它们扩散在不同的 Broker。

如果一个 Broker 故障了,Consumer 能够在其余 Broker 上找到 Partition 的正本,持续获取音讯。

六、写入 Partition

一个 Topic 有多个 Partition,那么,向一个 Topic 中发送音讯的时候,具体是写入哪个 Partition 呢?有 3 种写入形式。

1. 应用 Partition Key 写入特定 Partition

Producer 发送音讯的时候,能够指定一个 Partition Key,这样就能够写入特定 Partition 了。

Partition Key 能够应用任意值,例如设施 ID、User ID。

Partition Key 会传递给一个 Hash 函数,由计算结果决定写入哪个 Partition。

所以,有雷同 Partition Key 的音讯,会被放到雷同的 Partition。

例如应用 User ID 作为 Partition Key,那么此 ID 的音讯就都在同一个 Partition,这样能够保障此类音讯的有序性。

这种形式须要留神 Partition 热点问题

例如应用 User ID 作为 Partition Key,如果某一个 User 产生的音讯特地多,是一个头部沉闷用户,那么此用户的音讯都进入同一个 Partition 就会产生热点问题,导致某个 Partition 极其忙碌。

2. 由 kafka 决定

如果没有应用 Partition Key,Kafka 就会应用轮询的形式来决定写入哪个 Partition。

这样,音讯会平衡的写入各个 Partition。

但这样无奈确保音讯的有序性。

3. 自定义规定

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

七、读取 Partition

Kafka 不像一般音讯队列具备公布 / 订阅性能,Kafka 不会向 Consumer 推送音讯。

Consumer 必须本人从 Topic 的 Partition 拉取音讯。

一个 Consumer 连贯到一个 Broker 的 Partition,从中顺次读取音讯。

音讯的 Offset 就是 Consumer 的游标,依据 Offset 来记录音讯的生产状况。

读完一条音讯之后,Consumer 会推动到 Partition 中的下一个 Offset,持续读取音讯。

Offset 的推动和记录都是 Consumer 的责任,Kafka 是不论的。

Kafka 中有一个 Consumer Group(生产组)的概念,多个 Consumer 组团去生产一个 Topic。

同组的 Consumer 有雷同的 Group ID。

Consumer Group 机制会保障一条音讯只被组内惟一一个 Consumer 生产,不会反复生产。

生产组这种形式能够让多个 Partition 并行生产,大大提高了音讯的生产能力,最大并行度为 Topic 的 Partition 数量。

例如一个 Topic 有 3 个 Partition,你有 4 个 Consumer 负责这个 Topic,也只会有 Consumer 工作,另一个作为后补队员,当某个 Consumer 故障了,它再补上去,是一种很好的容错机制。

参考资料

https://medium.com/event-driv…

正文完
 0