架构图
多租户支持
Pulsar 支持多租户,即允许不同的用户共享同一个集群而互不干扰。这种能力在一些场景下是非常有用的,例如云服务提供商需要为多个客户提供消息服务的情况。Kafka 没有原生的多租户支持,尽管可以通过一些工具和技巧来实现。
灵活的消息传递保证
Pulsar 提供了灵活的消息传递保证,例如在多副本集群中,可以通过配置来控制消息的复制和确认方式。Pulsar 也支持多种消息传递保证,例如精确一次和至少一次。Kafka 提供的消息传递保证比较简单,只有精确一次和至少一次两种方式可选。
Pulsar 提供了更灵活的消息传递保证,这是由于其架构设计的差异。
在 Pulsar 中,每个 Topic 都被划分为一个或多个 Partition,每个 Partition 都有多个副本,这些副本被分布在不同的 Broker 上。当 Producer 发布消息时,消息会被写入所有 Partition 的主副本。主副本将消息写入本地的 Apache BookKeeper 中,并等待其他副本复制消息。在 Pulsar 中,副本之间的同步可以使用两种方式:同步复制和异步复制。同步复制意味着在主副本收到消息后,需要等待所有副本确认收到消息,这种方式可以提供精确一次的消息传递保证。异步复制意味着主副本只需要写入本地 Apache BookKeeper,而不必等待所有副本确认收到消息,这种方式可以提供至少一次的消息传递保证。
Pulsar 允许在每个 Partition 上配置不同的消息传递保证,即每个 Partition 可以使用不同的复制策略和消息确认方式。这种灵活性允许应用程序选择最适合自己需求的消息传递保证。例如,对于实时计算应用程序,可能更适合使用异步复制和至少一次的消息传递保证,因为它们更注重吞吐量而不是精确性。而对于金融交易等关键应用程序,可能需要精确一次的消息传递保证来确保消息的可靠传递。
相比之下,Kafka 只提供了两种消息传递保证:至少一次和精确一次。Kafka 中的 Partition 只能使用一种消息传递保证。因此,如果应用程序需要不同的消息传递保证,可能需要创建多个 Topic 或手动处理消息传递的确认逻辑。这在一些场景下可能会造成额外的开销和复杂性。
更强的一致性保证
Pulsar 通过 Apache BookKeeper 提供更强的一致性保证,比 Kafka 使用的 ZooKeeper 更为可靠。这意味着在出现节点故障或网络分区等情况时,Pulsar 能够更好地保证消息的可靠传递。
BookKeeper 在可靠性方面比 ZooKeeper 更为优秀的原因主要有以下几点:
- 数据复制方式:ZooKeeper 是将数据存储在内存中,而 BookKeeper 将数据存储在磁盘上。由于磁盘比内存更加可靠,因此 BookKeeper 能够更好地保证数据的可靠性。此外,BookKeeper 还使用了多副本的方式进行数据复制,即将数据复制到多个物理节点上,以提供数据的冗余备份。这使得 BookKeeper 在出现节点故障或数据损坏等情况时,能够更好地保证数据的可靠性和可恢复性。
- 容错能力:ZooKeeper 在节点故障和网络分区等情况下,可能会出现脑裂现象,导致数据不一致和服务不可用等问题。而 BookKeeper 使用了多数派投票的方式来保证系统的容错性,即在任何时候,只有多数节点处于正常状态,系统才能正常运行。这种机制使得 BookKeeper 能够更好地处理节点故障和网络分区等问题,保证数据的一致性和可靠性。
- 可扩展性:ZooKeeper 的性能和可扩展性在大规模集群上可能会受到限制。而 BookKeeper 的性能和可扩展性比较优秀,能够轻松地处理大规模数据集群和高并发的请求。这使得 BookKeeper 能够更好地支持高吞吐量的分布式存储场景。
更好的可扩展性
Pulsar 的体系结构设计更为灵活,使得它在可扩展性方面具有优势。Pulsar 的多租户、多命名空间和多个独立的 Topic 存储单元使得它更容易进行集群规模的水平扩展,而 Kafka 则需要手动分区和副本分配。