写点什么

两个优秀的分布式消息流平台:Kafka 与 Pulsar

  • 2022 年 9 月 14 日
    北京
  • 本文字数:4943 字

    阅读完需:约 16 分钟

本文向读者介绍两个优秀的分布式消息流平台:Kafka 与 Pulsar。

Apache Kafka(简称 Kafka)是由 LinkedIn 公司开发的分布式消息流平台,于 2011 年开源。Kafka 是使用 Scala 和 Java 编写的,当下已成为最流行的分布式消息流平台之一。Kafka 基于发布/订阅模式,具有高吞吐、可持久化、可水平扩展、支持流数据处理等特性。

Apache Pulsar(简称 Pulsar)是雅虎开发的“下一代云原生分布式消息流平台”,于 2016 年开源,目前也在快速发展中。Pulsar 集消息、存储、轻量化函数式计算为一体,采用计算与存储分离架构设计,支持多租户、持久化存储、多机房跨区域数据复制,具有强一致性、高吞吐、低延时及高可扩展性等流数据存储特性。

Kafka 与 Pulsar 都是优秀的分布式消息流平台,它们都提供了以下基础功能:

(1)消息系统:Kafka 与 Pulsar 都可以实现基于发布/订阅模式的消息系统,消息系统可以实现由消息驱动的程序—生产者负责产生并发送消息到消息系统,消息系统将消息投递给消费者,消费者收到消息后,执行自己的逻辑。 

这种消息驱动机制具有以下优点:

  • 系统解耦:生产者与消费者逻辑解耦,互不干预。如果需要对消息添加新的处理逻辑,则只需要添加新的消费者即可,非常方便。

  • 流量削峰:消息系统作为消息缓冲区,以低成本将上游服务(生产者)的流量洪峰缓存起来,下游服务(消费者)按照自身处理能力从消息队列中读取数据并进行处理,避免下游服务由于大量的请求流量而崩溃。

  • 数据冗余:消息系统将数据缓存起来,直到数据被处理,避免下游服务由于崩溃下线、网络阻塞等原因无法及时处理数据而导致数据丢失。

(2)存储系统:Kafka 与 Pulsar 可以存储大量数据,并且客户端控制自己读取数据的位置,所以它们也可以作为存储系统,存储大量历史数据。

(3)实时流数据管道:Kafka 与 Pulsar 可以构建实时流数据管道,流数据管道从 MySQL、MongoDB 等数据源加载数据到 Kafka 与 Pulsar 中,其他系统或应用就可以稳定地从 Kafka 与 Pulsar 中获取数据,而不需要再与 MySQL 等数据源对接。为此,Kafka 提供了 Kafka Connect 模块,Pulsar 提供了 Pulsar IO 模块,它们都可以构建实时流数据管道。

(4)流计算应用:流计算应用不断地从 Kafka 与 Pulsar 中获取流数据,并对数据进行处理,最后将处理结果输出到 Kafka 与 Pulsar 中(或其他系统)。流计算应用通常需要根据业务需求对流数据进行复杂的数据变换,如流数据聚合或者 join 等。为此,Kafka 提供了 Kafka Streams 模块,Pulsar 提供了 Pulsar Functions 模块,它们都可以实现流计算应用。另外,Kafka 与 Pulsar 也可以与流行的 Spark、Flink 等分布式计算引擎结合,构建实时流应用,实时处理大规模数据。

Kafka 与 Pulsar 都具有(或追求)以下特性

  1. 高吞吐、低延迟:它们都具有高吞吐量处理大规模消息流的能力,并且能够低延迟处理消息。这也是大多数消息流平台追求的目标。

  2. 持久化、一致性:Kafka 与 Pulsar 都支持将消息持久化存储,并提供数据备份(副本)功能,保证数据安全及数据一致性,它们都是优秀的分布式存储系统。

  3. 高可扩展性(伸缩性):Kafka 与 Pulsar 都是分布式系统,会将数据分片存储在一组机器组成的集群中,并支持对集群进行扩容,从而支持大规模的数据。

  4. 故障转移(容错):Kafka 与 Pulsar 支持故障转移,即集群中某个节点因故障下线后,并不会影响集群的正常运行,这也是优秀的分布式系统的必备功能。

Kafka 与 Pulsar 虽然提供的基础功能类似,但它们的设计、架构、实现并不相同,本书将深入分析 Kafka 与 Pulsar 如何实现一个分布式、高扩展、高吞吐、低延迟的消息流平台。另外,本书也会介绍 Kafka 与 Pulsar 中连接器、流计算引擎等功能的应用实践。

Kafka 与 Pulsar 涉及的基础概念

将 Kafka 与 Pulsar 都视为一个简单的消息系统,消息流转流程如下图所示。



图中展示了消息系统中的 4 个基本概念。它们在 Kafka 与 Pulsar 中都存在,并且含义相同。

  • 消息 Message:Kafka 与 Pulsar 中的数据实体。

  • 生产者 Producer:发布消息的应用。

  • 消费者 Consumer:订阅消息的应用。

  • 主题 Topic:Kafka 与 Pulsar 将某一类消息划分到一个主题,主题是消息的逻辑分组,不同主题的消息互不干预。

下面结合一个例子说明上述概念。假如存在一个用户服务,该用户服务创建了一个主题“userTopic”,每当有新用户注册时,用户服务都会将一个消息发送到该主题中,消息内容为“新用户注册”。当前有两个服务订阅了该主题的消息:权益服务和权限服务。权益服务收到消息后,负责给新用户创建权益。权限服务收到消息后,负责给新用户分配权限。该例子中的消息即用户服务发送的数据实体,生产者是用户服务。消费者是权益服务与权限服务。ka 的基础概念

下面介绍 Kafka 的一些基础概念。

  • Kafka 消费组:Kafka 将多个消费者划分到一个逻辑分组中,该分组即一个消费组。这个概念比较重要,结合上面的例子进行说明,在 Kafka 中,权益服务所有的消费者都可以加入一个权益消费组 rightsGroup,而权限服务所有的消费者都可以加入一个权限消费组 guthorityGroup。不同消费者之间消费消息互不干预。

  • Broker:Kafka 服务节点,可以将 Broker 理解为一个 Kafka 的服务节点或者服务进程(下面将其统称为 Broker 节点),多个 Broker 节点可以组成一个 Broker 集群。

  • 分区 Partition:Kafka 定义了分区的概念,一个主题由一个或多个分区组成,Kafka 将一个主题的消息划分到不同的分区,并将不同分区存储到不同的 Broker,从而实现分布式存储(典型的数据分片思想),每个分区都有对应的下标,下标从 0 开始。

  • 副本 Replica:Kafka 中每个分区都有一个或多个副本,其中有 1 个 leader 副本,0 个或多个 follow 副本,每个副本都保存了该分区全部的内容。Kafka 会将一个分区的不同副本保存到不同的 Broker 节点中,以保证数据的安全。本书后面会详细分析 Kafka 副本同步机制。

  • AR(Assigned Replicas):分区的副本列表,即一个分区所有副本所在 Broker 的列表。

  • ISR:分区中所有与 leader 副本保持一定程度同步(即不能落后太多)的副本会组成 ISR(In-Sync Replicas)集合。ISR 集合中包括 leader 副本,可以将其理解为已同步副本(不一定完全同步,但不会落后太多)。

  • ACK 机制:ACK(消息确认)机制是消息系统中的一个很重要的机制,消息系统 ACK 机制与 HTTP 的 ACK 机制非常类似。消息系统 ACK 机制可以分为两部分:

mBroker 收到生产者发送的消息并成功存储这些消息后,返回成功响应(可以将该成功响应理解为一种 ACK)给生产者,这时生产者可以认为消息已经发送成功,否则生产者可能需要做一些补偿操作,如重发消息。

m 消费者收到 Broker 投递的消息并成功处理后,返回消费成功响应给 Broker,Broker 收到这些消费成功响应后,可以认为消费者已经成功消费了消息,否则 Broker 可能需要做一些补偿操作,如重新投递消息。该场景下消费者通常需要将消费成功的消息位置(或者消息 Id 等)发送给 Broker,并且 Broker 需要存储这些消费成功的位置,以便后续消费者重启后从该位置继续消费。该场景也是我们关注的重点。

在 Kafka 中,每个消息都存在一个偏移量 offset,如果将一个 Kafka 主题理解为一个简单的消息数组,那么可以将消息偏移量理解为该消息在该数组中的索引。消费者会将最新消费成功的消息的下一个偏移量发送给 Broker(代表该偏移量前面的消息都已经消费成功),Broker 会存储这些偏移量,以记录消费者的最新消费位置。为了方便描述,本书后面将消费者提交 ACK 信息中的偏移量称为 ACK 偏移量。

另外,Kafka 与 Pulsar 都使用 ZooKeeper 存储元数据,完成分布式协作等操作,ZooKeeper 是一种分布式协作服务,专注于协作多个分布式进程之间的活动,可以帮助开发人员专注于应用程序的核心逻辑,而不必担心应用程序的分布式特性。本书后面会详细分析 ZooKeeper 为 Kafka 与 Pulsar 提供了哪些服务。Kafka 2.8 开始提供 KRaft 模块,支持 Kafka 脱离 ZooKeeper 独立运行部署,本书后面也会详细分析该模块的设计与实现。

下图展示了 Kafka 集群的基础架构。



下面介绍 Pulsar 的基础概念

  • Pulsar 订阅组:Pulsar 可以将多个消费者绑定到一个订阅组中,类似于 Kafka 的消费组。同样使用前面“用户服务”的例子进行说明,在 Pulsar 中,权益服务所有的消费者都可以绑定一个权益订阅组 rightsSubscription,而权限服务所有的消费者都可以绑定一个权限订阅组 guthoritySubscription,不同订阅组之间消费消息互不干预。

  • 非分区主题、分区主题:Kafka 中每个分区都与一个 Broker 绑定,而 Pulsar 中每个主题都与一个 Broker 绑定,某主题的消息固定发送给相应的 Broker 节点。而 Pulsar 中也有“分区主题”的概念,分区主题由一组非分区的内部主题组成(下面将 Pulsar 中组成分区主题的非分区内部主题简称为内部主题),每一个内部主题都与一个 Broker 绑定,这样一个分区主题可以将消息发送到多个 Broker,避免 Pulsar 单个主题的性能受限于单个 Broker 节点。

  • Broker:Pulsar 集群中的服务节点。需要注意,Pulsar 由于采用计算、存储分离的架构,因此 Pulsar Broker 节点只负责计算,并不负责存储,Pulsar Broker 节点会完成数据检验、负载均衡等工作,并将消息转发给 Bookie 节点。

  • Bookie:Pulsar 利用 BookKeeper 服务实现存储功能,BookKeeper 中的节点被称为 Bookie 节点。BookKeeper 框架是一个分布式日志存储服务框架,本书后面会详细分析它。Pulsar 中的 Bookie 节点负责完成消息存储工作。

  • Ledger:BookKeeper 的数据集合,生产者会将数据写入 Ledger,而消费者从 Ledger 中读取数据。为了数据安全,BookKeeper 会将一个 Ledger 的数据存储到多个 Bookie 节点中,实现数据备份。

  • Entry:Ledger 中的数据单元,Ledger 中的每个数据都是一个 Entry。可以将 Ledger 理解为一个账本,Entry 则是账本中的一个条目。

  • 租户、命名空间:Pulsar 定义了租户、命名空间的概念,Pulsar 是一个多租户系统,它给不同的租户分配不同的资源,并保证不同租户之间的数据相互隔离,互不干预,这样可以支持多团队、多用户同时使用一个 Pulsar 服务。每个租户还可以创建多个命名空间,命名空间为主题的逻辑分组。可以将 Pulsar 理解为一个大房子,每个租户是房子里的一个房间,并且这个房间的空间划分为不同的区域(命名空间),不同区域存放不同的物件。例如,用户服务可以创建一个租户“user”,存储用户服务的消息。该租户可以按自己的业务场景,创建多个命名空间,存放不同的主题,如下图所示。



  • Cluster 集群:Pulsar 为集群定义了一个 Cluster 概念,每个 Pulsar Broker 节点都运行在一个 Cluster 集群下,不同的 Cluster 集群之间可以相互复制数据,从而实现跨地域复制。

  • ACK 机制:与 Kafka 类似,Pulsar 同样需要完成“Broker 存储消息后返回成功响应给生产者”“消费者成功处理消息后发送 ACK 给 Broker”。Pulsar 中的每个消息都有一个消息 Id,Pulsar 消费者会将消费成功的消息 Id 作为 ACK 请求内容发送给 Broker。

下图展示了 Pulsar 集群的基础架构。



本文介绍了 Kafka 与 Pulsar 的起源发展与系统特性,以及 Kafka 与 Pulsar 中最基本的核心概念。如果还想学习更多,《深入理解 Kafka 与 Pulsar:消息流平台的实践与剖析》这本书中会详细介绍这些概念的具体含义与作用,也会逐渐补充 Kafka 与 Pulsar 中其他的关键概念,如果读者对某个概念不太理解,也可以先带着疑问阅读本书。

想要深入了解 Kafka 与 Pulsar 吗?

快来看看这本书吧!


9787121440014.png


▊《深入理解 Kafka 与 Pulsar:消息流平台的实践与剖析》

梁国斌 著


  • 详细介绍 Kafka 与 Pulsar 的使用方式

  • 深入分析 Kafka 与 Pulsar 的实现原理


本书详细介绍了 Kafka 与 Pulsar 的使用方式,并深入分析了它们的实现机制。通过阅读本书,读者可以快速入门和使用 Kafka 与 Pulsar,并深入理解它们的实现原理。

本书通过大量实践示例介绍了 Kafka 与 Pulsar 的使用方式,包括管理脚本与客户端(生产者、消费者)的使用方式、关键的配置项、ACK 提交方式等基础应用,以及安全机制、跨地域复制机制、连接器/流计算引擎、常用监控管理平台等高级应用。这些内容可以帮助读者深入掌握 Kafka 与 Pulsar 的使用方式,并完成日常管理工作。另外,本书深入分析了 Kafka 与 Pulsar 的实现原理,包括客户端(生产者、消费者)的设计与实现、Broker 网络模型、主题(分区)分配与负载均衡机制,以及磁盘存储与性能优化方案、数据同步机制、扩容与故障转移机制。最后,本书介绍了 Kafka 与 Pulsar 的事务机制,并深入分析了 Kafka 事务的实现及 Kafka 的分布式协作组件 KRaft 模块。这部分内容可以帮助读者轻松理解 Kafka 与 Pulsar 的架构设计与实现原理。


深入理解kafka二维码 (3).png


粉丝福利

限时优惠扫码或点击阅读原文

下单半价

快快扫码抢购

用户头像

还未添加个人签名 2019.10.21 加入

还未添加个人简介

评论

发布
暂无评论
两个优秀的分布式消息流平台:Kafka与Pulsar_博文视点Broadview_InfoQ写作社区