-
介绍
Kafka和Pulsar是两种分布式消息流平台,主要用于实现大规模数据流处理和订阅/发布模型。
Kafka是由LinkedIn公司开发的一种分布式消息系统,支持高吞吐量的数据流处理。Kafka拥有高可用性和扩展性,适用于数据量巨大的场景。
Pulsar是由Apache Software Foundation开发的一种开源的分布式消息流平台,拥有高效的存储和发布/订阅功能。Pulsar的特点是支持多种数据模型(如消息、流、固定文件),并支持实时数据处理。
总的来说,Kafka和Pulsar都是优秀的分布式消息流平台,适用于不同的场景。企业选择具体使用哪个平台,取决于其业务需求和技术要求。 -
基础功能
消息发布/订阅:支持消息的发布和订阅,以实现数据的实时传输。
分布式架构:支持分布式架构,可以扩展数据处理能力。
数据持久化:支持数据持久化,保证数据不丢失。
数据负载均衡:支持数据负载均衡,以提高数据处理效率。
高吞吐量:支持高吞吐量的数据处理,适用于数据量巨大的场景。
数据备份:支持数据备份,以保证数据安全。
数据消费者位置记录:支持记录消费者的位置,以实现容错和故障恢复。
数据流处理:支持数据流的处理,以实现实时的数据处理。 -
特性
Kafka:
高吞吐量:Kafka支持高吞吐量的数据处理,适用于数据量巨大的场景。
分布式架构:Kafka拥有分布式架构,支持数据的分布式处理和存储。
数据持久化:Kafka支持数据的持久化,保证数据不丢失。
可扩展性:Kafka可以通过扩展集群来提高处理能力。
Pulsar:
多种数据模型:Pulsar支持多种数据模型(如消息、流、固定文件),更适用于多种数据类型的场景。
高效存储:Pulsar拥有高效的存储功能,支持大量数据的存储。
实时数据处理:Pulsar支持实时数据处理,以实现数据的实时分析。
可扩展性:Pulsar支持水平扩展,可以通过增加节点来提高处理能力。
总体来说,Kafka更适用于数据量巨大的场景,而Pulsar更适用于多种数据类型的场景。实际使用中,应根据具体业务需求来选择使用Kafka或Pulsar。 -
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机制非常类似。
架构图:

-
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。
架构图:

-
消息系统ACK机制
ACK(Acknowledgment)是消息系统中的确认机制,用于保证消息的可靠传递。
在消息系统中,生产者发送的消息需要被消费者接收并确认,ACK机制就是用来实现这个过程的。
消息系统通常使用两种ACK机制:
At-least-once ACK:生产者在收到消费者的确认后才认为消息已经成功发送,如果消费者未确认,生产者会重试发送消息。
Exactly-once ACK:保证消息仅被消费者接收一次,通常使用事务来实现。