一个Broker是一个Kafka实例,多个Broker形成一个Kafka集群,Topic可指定副本数量,多个副本位于多个Broker上,Kafka使用Zookeeper在多个副本中选举出一个Leader,当Broker失效Topic没有Leader时,则会重新选举出新的Leader,从而解决单点问题。Kafka将Topic拆分成多个分区,即将消息写入到多个分区,类似数据库的分库,读写消息可不受单机的限制,从而起到负载均衡的作用。Kafka概念、策略与工作流程如下:
- 概念
(1)Topic与partition
Topic是消息存放的目录即主题,1)逻辑概念,同一个Topic的消息可以分布在不同的节点上(Broker);2)一个Topic包含一个或多个分区(Partition);3)producer生产消息或consumer消费消息时,指定Topic。
Topic在逻辑上可以被认为是一个queue,每条消息都必须指定它的Topic,可以简单理解为必须指明把这条消息放进哪个queue里,每个Partition在物理上对应一个文件夹,该文件夹下存储这个Partition的所有消息和索引文件。文件夹路径node/topic/partition。
(2)producer
生产消息到Topic的一方,负责创建消息,然后投递到kafka环境中。
(3)consumer
订阅Topic消费消息的一方,连接到kafka,然后消费消息。
(4)broker
Broker:Kafka的服务实例就是一个broker,大多数情况下,可以认为broker就是一台kafka服务器。 -
策略
生产者Producer负责将消息发送到Topic,消费者Consumer负责订阅Topic进行消费。kafka保证的是分区有序,消息发送时都被发送到一个Topic,而Topic由是由一些Partition Logs(分区日志)组成,每个Partition中的消息都是有序的,生产的消息被不断追加到Partition log上,其中的每一个消息都被赋予了一个唯一的offset值。
消息中间件.png
(1)消息分区策略
Kafka将Topic拆分成多个分区,也就是将消息进行划分,类似数据库分库,起到负载均衡的作用。一条消息只会进入一个分区,生产者根据分区策略将消息发送到指定Partition,包括三种策略
1)直接指定分区;2)如果未指定分区,则根据消息的key,通过哈希函数指定分区;3)如果没有key,则轮训分区。
(2)消费者组(Consumer Group)
为了提高消费的吞吐量,将多个消费者组成消费者组,从Topic消费消息,Topic下的每一个Partition的消息都只能被消费者组下的唯一一个Consumer进行消费,以确保消费的顺序性。一般设置消费者组的消费者数与分区数保持一致,这样一个消费者能负责一个分区,提高效率,如果消费组的消费者数量小于分区数,则会出现一个消费者负责多个分区,如果消费组的消费者数据量大于分区数,会出现消费者分不到分区。
3.工作流程
以下是 Pub-Sub 消息的逐步工作流程 -
(1)生产者定期向主题发送消息。
(2)Kafka 代理存储为该特定主题配置的分区中的所有消息。 它确保消息在分区之间平等共享。 如果生产者发送两个消息并且有两个分区,Kafka 将在第一分区中存储一个消息,在第二分区中存储第二消息。
(3)消费者订阅特定主题。
(4)一旦消费者订阅主题,Kafka 将向消费者提供主题的当前偏移,并且还将偏移保存在 Zookeeper 系统中。
(5)消费者将定期请求 Kafka (如100 Ms)新消息。
(6)一旦 Kafka 收到来自生产者的消息,它将这些消息转发给消费者。
(7)消费者将收到消息并进行处理。
(8)一旦消息被处理,消费者将向 Kafka 代理发送确认。
(9)一旦 Kafka 收到确认,它将偏移更改为新值,并在 Zookeeper 中更新它。 由于偏移在 Zookeeper 中维护,消费者可以正确地读取下一封邮件,即使在服务器暴力期间。
以上流程将重复,直到消费者停止请求。且消费者可以随时回退/跳到所需的主题偏移量,并阅读所有后续消息。 - 参考:
网友评论