本文翻译自 StreamNative 博客《Understanding Pulsar in 10 Minutes: A Guide for Kafka Users》,作者 Elliot West,StreamNative 软件工程师。本文由 StreamNative 组织翻译。
译者简介
王中兴,社区昵称 AlphaWang,就职于 eBay 消息中间件。
本文将结合你现有的 Apache Kafka 知识来带你入门 Apache Pulsar[1]。我们将展示 Apache Kafka 的基本概念是如何映射到 Apache Pulsar 中的,这样你就能够通过已有的 Kafka 知识快速上手 Pulsar 中类似的使用场景。
Apache Pulsar 为成熟的 Apache Kafka[2] 生态提供了一个非常有吸引力的替代选择。Pulsar 中的差异化功能及架构可以克服 Kafka 中的种种限制。虽然 Kafka 和 Pulsar 都是高度可扩展以及持久化的分布式事件流平台,但是它们又有许多不同之处。例如,Pulsar 可以提供灵活的订阅、统一的流和消息、以及分离存储等等。
我有幸使用过 Apache Kafka 许多年,将其作为企业级平台提供给数据科学家、工程师和分析师使用。因此,我遇见过多种多样的 Kafka 使用场景,并接触过 Kafka 生态系统的多个方面。当我加入 StreamNative[3] 团队并使用 Pulsar 时,我想看看我的 Kafka 经验在 Pulsar 环境下会是什么样子。本文的阅读前提是你对 Kafka 已经有一定的理解,因为我不会从头开始讲解诸如主题等基本概念。本文不会对比平台的功能,而是专注于从生产者和消费者的角度讲解 Pulsar 如何实现与 Kafka 类似的功能。
注:本文不会讨论 Pulsar 的 Kafka 插件协议(KoP[4]),KoP 将 Pulsar 封装起来,直接使用 Broker 的资源使现有的 Kafka 客户端和 Pulsar 进行交互,使得客户端就好像是在和 Kafka Broker 交互一样。
让我们先从主题开始,因为主题是 Kafka 和 Pulsar 中最基本的概念。你可以把 Pulsar 主题看作是单个 Kafka 主题分区。这里你可能会对性能有疑问,因为多分区是 Kafka 横向扩展能力的原因所在。不过不用担心,Pulsar 在主题的基础上提供了一个类似的概念,即“分区主题[5]”。在分区主题中,一组 Pulsar 主题在逻辑上被分成一组,实现与 Kafka 分区主题类似的功能。之所以存在这种区别,是因为 Pulsar 除了支持 Kafka 所针对的流式处理场景之外,还支持传统消息架构,而非分区主题是传统消息架构中的基本组件。由于我们关注的是 Kafka 使用场景,因此在下文中我们假设主题一词表示 Pulsar 分区主题,或者说 Kafka 主题。
- PulsarAdmin admin = ...;
- admin.topics().createPartitionedTopic(topic, partitions);
与 Kafka 相比,Pulsar 在消息生命周期方面拥有更大的灵活性。默认情况下,Pulsar 会永远保留所有未确认消息,并立即删除已确认消息。当然,这两个行为[6]均可调整,可以通过设置消息保留时间来保留已确认消息,通过设置消息过期时间来清除未确认消息。
而 Kafka 的保留策略则不关心消费者活动,消息是被持久化还是被清除完全与消费者是否消费过无关。用户也许不希望在 Pulsar 中复制 Kafka 的这种行为,因为这样一来消息保留策略的灵活性就更小了。不过为了学习的目的,我们还是来看看如何实现这一点。首先,我们来针对被所有消费者都确认过的消息设置保留策略。
- PulsarAdmin admin = ...;
- admin.topicPolicies().setRetention(
- “topic-name”,
- new RetentionPolicies(sizeInMins, sizeInMB)
- );
然后设置未确认消息的过期时间:
- admin.topicPolicies().setMessageTTL(
- “topic-name”,
- messageTTLInSeconds
- );
与 Kafka 一样,Pulsar 也支持对主题进行压实(Compaction)。然而其内部实现略有不同,Pulsar 同时维护着未压实和已压实的数据。在压实过程中会产生一个新的已压实 Ledger,而原有的已压实 Ledger 会被丢弃。