概念理解

topic: 逻辑概念,用于联系Producer 和 Consumer的message生产和消费。Producer 生产的消息放入一个topic中,由Consumer通过对同一个topic的订阅进行消费

broker: 物理资源,一般一个broker指底层的一台物理服务器。

partition: 逻辑分区存储,用于将topic在不同的物理资源上进行逻辑存储。实际Producer 放入topic的消息,会存入不同broker上的partition中。其特点如下:

  1. 一个topic默认只有一个partition,但是可以手动扩充partition数量。因此partition可以理解为最细I粒度的topic
  2. 由于一个topic可以包含很多个partition,在单个partion中,存储的信息是有序的,但是同一个topic中、不同partition中消息是无序的

举例理解

关于topic、partition、broker的概念理解,可以类比windows的逻辑分区。

一个broker对应于一台PC,一个partition对应于PC上的一个逻辑分区,如D、E、F盘,一个topic最少对应于一个partition,换而言之,producer写入的信息,至少要放入一个逻辑分区(D盘),也可以分别放入多个逻辑分区(D盘和E盘)。从单个逻辑分区(D盘)取出的数据是有序的,但是从多个逻辑分区(D盘和E盘)取出的数据,不保证有序。

三者存在的意义

定义topic、partition、broker三者的意义,本质目的在于将message的生产消费、逻辑存储、物理资源做解耦,使得topic的横向扩展与broker完全解耦

  1. topic负责message的生产消费
  2. partition在于做topic的逻辑存储
  3. broker实际是提供partition的物理资源

两两配合关系

要理解以上三个概念,就要充分理解topic、partition、broker三者间的两两关系

broker与partition

  1. 一个broker可以有多个partition吗?

    可以,类似于一台PC可以划分多个逻辑分区

  2. 一个partition可以跨broker存在吗?

    不可以,一个partition的分区上限,就是broker的大小。前面提到过,要实现消息有序,就必须使用同一个partition存储message,因此kakfa中的有序message,是存在上限的,即单个broker的性能上限。

broker与topic(通过partition隔离后,完全解耦)

  1. 一个broker可以有多个topic吗?

    可以,一个broker上可以有多个partition,不同的partition可能隶属于不同的topic

  2. 一个topic可以跨broker存在吗?

    可以,一个topic可以囊括不同partition,不受broker限制,可以是一台broker上的多个partition,也可以是多个broker上的不同partition。

topic与partition

  1. 一个topic可以包含多个partition吗?

    可以,基本概念

  2. 一个partition可以隶属于多个topic吗?

    不可以,一个partition只能隶属于一个topic,作为这个topic的最细粒度逻辑存储

其他概念

Consumer

Consumer是message的消费者,这个不用多介绍,唯一要注意的是Consumer与partition的关系。

  1. 每个topic的每个partition只能由唯一一个Consumer消费。

    原因是partition已经是topic的最小存储粒度,所以consumer相当于消费的是一个最小topic

  2. 一个Consumer可以消费多个partition

    这个就相当于consumer直接订阅topic一样

Consumer group

Consumer group顾名思义就是一堆Consumer ,其存在的意义依然是为了解耦,解耦topic订阅与consumer消费之间的关系。

  1. 点对点模型可以直接对接单一的Consumer 进行消费
  2. 发布订阅模型则可以通过Consumer group的形式进行消费

虽然Consumer group对应topic,解耦了topic订阅与consumer消费之间的关系,但还是要关注最细粒度consumer的和最小粒度的topic(partition)之间的关系,从前面Consumer一节中,可以看出主要是二者的数量对应关系。主要讨论三种情况

  1. Consumer Group中Consumer 数量 < 所订阅topic 中partition数量,可以正常消费,但是使用较少。(此时一个Consumer 会按不确定比例(竞争策略)消费多个partition,但很少这么用。具体原理可以参考这篇文章
  2. Consumer Group中Consumer 数量 = 所订阅topic 中partition数量, 可以正常消费,可以做到每个partition一个Consumer ,但是没有资源冗余,不具备高可用,使用也较少
  3. Consumer Group中Consumer 数量 > 所订阅topic 中partition数量, 可以正常消费,且留有资源冗余,冗余资源正常不会工作,只有在Consumer 故障时才会启用。正常实际生产环境中使用较多。
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐