Kafka基础入门

Kafka是目前热门的分布式发布-订阅消息系统。

消息系统分类

  • 点对点模式

    点对点模式是最基础的消息模式,由单一服务器维持一个消息queue, 消息生成者生成消息发送(push/入列)到queue, 消息消费者从queue中取出(pull/出列)并消费消息。

    点对点模式的消息系统常见的有:httpsqs/Redis实现队列。都有如下特点:

    • 消息被消费后,消息queue中不再会有存储,所以消息消费者不可能消费到已经消费的消息。
    • Queue支持多个消费者,但是对于一个消息而言,只有被一个消费者消费。
  • 发布/订阅模式

    消息发布者发布消息到topic, 所有消息消费(订阅)都会消费该消息。与点对点模式不同,发布/订阅更像一对多模式。

Kafka基础概念

  • topic 主题,同一类消息抽象的一个概念
  • producer 发布者,负责发布消息到kafka集群/服务器
  • consumer 订阅者,负责订阅消费kafka集群/服务器中的消息
  • consumer group 订阅者组,同一个topic的消息可以被多个consumer订阅消费,这一类consumer就是consumer group
  • broker 代理者,单个kafka服务器节点称为broker
  • partition 分区,一个topic的所有消息数据,被分开存储在不同的地方,这个存储单位称为partition

Kafka运行原理

主题(topic)是Kafka消息发布的所在,kakfa为每个主题(topic)维护了一个分区(partition)的日志结构。每个主题的数据包含一个或多个分区(partiton),每个分区以一个提交日志文件(夹)的形式存在。

每条发给主题的消息都被分配一个在本分区内唯一的序号,这个序号被称为偏移量(offset)。

Kafka集群会保留所有被发布的消息一段时间,无论这些消息是否已经被消费,超过日志保留期(log retention)的消息就会被丢弃以释放空间。

同时,各分区的数据会按照的配置的量被复制到集群(cluster)上的其他服务器上。每个分区都有一个“领导(leader)”服务器和0到多个”追随者(follower)”服务器。领导服务器负责对这个分区的所有读写操作,而追随者服务器则被动的复制领导服务器。如果领导服务器宕机,其中一台追随者服务器会自动被选举为新领导。

主题日志分区有以下好处:

  • 突破单一服务器处理能力的限制,允许数据任意增长;
  • 实现并发性,因为数据是分散在不同的broker上,实现了类似的负载均衡。
  • 因为分区的数据被复制到了集群其他机器上,实现了容错和容灾。

producer的职责

消息生产者(producer)向主题(topic)发布消息,生产者自身要负责决定把消息发布到主题的具体哪个分区(partition)。分区的选择可以使简单的轮盘式,或者基于某种语义分区功能(如根据消息中的某键值来运算目标分区编号)。

consumer & consumer group的职责

同一消费者组的消费者可以使不同的进程、应用程序,甚至在不同的机器上。

在一个特定的消费组内,每个分区(partition)被且仅被分配到一个消费者示例上,也就是说每个分区对应一个消费者,那这个消费者可以严格按照顺序收到消息。该模式决定了每个消费组中的有效消费者数量一定小于或者等于主题包含的分区数量

如此一来,Kafka仅在同一分区内保证了消息的顺序性,而不保证跨分区的消息顺序性。如果确实需要严格的总体顺序性,则主题只能包含一个分区。

partiton

Partition中的每条Message由offset来表示它在partition中的偏移量,但是这个offset不是该Message在partition数据文件中的实际存储值,而只是一个逻辑上的值,它唯一确定了partition中的一条Message, 因此,可以认为offset是patition中Message的id。

在Kafka中仅保存了每个consumer实例已经处理数据的offset, 这样就可以:

  • 保存的数据量少
  • 当consumer出错重新启动时,只需要从最近的offset开始处理数据即可。

每个Partition由多个segment组成,broker收到发布消息往对应的Partition的最后一个segment上添加数据,当某个segment上的消息条数达到配置值或者消息发布时间超过阈值时,segment上的消息会被flush到磁盘,只有flush到磁盘上的消息,订阅者才能订阅消费到。segment达到一定大小后将不会再往该segment写输入,broker会创建新的segment。

有用就打赏一下作者吧!