当前位置: 首页 > 科技观察

大家评论一下,Kafka和Pulsar谁更好?

时间:2023-03-20 13:22:32 科技观察

ApacheKafka(简称Kafka)是LinkedIn开发的分布式消息流平台,于2011年开源。Kafka使用Scala和Java编写,目前已成为最流行的分布式消息流平台之一。Kafka基于发布/订阅模型,具有高吞吐、持久化、水平扩展、支持流式数据处理等特点。ApachePulsar(简称Pulsar)是雅虎开发的“下一代云原生分布式消息流平台”。2016年开源,目前发展迅速。Pulsar集成了消息传递、存储和轻量级函数计算。采用计算存储分离架构设计,支持多租户、持久化存储、多机房跨地域数据复制。它具有强一致性、高吞吐量、低延迟、高可扩展性等Stream数据存储特性。Kafka和Pulsar都是优秀的分布式消息流平台,都提供了以下基本功能:(1)消息系统:Kafka和Pulsar都可以实现基于发布/订阅模型的消息系统,消息系统可以实现消息驱动程序——生产者负责生成消息并发送给消息系统,消息系统将消息传递给消费者。消费者收到消息后,执行自己的逻辑。这种消息驱动的机制有以下优点:系统解耦:生产者和消费者在逻辑上是解耦的,互不干扰。如果需要对消息添加新的处理逻辑,只需要添加一个新的消费者即可,非常方便。流量调峰:消息系统作为消息缓冲区,以低成本缓存上游服务(生产者)的流量峰值,下游服务(消费者)根据自身处理能力从消息队列中读取数据并进行处理,避免下游服务因请求流量过大而崩溃。数据冗余:消息系统对数据进行缓存,直到数据处理完毕,避免下游服务因死机、离线、网络拥塞等原因未能及时处理数据而导致数据丢失。(2)存储系统:Kafka和Pulsar可以存储大量的数据,客户端控制从哪里读取数据,所以也可以作为存储系统来存储大量的历史数据。(3)实时流数据管道:Kafka和Pulsar可以构建实时流数据管道。流式数据管道将数据从MySQL、MongoDB等数据源加载到Kafka、Pulsar,其他系统或应用可以稳定地从Kafka、Pulsar获取数据。无需连接MySQL等数据源。为此,Kafka提供了KafkaConnect模块,Pulsar提供了PulsarIO模块,两者都可以构建实时流数据管道。(4)流计算应用:流计算应用不断从Kafka和Pulsar获取流数据,对数据进行处理,最后将处理结果输出给Kafka和Pulsar(或其他系统)。流计算应用程序通常需要根据业务需求对流数据进行复杂的数据转换,例如流数据聚合或连接。为此,Kafka提供了KafkaStreams模块,Pulsar提供了PulsarFunctions模块,两者都可以实现流计算应用。此外,Kafka和Pulsar还可以与Spark、Flink等流行的分布式计算引擎结合,构建实时流应用,实时处理大规模数据。Kafka和Pulsar都具有(或追求)高吞吐量和低延迟的以下特点:它们都具有处理大规模消息流的高吞吐量能力,并且能够以低延迟处理消息。这也是大多数消息平台所追求的目标。持久化和一致性:Kafka和Pulsar都支持消息的持久化存储,并提供数据备份(拷贝)功能,保证数据安全和数据一致性。它们是优秀的分布式存储系统。高扩展性(scalability):Kafka和Pulsar都是分布式系统,将数据分片存储在由一组机器组成的集群中,支持集群的扩展以支持大规模数据。Failover(容错):Kafka和Pulsar都支持故障转移,即集群中某个节点因故障而下线后,不会影响集群的正常运行,这也是一个优秀的分布式系统必备的功能.尽管Kafka和Pulsar提供相似的基本功能,但它们的设计、架构和实现是不同的。本书将深入剖析Kafka和Pulsar如何实现分布式、高扩展、高吞吐量、低延迟的消息流平台。此外,本书还将介绍连接器、流计算引擎等功能在Kafka和Pulsar中的应用实践。Kafka和Pulsar涉及的基本概念,将Kafka和Pulsar都看成是一个简单的消息系统,消息流转流程如下图所示。该图显示了消息系统中的四个基本概念。它们存在于Kafka和Pulsar中,意义相同。Message消息:Kafka和Pulsar中的数据实体。生产者:发布消息的应用程序。Consumer消费者:订阅消息的应用程序。Topic主题:Kafka和Pulsar将某种类型的消息划分为一个主题。主题是消息的逻辑分组。不同主题的消息互不干扰。下面用一个例子来说明上面的概念。如果有用户服务,则用户服务会创建一个主题“userTopic”。每当有新用户注册时,用户服务都会向主题发送消息,消息内容为“新用户注册”。目前订阅该主题消息的服务有两种:授权服务和权限服务。权益服务收到消息后,负责为新用户创建权益。权限服务收到消息后,负责为新用户分配权限。本例中的消息是用户服务发送的数据实体,生产者是用户服务。消费者是维权服务和维权服务。ka的基本概念下面介绍一下Kafka的一些基本概念(1)Kafka消费者组:Kafka将多个消费者划分为一个逻辑组,即为消费者组。这个概念比较重要,结合上面的例子来说明,在Kafka中,所有权限服务的消费者都可以加入一个权限消费组rightsGroup,所有权限服务的消费者都可以加入一个权限消费组authorityGroup。不同消费者之间的消费消息互不干扰。(2)Broker:Kafka服务节点。Broker可以理解为一个Kafka服务节点或服务进程(以下统称Broker节点)。多个Broker节点可以组成一个Broker集群。(3)Partition分区:Kafka定义了partition的概念。一个主题由一个或多个分区组成。Kafka将一个topic的消息划分为不同的partition,将不同的partition存储在不同的Broker中,从而实现分布式存储。(典型的数据分片思想),每个分区都有对应的下标,下标从0开始。(4)Replica副本:Kafka中每个分区都有一个或多个副本,包括1个leaderreplica和0个或多个followreplica。每个副本保存分区的所有内容。Kafka会将一个partition的不同副本保存到不同的Broker节点,以保证数据安全。Kafka副本同步机制将在本书后面详细分析。(5)AR(AssignedReplicas):分区的副本列表,即一个分区的所有副本所在的Brokers列表。(6)ISR:分区内所有与leader副本同步到一定程度(即不落后太多)的副本,将组成一个ISR(In-SyncReplicas)集合。ISR集包括一个leadercopy,可以理解为synchronizedcopy(不一定完全同步,但不要落后太多)。(7)ACK机制:ACK(消息确认)机制是消息系统中非常重要的机制。消息系统的ACK机制与HTTP的ACK机制非常相似。消息系统的ACK机制可以分为两部分:mBroker收到生产者发送的消息并成功存储这些消息后,向生产者返回一个成功的响应(可以理解为一种ACK)。这时生产者可以认为消息已经发送成功,否则生产者可能需要做一些补偿操作,比如重新发送消息。Consumer收到Broker投递的消息并成功处理后,返回消费成功响应给Broker。Broker收到消费成功响应后,就可以认为消费者消费成功了。否则,Broker可能需要做一些补偿操作,比如Redeliver消息。在这种场景下,消费者通常需要将消费成功消息的位置(或消息ID等)发送给Broker,Broker需要存储消费成功的位置,以便后续消费者继续消费重新启动后从此位置。这一幕也是我们关注的焦点。在Kafka中,每条消息都有一个偏移量。如果将Kafka主题理解为一个简单的消息数组,那么消息偏移量可以理解为消息在数组中的索引。consumer会将最新消费成功的消息的下一个offset发送给Broker(即offset之前的消息已经消费成功),Broker会存储这些offset来记录consumer的最新消费位置。为了描述方便,本书后面将消费者提交的ACK信息中的偏移量称为ACK偏移量。此外,Kafka和Pulsar都使用ZooKeeper来存储元数据并完成分布式协作等操作。ZooKeeper是一种分布式协作服务,专注于协调多个分布式进程之间的活动,可以帮助开发人员专注于应用程序。核心逻辑,而不必担心应用程序的分布式特性。下图展示了Kafka集群的基础架构:下面介绍Pulsar的基本概念(1)Pulsar订阅??组:Pulsar可以绑定多个消费者到一个订阅组,类似于Kafka的消费者组。也用前面“用户服务”的例子来说明。在Pulsar中,权限服务的所有消费者可以绑定一个权限订阅组rightsSubscription,权限服务的所有消费者可以绑定一个权限订阅组authoritySubscription,不同订阅组之间的Message消费互不干扰。(2)非分区主题和分区主题:Kafka中每个分区绑定一个Broker,Pulsar中每个主题绑定一个Broker,固定将某个主题的消息发送到对应的Broker节点。Pulsar也有“分区主题”的概念。一个分区主题由一组非分区内部主题组成(Pulsar中组成分区主题的非分区内部主题简称为内部主题),每个内部主题都绑定一个Broker。确定这样的分区主题可以向多个Broker发送消息,避免了Pulsar中单个主题的性能被单个Broker节点限制。(3)Broker:Pulsar集群中的服务节点。需要注意的是,由于Pulsar采用了计算和存储分离的架构,PulsarBroker节点只负责计算,不负责存储。PulsarBroker节点会完成数据检查、负载均衡等,并将消息转发给Bookie节点。(4)Bookie:Pulsar使用BookKeeper服务实现存储功能,BookKeeper中的节点称为Bookie节点。BookKeeper框架是一个分布式日志存储服务框架,本书后面会详细分析。Pulsar中的Bookie节点负责完成消息的存储工作。(5)Ledger:BookKeeper数据收集,生产者将数据写入Ledger,消费者从Ledger中读取数据。为了数据安全,BookKeeper会将一个Ledger的数据存储在多个Bookie节点中,实现数据备份。(6)Entry:Ledger中的数据单元,Ledger中的每条数据都是一个Entry。Ledger可以理解为账本,Entry是账本中的一个条目。(7)租户和命名空间:Pulsar定义了租户和命名空间的概念。Pulsar是一个多租户系统,将不同的资源分配给不同的租户,保证不同租户之间的数据相互隔离,互不干扰。这可以支持多个团队和多个用户同时使用一个Pulsar服务。每个租户还可以创建多个名称空间,这些名称空间是主题的逻辑分组。Pulsar可以理解为一个大房子,每个房客就是房子里的一个房间,这个房间的空间被划分成不同的区域(namespaces),不同的区域存储不同的对象。例如,用户服务可以创建一个租户“用户”来存储用户服务的消息。租户可以根据自己的业务场景创建多个命名空间来存储不同的主题,如下图所示。(8)Cluster集群:Pulsar为集群定义了一个Cluster的概念。每个PulsarBroker节点都运行在一个Cluster集群下,不同的Cluster集群之间可以相互复制数据,实现跨地域复制。(9)ACK机制:与Kafka类似,Pulsar也需要完成“Broker存储消息后向生产者返回成功响应”和“消费者成功处理消息后向Broker发送ACK”。Pulsar中的每条消息都有一个消息Id,Pulsar消费者会将消费成功的消息Id作为ACK请求的内容发送给Broker。下图显示了Pulsar集群的基础架构。