终于放弃了kafka,选择了pulsar

关于

最近,俊瑶先生一直在研究 Pulsar.

俊瑶先生是一名 忠实的Kafka 的用户,为kafka填过几次文章,如:2018-12-01:kafka消息列队 ,同时也将kafka运用于多个项目实践中,上一个项目为一个招投标的订阅消息推送。俊瑶先生于今年1月份透过涂鸦iot平台关注到了Pulsar,当时很疑惑为什么涂鸦选择了Pulsar,于是开展了长达3个月断断续续调研。期间不乏将外网所有Pulsar的文章都看了一遍,许多pulsar文章都与kafka进行了深入的对比
otIEmm

为什么Pulsar

G8gwE2 构建消息基础设施的第一步是选择合适的消息中间件技术。在这方面有很多选择,从各种开源框架(如 RabbitMQ、ActiveMQ、NATS)到一些商用产品(如 IBM MQ 或者 RedHat AMQ)。当然,除了这些之外,我们还有 Kafka。不过,我最后并没有选择使用已久的Kafka,而是选择了 Pulsar。

与Kafka对比

WLgzG8

模型概念

  • Kafka: Producer - topic - consumer group - consumer
  • Pulsar: Producer - topic - subscription - consumer

消费模式

  • Kafka: 主要集中在流(Stream)模式,对单个 partition 是独占消费,没有共享(Queue)的消费模式;
  • Pulsar:提供了统一的消息模型和 API。流(Stream)模式——独占和故障切换订阅方式;队列(Queue)模式——共享订阅的方式。

消息确认(Ack)

  • Kafka: 使用偏移 Offset;
  • Pulsar:使用专门的 Cursor 管理。累积确认和 Kafka 效果一样;提供单条或选择性确认。

消息保留

  • Kafka:根据设置的保留期来删除消息。有可能消息没被消费,过期后被删除。 不支持 TTL。
  • Pulsar:消息只有被所有订阅消费后才会删除,不会丢失数据。也允许设置保留期,保留被消费的数据。支持 TTL。

详细的消费模式和消息确认请参考:pulsar的消费模式

Pulsar的系统架构和设计理念

Pulsar 的分层架构

xgcpzq

Broker层(或无状态服务层)架构

j88ypw

架构上 Pulsar 和 Kafka 的对比

Apache Kafka 是以分区为存储中心,而 Apache Pulsar 是以 Segment 为存储中心。如下图:
mHIByg

  • 在 Apache Kafka 中,分区只能存储在单个节点上并复制到其他节点,其容量受最小节点容量的限制。这意味着容量扩展需要对分区重新平衡,这反过来又需要重新复制整个分区,以平衡新添加的代理的数据和流量。重新传输数据非常昂贵且容易出错,并且会消耗网络带宽和 I/O。维护人员在执行此操作时必须非常小心,以避免破坏生产系统。
  • Kafka 中分区数据的重新拷贝不仅发生在以分区为中心的系统中的群集扩展上。许多其他事情也会触发数据重新拷贝,例如副本故障,磁盘故障或计算机的故障。在数据重新复制期间,分区通常不可用,直到数据重新复制完成。例如,如果您将分区配置为存储为 3 个副本,这时,如果丢失了一个副本,则必须重新复制完整个分区后,分区才可以再次可用。

Pulsar的无缝Broker故障恢复

下图说明了 Pulsar 如何处理 Broker 失败的示例。 在例子中 Broker 2 因某种原因(例如停电)而断开。 Pulsar 检测到 Broker 2 已关闭,并立即将 Topic1-Part2 的所有权从 Broker 2 转移到 Broker 3。在 Pulsar 中数据存储和数据服务分离,所以当代理 3 接管 Topic1-Part2 的所有权时,它不需要复制 Partiton 的数据。 如果有新数据到来,它立即附加并存储为 Topic1-Part2 中的 Segment x + 1。 Segment x + 1 被分发并存储在 Bookie1, 2 和 4 上。因为它不需要重新复制数据,所以所有权转移立即发生而不会牺牲主题分区的可用性。
cAIxTI

Pulsar的无缝存储(Bookie)故障恢复

下图说明了 Pulsar(通过 Apache BookKeeper)如何处理 bookie 的磁盘故障。 这里有一个磁盘故障导致存储在 bookie 2 上的 Segment 4 被破坏。Apache BookKeeper 后台会检测到这个错误并进行复制修复。
uFhIki
Apache BookKeeper 中的副本修复是 Segment(甚至是 Entry)级别的多对多快速修复,这比重新复制整个主题分区要精细,只会复制必须的数据。 这意味着 Apache BookKeeper 可以从 bookie 3 和 bookie 4 读取 Segment 4 中的消息,并在 bookie 1 处修复 Segment 4。所有的副本修复都在后台进行,对 Broker 和应用透明。
即使有 Bookie 节点出错的情况发生时,通过添加新的可用的 Bookie 来替换失败的 Bookie,所有 Broker 都可以继续接受写入,而不会牺牲主题分区的可用性。

经过调研及等待时机:终于来了一个场景是非常适合使用pulsar

本篇将记录下pulsar使用过程遇到的问题及过程。

安装篇

首先我需要有一个mac本地环境进行pulsar进行调试,以及一个线上的linux正式环境进行部署上线.同时俊瑶先生本次使用的nodejs的pulsar版本。
根据官方文档 pulsar安装文档,要使用pulsar的nodejs版本,需要安装Pulsar C++库.

安装 C++库请阅读文档 Pulsar C++ client

mac安装

mac安装的时候,务必安装xcode,如果是beta版本的,务必指定选择xcode的beta,从而达到装mac C++的要求,也即gcc
然后通过brew安装libpulsar
brew install libpulsar
全局安装 pulsar-client
npm install pulsar-client -g

linux安装

linux服务器采用ubuntu,下载Debian package
并通过 apt install ./apache-pulsar-client*.deb进行安装

client

client-devel

实践使用

TODO: