Kafka 博文索引 (2)

Kafka 博文索引

核心概念

消息message:最基本的数据单元,由字节数组组成。消息可以有一个可选的键key,键也是一个字节数组。

主题topic:消息通过主题进行分类。主题就好比数据库的表,或者文件系统里的文件夹。

分区partition:一个提交日志,主题可以被分为若干个分区。消息以追加的方式写入分区尾部,然后以先入先出的顺序读取。

偏移offset:一个不断递增的整数值,在创建消息时指定。同个分区中每个消息的偏移量都是唯一的。

生产者producer:创建消息并将其发布到一个特定的主题上。

消费者consumer:订阅主题并按照消息生成的顺序读取消息。


消息分区

Kafka 通过分区来实现 数据冗余可伸缩性:分区可以分布在不同的服务器上,一个主题可以横跨多个服务器,以此来提供比单个服务器更强大的性能。

Kafka 博文索引

要注意,由于一个主题一般包含几个分区,因此无法在整个主题范围内保证消息的顺序。生产者在默认情况下,会把消息均衡地分布到主题的所有分区上,而并不关心特定消息会被写到哪个分区。

为了保证消息顺序可控,可以为同类消息指定相同的键,然后生产者会根据键的 hashmod 结果选取分区,从而保证具有相同键的消息总会被写到相同的分区上。


消费者组

每个分区只能被分配给一个消费者,然后消费者会按照消息生成的顺序读取它们。

过程中,消费者会记录已读消息的偏移量,避免重复消费同一条消息。

Kafka 博文索引

消息系统中常见的通信模型有两种:

消息队列message queue:点对点point to point的排他通信,每条消息只会被消费一次。

发布/订阅pub/sub:类似广播通信,每条消息可能会被消费多次。

Kafka 博文索引


为了同时支持这两种模式,Kafka 在消费者端引入了 消费者组群counsumer group这一逻辑概念:

不同的消费者组群之间彼此互不相关,两者消费到的消息是一致的,此时相当于实现了发布/订阅模型。

而同个组群的消费者之间存在互斥关系,每个消费者只能消费部分数据,此时相当于实现了消息队列模型。


集群

一个独立的 Kafka 服务器被称为 broker,其主要职责有两个:

接收来自生产者的消息,为消息设置偏移量,并提交消息到磁盘保存。

为消费者提供服务,对读取分区的请求作出响应,返回已经提交到磁盘上的消息。

Kafka 博文索引

为保证可用性,broker 以集群的方式部署。每个集群会自动选举出一个 controller 负责管理工作,包括将分区分配给 broker 和监控 broker。

一个分区从属于一个 broker,该 broker 被称为分区的 leader。

如果分区允许多副本replica,这些副本会分布在多个 broker 上,此时会发生分区复制replication。

这种复制机制为分区提供了消息冗余,当 leader 失效时分区会被其他 broker 接管,相关的消费者和生产者都会重连新的 leader。


优势

系统解耦:异构系统可以通过 Kafka 进行通信,减少系统之间协调与开发成本。

模型丰富:通过消费者组的概念,一份数据可以同时支持不同的通信模型,同能够满足不同的应用需求

磁盘存储:Kafka 会将消息持久化到磁盘,允许消息积压并保证数据不会丢失,无需担心生产与消费速率不匹配的问题。

横向扩展:Kafka 通过集群与分区的方式实现了横向扩展,并且可以在线对集群进行扩容。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyypjz.html