认识 Apache Kafka

244 阅读2分钟

这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战

Apache Kafka 是一个分布式的消息系统(Messaging System)。它是由 Java 和 Scala 编写的。它最早诞生于 LinkedIn,随后开源,2014 年几个前 LinkedIn 的工程师成立了 Confluent 公司并着眼于 Kafka,它的名字来源于作家弗朗茨·卡夫卡

消息系统也是我们常说的消息队列,它的工作机制可以这样简单地描述:系统 A 将消息发送给消息系统,系统 B 从消息系统读取消息,从而实现服务间的异步调用、系统间的解藕、缓解上游系统流量激增对下游系统造成的压力(削峰填谷)等。 消息系统之所以被俗称为消息队列,我想可能是因为,一个先入先出队列数据结构能实现一个最简单的消息系统,系统 A 向队列中推入元素,系统 B 从队列中取出元素;也可能是因为使用消息系统时,从外部来看,它也像是一个先入先出的队列结构。但是,一个成熟的消息系统的消息传递模型不止如此。

常见的消息系统的消息传递方法有两种:

  • 第一种是点对点模型。这种方式比较像打电话,一个「电话」由系统 A 拨出以后,只能由系统 B 接听,而其他系统无法接听。也就是消息只能从系统 A 传递到系统 B,不会有第三个系统参与到这个过程当中。
  • 第二种是发布/订阅模型。这种方式比较像广播,它有一个电台的概念(Kafka 中叫做 Topic)。这种模式中,有主播(消息的发送方),也有听众(消息的接收方),多个发送方可以向一个 Topic 中发送消息,多个接收方可以获取 Topic 中的消息。就像多个主播可以在一个电台广播内容,很多听众可以听同一个电台的内容。

Apache Kafka 同时支持这两种模式。

有了消息发送和接受的模式之后,由于消息的接收方和发送方属于不同的系统,因此,一个消息系统还需要对他们之间沟通的语言做统一的规定。常见的通用数据格式有 XML、JSON 等。Apache Kafka 使用的是纯二进制的序列。

关于什么时候需要一个消息系统的参与,或者消息系统具体能解决哪些问题,可以参考这篇文章:为什么需要消息队列