当前位置: 首页 > 新闻资讯 > 学习技巧

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

本文向读者介绍两个优秀的分布式消息流平台: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都视为一个简单的消息系统,消息流转流程如下图所示。

1.png

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

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

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

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集群的基础架构。

2.png

下面介绍Pulsar的基础概念

3.png

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

4.png


文介绍了Kafka与Pulsar的起源发展与系统特性,以及Kafka与Pulsar中最基本的核心概念。


在线报名
姓  名:
*
联系电话:
*
预报专业:
*
回访时间:
*