前言
本章主要内容:讲解kafka的组成部分,介绍kafka的工作原理
消息模型
队列
一个生产者发送一条消息到队列里,只能有一个消费者去消费此消息。
发布-订阅式
生产者发送一个消息到Topic中,消息会被广播到,订阅此topic的所有消费者。
问题:
如果Topic消息产生速度过快,而消费者处理消息较慢,该怎么办呢?
优化模型
定义消费组,去消费Topic中的消息。当消息量很大时,由消费组中的一个消费者去消费该消息,实现负载均衡的效果。
一、Kafka的消息模型
特点:
- Kafka只支持消息持久化。
- 消费端为拉模型。
- 消费状态和订阅关系由客户端端负责维护,消息消费完后不会立即删除,会保留历史消息。
- 多订阅时,消息只会存储一份。
消费模式:
- kafka提供一个消费者抽象模型( 消费者组(consumer group))。
- 消费者用一个消费组名(group-id)来标识自己。
- 当某个Topic只有一个消费组订阅,且该消费组只有一个消费者时,就是队列(queue)下的点对点消费模式。
- 当某个Topic有多个消费组订阅,且每个消费组只有一个消费者时,就是发布订阅模式。
二、工作流程
先看一张图:
- 生产者producer1和producer2 发送消息到主题(Topic)中
- 消息主题(Topics)中使用多个partition存储消息
- 存放消息的partition(partition上的消息是有序的),是分布式存储在Broker中,且同时会有副本(replica)
- 每台机器一般有一个broker(或者多个broker)
- 消费者consumer 监听Topic ,然后消费partition上的消息
三、组成部分
从图中可以看出,有以下几个组成部分:
Producer :
- 生产者,提供往Topics 中添加消息的接口。
Broker :
- 部署在服务器上的kafka实例,一台机器可以有多个。
- broker存储topic的数据。如果某topic有N个partition,集群有N个broker,那么每个broker存储该topic的一个partition。
- 如果某topic有N个partition,集群有(N+M)个broker,那么其中有N个broker存储该topic的一个partition,剩下的M个broker不存储该topic的partition数据。
- 如果某topic有N个partition,集群中broker数目少于N个,那么一个broker存储该topic的一个或多个partition。在实际生产环境中,尽量避免这种情况的发生,这种情况容易导致Kafka集群数据不均衡
Topics :
- 可以理解为消息的类别,kafka中所有的消息都是放在不同的Topic下的。
Partition:
- Topics中的消息会拆分存储到多个Partition中。
- 每个Partition上的消息是有序的。
Consumer:
- 从broker上消费Topics中的消息,可以同时消费多个Topics的消息。
Consumer Group:
- 同一个Consumer Group下的多个Consumer消费者,消费同一个Topics主题消息时。每个消息只能由该Consumer Group下的一个Consumer消费。
- 不同的Consumer Group的多个Consumer消费者,消费同一个Topics主题消息时。每个消息可以被不同Consumer Group下的Consumer消费,互不影响。
Leader和Follwer:
- 每个分区有一个leader,零或多个follower。Leader处理此分区的所有的读写请求,而follower被动的复制数据。
- 当leader宕机后,follower机之间竞选机制,产生新的leader机,维持集群稳定。
- 一台服务器可能同时是一个分区的leader,另一个分区的follower。
四、详细流程
没啥比看图更容易让人理解了~
总结
- 介绍了两种消息模型(队列以及发布订阅)。以及为了实现消息的负载均衡,减轻消费者的压力,从而引入消费者组的概念。
- 介绍了kafka的消息模型,消息模型的变化可以实现队列和订阅发布模式。
- 介绍了消息流程和组成