与Kafka/RocketMQ的比较
架构合理Kafka 采用计算与存储一体的架构,当 topic 数量较多时,Kafka 的存储机制会导致缓存污染,降低性能。
Pulsar 是云原生的分布式消息流平台,源于 Yahoo!,支持 Yahoo! 应用,服务 140 万个 topic,日处理超过 1000 亿条消息。
更多比较文章: https://blog.csdn.net/g6U8W7p06dCO99fQ3/article/details/116505708
Pulsar
支持多租户,通过多租户可为每个租户单独设置认证机制、存储配额、隔离策略等;
高吞吐、低延迟、高容错;
原生支持多集群部署,集群间支持无缝数据复制;
1、对Pulsar实例中的多个群集的本地支持,并且跨群集的消息进行无缝的地理复制。
2、极低的发布和端到端延迟。
3、高可扩展,能够支撑上百万个 topic。
4、一个具有Java,Go,Python和C ++绑定的简单客户端API。
5、主题的多种消息订阅模式(独占、共享、灾备、Key_Shared)。 ✔️✔️
6、由Apache BookKeeper提供的持久性消息存储保证了消息的传递。✔️
7、无服务器轻量级计算框架Pulsar Functions提供了用于流本机数据处理的功能。 ✔️✔️✔️
8、基于Pulsar Functions构建的无服务器连接器框架Pulsar IO使得更容易将数据移入和移出Apache Pulsar。 ✔️
9、当数据老化时,分层存储将数据从热/热存储卸载到冷/长期存储(例如S3和GCS)。 ✔️
Pulsar建立在发布-订阅模式(通常缩写为pub-sub)上。在这种模式下,生产者将消息发布到主题。消费者订阅这些主题,处理传入的消息,并在处理完成后发送确认。
创建订阅后,即使使用者断开连接,Pulsar也会保留所有消息。仅当使用者确认成功处理了这些消息时,才会丢弃保留的消息。
架构
Pulsar 采用计算与存储分离的架构。
虽然这样会增加系统的设计复杂性,但可以降低系统的耦合性,更易实现扩缩容、故障转移等功能。
无状态计算层由一组接收和投递消息的 broker 组成,broker 负责与业务系统进行通信,承担协议转换,序列化和反序列化、选主等功能。
有状态存储层由一组 bookie 存储节点组成,可以持久存储消息。
Pulsar 有 3 个重要组件:broker、Apache BookKeeper 和 Apache ZooKeeper。
Broker 是无状态服务,客户端需要连接到 broker 进行核心消息传递。
而 BookKeeper 和 ZooKeeper 是有状态服务。
Broker 主要由四个模块组成。我们可以根据实际需求对相应的功能进行二次开发。
- Dispatcher:调度分发模块,承担协议转换、序列化反序列化等。
- Load balancer:负载均衡模块,对访问流量进行控制管理。
- Global replicator:跨集群复制模块,承担异步的跨集群消息同步功能。
- Service discovery:服务发现模块,为每个 topic 选择无状态的主节点。
Pulsar 中持久层。Bookie 是 BookKeeper 的存储节点,提供独立的存储服务。ZooKeeper 为元数据存储系统,提供服务发现以及元数据管理服务。BookKeeper 架构属于典型的 slave-slave 架构,所有 bookie 节点的角色都是 slave,负责持久化数据,每个节点的处理逻辑都相同;BookKeeper 客户端为 leader 角色,承担协调工作,由于其本身无状态,所以可以快速实现故障转移。
组件
Pulsar To TiDB 组件
我们通过 Pulsar To TiDB 组件将抓取到的变更消息存储到 TiDB 中,对下游系统提供查询服务。这一组件的处理逻辑为:
- 使用灾备订阅方式,消费 Pulsar 消息。
- 根据消息的 key 进行哈希运算,将相同的 key 散列到同一持久化线程中。
- 启用 Pulsar 的消息去重功能,避免消息重复投递。假设 MessageID2 重复投递,那么数据一致性将被破坏。
参考文章:
- 作者:找不着学 链接:https://www.jianshu.com/p/7f76453a1f13
- 作者:StreamNative 链接:https://www.jianshu.com/p/f8c41fb28386
- 一致性问题处理 https://mp.weixin.qq.com/s/G3cvAnvL-zb5JV0e8G3k0A