kafka在大数据、分布式架构中都很流行。kafka可以进行流式计算,也可以做为日志系统,还可以用于消息队列。
kafka作为消息队列的优点:
- 分布式的系统
- 高吞吐量。即使存储了许多TB的消息,它也保持稳定的性能。
- 数据保留在磁盘上,因此它是持久的。
一、pull模式
消息队列有push模式和pull模式。push模式是消息队列推送给消息消费者,pull模式是消息消费者从消息队列中拉取。
二、发布 - 订阅消息系统
kafka是一个分布式的发布 - 订阅(pub-sub)消息系统。
在发布 - 订阅系统中,消息被保留在主题中。 消费者可以订阅一个或多个主题并使用该主题中的所有消息。
消息生产者称为发布者,消息使用者称为订阅者。
比如,购物网站,有一个订单系统,还有一个物流系统,消息队列可以作为两个系统的消息中间件,订单系统可以将订单数据发送给kafka消息队列,然后物流系统再从消息队列中订阅得到订单数据。
三、角色和组件
Topics(主题)
属于特定类别的消息流称为主题。 数据存储在主题中。
Topic被拆分成分区。 对于每个Topic,Kafka保存一个分区的数据。 每个这样的分区包含不可变有序序列的消息。 分区被实现为具有相等大小的一组分段文件。
Partition(分区)
Topic可能有许多Partition,因此它可以处理任意数量的数据。
Partition offset(分区偏移)
每个分区消息具有称为 offset 的唯一序列标识。类似数据库自增int Id,随着数据的不断写入 kafka 分区内的偏移量会不断增加,一条消息由一个唯一的偏移量来标识。偏移量的作用是,让消费者知道自己消费到了哪个位置,下次可以接着从这里消费
Replicas of partition(分区备份)
副本只是一个分区的备份。 副本从不读取或写入数据。 它们用于防止数据丢失。
Brokers
一台kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic。每个broker都有各自的broker.id。
Kafka Cluster(Kafka集群)
Kafka有多个代理被称为Kafka集群。 可以扩展Kafka集群,无需停机。 这些集群用于管理消息数据的持久性和复制。
Producer (消息生产者)
向kafka broker发消息的客户端。支持负载均衡,异步发送。
Consumer (消息消费者)
向kafka broker拉取消息的客户端。kafka采用的是 pull模型,而不是push模型。
Consumer Group (消费者组)
每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group)。
每个Consumer Group都有一个唯一的GroupId。
Leader(领导者)
Leader是负责给定分区的所有读取和写入的节点。 每个分区都有一个服务器充当Leader
Follower(追随者)
跟随Leader指令的节点被称为Follower。 如果Leader失效,一个Follower将自动成为新的领导者。 跟随者作为正常消费者,拉取消息并更新其自己的数据存储。
record(消息):
kafka 通信的基本单位,每一条消息称为record
示例如下:
在上图中,主题配置为三个分区。 分区1具有两个偏移因子0和1.分区2具有四个偏移因子0,1,2和3.分区3具有一个偏移因子0.副本的id与承载它的服务器的id相同。
四、Zookeeper在Kafka中的作用
Zookeeper在Kakfa中扮演的角色Kafka将元数据信息保存在Zookeeper中,但是发送给Topic本身的数据是不会发到Zk上的。
- kafka使用zookeeper来实现动态的集群扩展,不需要更改客户端(producer和consumer)的配置。broker会在zookeeper注册并保持相关的元数据(topic,partition信息等)更新。
- 而客户端会在zookeeper上注册相关的watcher。一旦zookeeper发生变化,客户端能及时感知并作出相应调整。这样就保证了添加或去除broker时,各broker间仍能自动实现负载均衡。这里的客户端指的是Kafka的消息生产端(Producer)和消息消费端(Consumer)
- Broker端使用zookeeper来注册broker信息,以及监测partition leader存活性。
- Consumer端使用zookeeper用来注册consumer信息,其中包括consumer消费的partition列表等,同时也用来发现broker列表,并和partition leader建立socket连接,并获取消息。
- Zookeeper和Producer没有建立关系,只和Brokers、Consumers建立关系以实现负载均衡,即同一个Consumer Group中的Consumers可以实现负载均衡。