Kafka的消息模型

本文介绍了Kafka的消息模型,包括生产者、消费者和broker的角色。强调了Kafka消费者作为一组进程的特性,以及消息在生产、存储、消费三个阶段保证不丢失的策略。此外,还讨论了如何处理重复消息以及Kafka的exactly once语义,提供了实现幂等性的方法。
摘要由CSDN通过智能技术生成


kafka采用的是标准的发布-订阅模型,主要用在异步、解耦的场景、流量控制(削峰填谷)的场景。

生产者和消费者

一个典型的发布订阅系统长这个样子,如图1所示。
在这里插入图片描述
图1 发布-订阅模型
在发布 - 订阅模型中,消息的发送方称为发布者(Publisher),消息的接收方称为订阅者(Subscriber),服务端存放消息的容器称为主题(Topic)。发布者将消息发送到主题中,订阅者在接收消息之前需要先“订阅主题”。“订阅”在这里既是一个动作,同时还可以认为是主题在消费时的一个逻辑副本,每份订阅中,订阅者都可以接收到主题的所有消息。


在kafka中,生产者自己选择发布数据到相应的topics。存储消息的服务器叫broker,一般来说,Kafka集群有多个broker,用来做负载均衡。生产者发布数据也可以采取简单的循环方式进行负载均衡,也可以依据一定的分区策略(比如基于record中的key)。


图2展示了Kafka的整体架构。生产者发布消息到topic,每个topic又分成多个partition,每台服务器(broker)拥有0个或多个topic的partition。每个partition是一个有读写顺序的log文件,存储在硬盘上。
在这里插入图片描述
图2 kafka架构图
相比于传统的 发布/订阅 系统,Kafka中的消费者可以看做是一组合作的进程。topic中的每个partition传送给消费者组中的一个消费者。因此,partition的个数是topic的并行个数,也决定了消费者的并行程度 – 个数。
由于broker本身是无状态的,所以需要Zookeeper来维护服务器的状态。在Kafka里把消费者按标签分成消费者组(consumer group),每一条发布到topic的记录被发送到一个消费者组。消费者组中的实例可以在不同的线程或不同的机器上。

每个partition都会对应一个消费者组,消费者组之间是隔离的,partition会为每个消费者组记录当前消费的位置,而消费者组中的消费实例对消息的消费是竞争关系,一个消费者消费的消息,其他消费者就无法再消费了。

保证消息不丢失

一条消息从产生到消息要经历 生产、存储转发、消费 三个过程,要保证消息的不丢失,那在这三个阶段都需要做一些事情,来避免消息的丢失。
在这里插入图片描述
图3 消息生产-存储-消费

  • 生产阶段: 在这个阶段,从消息在 Producer 创建出来,经过
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值