这是我参与「第五届青训营 」笔记创作活动的第3天
Apache Pulsar为成熟的Apache Kafka生态提供了一个非常有吸引力的替代选择。Pulsar中的差异化功能及架构可以克服 Kafka 中的种种限制。虽然 Kafka 和 Pulsar 都是高度可扩展以及持久化的分布式事件流平台,但是它们又有许多不同之处。例如,Pulsar 可以提供灵活的订阅、统一的流和消息、以及分离存储等等。
Topic
让我们先从Topic开始,因为Topic是 Kafka 和 Pulsar 中最基本的概念。你可以把 Pulsar Topic看作是单个 Kafka Topic分区。这里你可能会对性能有疑问,因为多分区是 Kafka 横向扩展能力的原因所在。不过不用担心,Pulsar 在Topic的基础上提供了一个类似的概念,即“分区主题”。在分区主题中,一组 Pulsar Topic在逻辑上被分成一组,实现与 Kafka 分区主题类似的功能。之所以存在这种区别,是因为 Pulsar 除了支持 Kafka 所针对的流式处理场景之外,还支持传统消息架构,而非分区主题是传统消息架构中的基本组件。由于我们关注的是 Kafka 使用场景,因此在下文中我们假设Topic一词表示 Pulsar 分区主题,或者说 Kafka 主题。
Topic保留策略
与 Kafka 相比,Pulsar 在消息生命周期方面拥有更大的灵活性。默认情况下,Pulsar 会永远保留所有未确认消息,并立即删除已确认消息。当然,这两个行为均可调整,可以通过设置消息保留时间来保留已确认消息,通过设置消息过期时间来清除未确认消息。
而 Kafka 的保留策略则不关心消费者活动,消息是被持久化还是被清除完全与消费者是否消费过无关。用户也许不希望在 Pulsar 中复制 Kafka 的这种行为,因为这样一来消息保留策略的灵活性就更小了。
Topic压实
与 Kafka 一样,Pulsar 也支持对Topic进行压实(Compaction)。然而其内部实现略有不同,Pulsar 同时维护着未压实和已压实的数据。在压实过程中会产生一个新的已压实 Ledger,而原有的已压实 Ledger 会被丢弃。 正因为同时存储了未压实和已压实数据,消费者可以根据使用场景决定消费任何一种数据,只需简单的配置即可。
Pulsar 也有类似于 Kafka 的消息删除语义。只需发布一个带有空值的墓碑消息,在下一个压实周期中就会删除对应的 key 值消息。除了基于 key 的删除,Kafka 还支持针对Topic压实指定保留时间。例如,你可以指定无期限保留,始终保持所有 key 的最新消息,提供类似于键值存储的存储语义。或者,你也可以指定一个保留期,这样消息就会以 TTL 的方式过期。
Pulsar 在这方面的灵活性则稍差一些。要想从已压实 Ledger 中删除消息,就只能通过显式的基于 key 的删除,否则 Pulsar 默认保留所有 key 的最新消息。Pulsar 的Topic压实也可以设置保留策略,但这只适用于未压实 Ledger,即未压实的消息。鉴于这一限制,在考虑 key 基数时必须格外小心。如果需要指定已压实 Ledger 的消息 TTL,那么就有必要通过手动流程来标记和删除消息。