1.1 发布与订阅消息系统
在正式讨论Apache Kafka(以下简称Kafka)之前,先来了解发布与订阅消息系统的概念,并认识这个系统的重要性。数据(消息)的发送者(发布者)不会直接把消息发送给接收者,这是发布与订阅消息系统的一个特点。发布者以某种方式对消息进行分类,接收者(订阅者)订阅它们,以便接收特定类型的消息。发布与订阅系统一般会有一个broker,也就是发布消息的中心点。
1.1.1 如何开始
发布与订阅消息系统的大部分应用场景都是从一个简单的消息队列或一个进程间通道开始的。例如,你的应用程序需要往别处发送监控信息,可以直接在你的应用程序和另一个可以在仪表盘上显示度量指标的应用程序之间建立连接,然后通过这个连接推送度量指标,如图1-1所示。
图1-1:单个直连的度量指标发布者
这是刚接触监控系统时简单问题的应对方案。过了不久,你需要分析更长时间片段的度量指标,而此时的仪表盘程序满足不了需求,于是,你启动了一个新的服务来接收度量指标。该服务把度量指标保存起来,然后进行分析。与此同时,你修改了原来的应用程序,把度量指标同时发送到两个仪表盘系统上。现在,你又多了3个可以生成度量指标的应用程序,它们都与这两个服务直接相连。而你的同事认为最好可以对这些服务进行轮询以便获得告警功能,于是你为每一个应用程序增加了一个服务器,用于提供度量指标。再过一阵子,有更多的应用程序出于各自的目的,都从这些服务器获取度量指标。这时的架构看起来就像图1-2所示的那样,节点间的连接一团糟。
图1-2:多个直连的度量指标发布者
这时,技术债务开始凸显出来,于是你决定偿还掉一些。你创建了一个独立的应用程序,用于接收来自其他应用程序的度量指标,并为其他系统提供了一个查询服务器。这样,之前架构的复杂度被降低到图1-3所示的那样。那么恭喜你,你已经创建了一个基于发布与订阅的消息系统。
图1-3:度量指标发布与订阅系统
1.1.2 独立的队列系统
在你跟度量指标打得不可开交的时候,你的一个同事也正在跟日志消息奋战。还有另一个同事正在跟踪网站用户的行为,为负责机器学习开发的同事提供信息,同时为管理团队生成报告。你和同事们使用相同的方式创建这些系统,解耦信息的发布者和订阅者。图1-4所示的架构包含了3个独立的发布与订阅系统。
图1-4:多个发布与订阅系统
这种方式比直接使用点对点的连接(图1-2)要好得多,但这里有太多重复的地方。你的公司因此要为数据队列维护多个系统,每个系统又有各自的缺陷和不足。而且,接下来可能会有更多的场景需要用到消息系统。此时,你真正需要的是一个单一的集中式系统,它可以用来发布通用类型的数据,其规模可以随着公司业务的增长而增长。