什么是 Kafka
Posted on Wed, 25 Dec 2024 10:33:25 +0800 by LiangMingJian
什么是 KafKa
Kafka(Apache Kafka)是一款开源的消息引擎系统 (Messaging System),根据维基百科的定义:消息引擎系统是一组规范,企业利用这组规范在不同系统之间传递语义准确的消息,实现松耦合的异步式数据传递。简单来说消息引擎的作用就是实现以下的功能。
- 系统 A 发送消息给消息引擎系统。
- 系统 B 从消息引擎系统中读取 A 发送的消息。
Kafka 如何设计信息
Kafka 使用的是纯二进制的字节序列。如果我们在设计消息使用了 CSV、XML 亦或是 JSON 这些结构化的框架,那么在发送给 Kafka 前都要将其转换成二进制的字节序列。
Kafka 如何传递消息
Kafka 同时支持两种消息引擎模型,即:
- 点对点模型:也叫消息队列模型。即系统 A 发送的消息只能被系统 B 接收,其他任何系统都不能读取 A 发送的消息。日常生活的例子比如电话客服就属于这种模型:同一个客户呼入电话只能被一位客服人员处理,第二个客服人员不能为该客户服务。
- 发布 / 订阅模型:与上面不同的是,它有一个主题(Topic)的概念,你可以理解成逻辑语义相近的消息容器。该模型也有发送方和接收方,只不过提法不同。发送方也称为发布者(Publisher),接收方称为订阅者(Subscriber)。和点对点模型不同的是,这个模型可能存在多个发布者向相同的主题发送消息,而订阅者也可能存在多个,它们都能接收到相同主题的消息。生活中的报纸订阅就是一种典型的发布 / 订阅模型。
为什么要使用 Kafka
为什么系统 A 不能直接发送消息给系统 B,中间还要隔一个消息引擎呢?为什么要使用 Kafka 呢?
这里的答案是削峰填谷。所谓的削峰填谷就是指缓冲上下游瞬时突发流量,使其更平滑。特别是对于那种发送能力很强的上游系统,如果没有消息引擎的保护,脆弱的下游系统可能会直接被压垮导致全链路服务雪崩。但是,一旦有了消息引擎,它能够有效地对抗上游的流量冲击,真正做到将上游的峰填满到谷中,避免了流量的震荡。消息引擎系统的另一大好处在于发送方和接收方的松耦合,这也在一定程度上简化了应用的开发,减少了系统间不必要的交互。
举个简单例子来说,比如购买课程,每门课程都有一个专门的订阅按钮,点击之后进入到付费页面。这个流程可以简单的看成这样:点击订阅按钮调用订单系统生成对应的订单,这是上游。处理该订单会依次调用多个子系统服务 ,比如调用支付宝和微信支付的接口、查询你的登录信息、验证课程信息等,这是下游。显然上游的生成订单的操作比较简单,它的TPS要远高于处理订单的下游服务,因此如果上下游系统直接对接,势必会出现下游服务无法及时处理上游订单从而造成订单堆积的情形。特别是当出现类似于秒杀这样的业务时,上游订单流量会瞬时增加,可能出现的结果就是直接压跨下游子系统服务。
解决此问题的一个常见做法是我们对上游系统进行限速,但这种做法对上游系统而言显然是不合理的,毕竟问题并不出现在它那里。所以更常见的办法是引入像 Kafka 这样的消息引擎系统来对抗这种上下游系统 TPS 的错配以及瞬时峰值流量。
当引入了 Kafka 之后。上游订单服务不再直接与下游子服务进行交互。当新订单生成后它仅仅是向 Kafka Broker 发送一条订单消息即可。类似地,下游的各个子服务订阅 Kafka 中的对应主题,并实时从该主题的各自分区(Partition)中获取到订单消息进行处理,从而实现了上游订单服务与下游订单处理服务的解耦。这样当出现秒杀业务时,Kafka 能够将瞬时增加的订单流量全部以消息形式保存在对应的主题中,既不影响上游服务的 TPS,同时也给下游子服务留出了充足的时间去消费它们。这就是 Kafka 这类消息引擎系统的最大意义所在。