文章目录

  • 前言
  • 消息模型
  • 队列
  • 发布-订阅式
  • 优化模型
  • 一、Kafka的消息模型
  • 二、工作流程
  • 三、组成部分
  • 四、详细流程
  • 总结



前言

本章主要内容:讲解kafka的组成部分,介绍kafka的工作原理

消息模型

队列

java kafka 实现订阅消息 kafka 发布订阅原理_数据


一个生产者发送一条消息到队列里,只能有一个消费者去消费此消息。

发布-订阅式

java kafka 实现订阅消息 kafka 发布订阅原理_Group_02


生产者发送一个消息到Topic中,消息会被广播到,订阅此topic的所有消费者。

问题:
如果Topic消息产生速度过快,而消费者处理消息较慢,该怎么办呢?

优化模型

java kafka 实现订阅消息 kafka 发布订阅原理_Group_03


定义消费组,去消费Topic中的消息。当消息量很大时,由消费组中的一个消费者去消费该消息,实现负载均衡的效果。


一、Kafka的消息模型

java kafka 实现订阅消息 kafka 发布订阅原理_java kafka 实现订阅消息_04


特点:

  • Kafka只支持消息持久化。
  • 消费端为拉模型。
  • 消费状态和订阅关系由客户端端负责维护,消息消费完后不会立即删除,会保留历史消息。
  • 多订阅时,消息只会存储一份。

消费模式:

  • kafka提供一个消费者抽象模型( 消费者组(consumer group))。
  • 消费者用一个消费组名(group-id)来标识自己。
  • 当某个Topic只有一个消费组订阅,且该消费组只有一个消费者时,就是队列(queue)下的点对点消费模式。
  • 当某个Topic有多个消费组订阅,且每个消费组只有一个消费者时,就是发布订阅模式。

二、工作流程

先看一张图:

java kafka 实现订阅消息 kafka 发布订阅原理_Group_05

  1. 生产者producer1和producer2 发送消息到主题(Topic)中
  2. 消息主题(Topics)中使用多个partition存储消息
  3. 存放消息的partition(partition上的消息是有序的),是分布式存储在Broker中,且同时会有副本(replica)
  4. 每台机器一般有一个broker(或者多个broker)
  5. 消费者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。

四、详细流程

java kafka 实现订阅消息 kafka 发布订阅原理_java kafka 实现订阅消息_06

没啥比看图更容易让人理解了~


总结

  1. 介绍了两种消息模型(队列以及发布订阅)。以及为了实现消息的负载均衡,减轻消费者的压力,从而引入消费者组的概念。
  2. 介绍了kafka的消息模型,消息模型的变化可以实现队列和订阅发布模式。
  3. 介绍了消息流程和组成