Kafka权威指南(第2版)
上QQ阅读APP看书,第一时间看更新

基于发布与订阅的消息系统那么多,为什么Kafka 是更好的选择呢?

Kafka 可以无缝支持多个生产者,不管客户端消费的是单个主题还是多个主题。所以,它很适用于从多个前端系统收集数据,并以统一的格式对外提供数据。例如,对于一个包含了多个微服务的网站,我们可以为页面视图创建一个主题,所有服务都以相同的消息格式向这个主题写入数据。消费者应用程序将获得统一的页面视图,不需要协调来自不同生产者的数据流。

除了支持多个生产者,Kafka 也支持多个消费者从一个单独的消息流读取数据,而且消费者之间互不影响。这与其他队列系统不同。在其他队列系统中,消息一旦被一个客户端读取,就无法再被其他客户端读取。多个消费者还可以组成一个群组,它们共享一个消息流,并保证整个群组只处理一次给定的消息。

Kafka 不仅支持多个消费者,还允许消费者非实时地读取消息,这要归功于Kafka 的数据保留特性。消息会被提交到磁盘,并根据设置的保留策略进行保存。每个主题可以设置单独的保留策略,以满足不同消费者的需求。各个主题还可以保留不同数量的消息。消费者可能会因为处理速度慢或突发的流量高峰而无法及时读取消息,在这种情况下,持久化的数据可以保证数据不会丢失。消费者可以在应用程序维护期间离线一小段时间,无须担心消息丢失或被堵塞在生产者端。消费者也可以被关闭,但消息会继续保留在Kafka 中。消费者被重启之后,可以从上次中断的地方继续处理消息。

为了能够轻松地处理大量数据,Kafka 从一开始就被设计成一个具备灵活伸缩性的系统。用户可以在开发阶段使用单个 broker,然后再扩展到包含 3 个 broker 的小型开发集群。随着数据量不断增长,在部署到生产环境时,集群可以包含上百个 broker。对在线集群进行扩展丝毫不影响系统的整体可用性。也就是说,一个包含多个 broker 的集群,即使个别 broker 失效,仍然可以持续地为客户端提供服务。要提高集群的容错能力,需要配置较高的复制系数。第 7章将介绍更多的有关复制的内容。

上面提到的所有特性让Kafka 成了一个高性能的发布与订阅消息系统。通过横向扩展生产者、消费者和 broker,Kafka 可以轻松处理巨大的消息流。在处理大量数据的同时,它还能保证亚秒级的消息延迟。

Kafka 核心项目还加入了一些流式平台特性,从而使开发人员能够更容易执行一些常见的任务。虽然Kafka 算不上是一个完整的平台(完整的平台通常包含像 YARN 这样的结构化运行时环境),但这些特性会以 API 和开发库的形式存在,为开发者构建其他功能提供坚实的基础和非常好的部署灵活性。我们可以用Kafka Connect 从一个源数据抽取数据并将其推送到Kafka,或者从Kafka 抽取数据并将其推送到另一个接收数据的系统。Kafka Streams 提供了一个开发库,开发人员可以用它开发具备伸缩性和容错能力的流式处理应用程序。第 9章将更详细地介绍 Apache Connect,而 Apache Streams 将在第 14章进行介绍。