kafka多个消费者消费一个topic_Kafka 服务中消费者创建详解

与生产者对应的是消费者,应用程序可以通过 KafkaConsumer 来订阅主题,并从订阅的主题拉取消息。不过在使用 KafkaConsumer 之前需要了解消费者与消费组的概念,否则无法理解如何使用 KafkaConsumer。

一、消费者与消费组

消费者(Consumer)负责订阅主题(Topic),并从订阅的主题上拉取消息。与其他消息中间间不同的是,再Kafka消费者观念里还有一层消费组(Consumer Group)。当消息发送到主题后,主题只会把消息发送给订阅它的消费组内的一个消费者。

7dd6837c0317e99268b89de60225e9e2.png

Kafka comsumer Group

按照Kafka的默认规则,

消费组A每个消费者分配到了 Kafka 这个主题的一个分区,

消费组B每个消费者分配到了 Kafka 这个主题的两个分区,两个消费组之间互不影响。即 Topic 中的一条消息,会被组A 和组B 分别消费一次。

每个消费者只能消费所分配到的分区中的消息。换言之,每一个分区只能被一个消费组中的一个消费者消费。

消费者和消费组间的关系

1、每个消费者都只有一个对应的消费组。

2、一个消费组可以包含一个或多个消费者。

主题和分区间的关系

1、一个主题可以有多个分区,也就是所有分区的消息集合就是主题的消息。

主题和消费组间的关系

1、一个主题可以被多个消费组订阅。

2、消费组中消费者的数目如果大于订阅的主题中分区的数目,则存在空闲的消费者(订阅不到分区)。

分区和消费者间的关系

1、每个分区中的消息只能被订阅其主题的消费组消费;分区中的消息只能被订阅得消费组中的一个消费者(组内)消费。

2、每个消费者只能消费所分配到的分区中的消息。

消费者和消费组的这种模型可以让整体的消费能力具备横向伸缩性,可以增加或减少消费者的个数来提高或减少整体消费能力。

分区分配策略可以通过消费者客户端的 partition.assignment.strategy 参数来设置消费者与订阅主题之间的分区分配策略。

对于消息中间件而已,一般有两种消息投递模式:

1、点对点(P2P,Point-to-Point)模式和发布/订阅(Pub/Sub)模式。点对点模式是基于队列的,生产者将消息发送到队列,消费者从队列接收消息。

2、发布/订阅模式定义了如何向一个内容节点发送和订阅消息,这个内容节点在Kafka中为主题(Topic)相当于一个中介,生产者发布消息到主题,而消费者消费所订阅的主题。

主题使消息的订阅者和发布者互相保持独立,不需要接触就可以进行消息的传递,发布/订阅模式在消息一对多广播时使用。Kafka同时支持这两种模式,正是得益于消费者和消费组模型的契合。

二、消费者客户端开发

一个正常的消费逻辑需要具备以下几个步骤:

  1. 配置消费者客户端参数及创建相应的消费者实例。
  2. 订阅主题
  3. 拉取消息并消费
  4. 提交消费位移
  5. 关闭消费者实例

默认配置是从订阅开始后,才开始消费新消息如果需要从起始位置消费那么需要修改消费者客户端参数。

2.1
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kafka的offset是用来标识消息在分区的位置的。每个分区都有一个对应的offset,用于记录消费者已经读取的消息位置。当消费者消费消息后,会向Kafka的broker的一个专门维护每个消费者offset的topic发送一条消息,记录自己当前已读的消息的offset+1的值作为新的offset的消息。这样,下次消费者继续消费时,就可以从上次消费的位置继续读取消息。\[1\] Kafka的分区数据在磁盘上划分为多个segment,每个segment由索引文件和数据文件两个文件组成。每个segment文件根据设定的配置,最多存储相同大小的消息。每一个segment的文件都以自己文件里存储的第一消息的上一个offset作为文件名,这样可以更加灵活地分片存储以及快速查找。\[2\] Kafka将不同分区放到不同的broker上,其一台作为leader,其他为isr(in-sync replicas)或者不在isrKafka的leader负责写入消息,isr的其他成员异步地去同步这些消息。当isr的所有成员都成功同步了这条消息时,这条消息对于消费端才可见。Kafka使用一个高水位(high watermark)来表示消费者所能读取到的最大的下一个offset。当leader接收到消息后,会先判断isr成员的offset,如果不是最大+1,代表isr有成员还没有接收到这条消息,则不会更改高水位。只有当isr的每台机器的offset都比leader大1时,leader才会更新高水位,并将更新高水位的消息发送给isr的follower。如果有follower宕机,会被剔除出isr,所以最坏情况下也会将所有follower都剔除,只对自己更新高水位。其他broker在重新加入集群后再同步消息。\[3\] #### 引用[.reference_title] - *1* *2* *3* [kafka的offset理解](https://blog.csdn.net/weixin_44627989/article/details/104891945)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值