zoukankan      html  css  js  c++  java
  • Apache Pulsar简介

    Apache Pulsar

    What is Pulsar

    "Pulsar is a distributed pub-sub messaging platform with a very flexible messaging model and an intuitive client API."

    Pulsar是pub-sub模式的分布式消息平台,拥有灵活的消息模型和直观的客户端API。

    Pulsar由雅虎开发并开源的下一代消息系统,目前是Apache软件基金会的孵化器项目。

    概念

    Topic

    Topic是Pulsar的核心概念,表示一个“channel”,Producer可以写入数据,Consumer从中消费数据(Kafka、RocketMQ都是这样)。

    Topic名称的URL类似如下的结构:

    {persistent|non-persistent}://tenant/namespace/topic
    • persistent|non-persistent表示数据是否持久化(Pulsar支持消息持久化和非持久化两种模式)
    • Tenant为租户
    • Namespace一般聚合一系列相关的Topic,一个租户下可以有多个Namespace
    租户和Namespace

    上图中Property即为租户,每个租户下可以有多个Namespace,每个Namespace下有多个Topic。

    Namespace是Pulsar中的操作单元,包括Topic是配置在Namespace级别的,包括多地域复制,消息过期策略等都是配置在Namespace上的。

    订阅模型

    Pulsar提供了灵活的消息模型,支持三种订阅类型:

    • Exclusive subscription:排他的,只能有一个Consumer,接收一个Topic所有的消息
    • Shared subscription:共享的,可以同时存在多个Consumer,每个Consumer处理Topic中一部消息(Shared模型是不保证消息顺序的,Consumer数量可以超过分区的数量)
    • Failover subscription:Failover模式,同一时刻只有一个有效的Consumer,其余的Consumer作为备用节点,在Master Consumer不可用后进行替代(看起来适用于数据量小,且解决单点故障的场景)

    分区

    为了解决吞吐等问题,Pulsar和Kafka一样,采用了分区(Partition)的机制。

    Pulsar提供了一些策略来处理消息到Partition的路由(MessageRouter):

    • Single partitioning:Producer随机选择一个Partition并将所有消息写入到这个分区
    • Round robin partitioning :采用Round robin的方式,轮训所有分区进行消息写入
    • Hash partitioning:这种模式每条消息有一个Key,Producer根据消息的Key的哈希值进行分区的选择(Key相同的消息可以保证顺序)。
    • Custom partitioning:用户自定义路由策略

    不同于别的MQ系统,Pulsar允许Consumer的数量超过分区的数量(对于RocketMQ,超过分区数的Consumer会分配不到分区而“空跑”)。

    在Shared subscription的订阅模式下,Consumer数量可以大于分区的数量,每个Consumer处理每个Partition中的一部分消息,不保证消息的顺序。

    持久化

    Pulsar通过BookKeeper来存储消息,保证消息不会丢失(BookKeeper:A scalable, fault-tolerant, and low-latency storage service optimized for real-time workloads)。

    架构

    Pulsar采用“存储和服务分离”的两层架构(这是Pulsar区别于其他MQ系统最重要的一点,也是所谓的“下一代消息系统”的核心):

    • Broker:提供发布和订阅的服务(Pulsar的组件)
    • Bookie:提供存储能力(BookKeeper的存储组件)

    优势是Broker成为了stateless的组件,可以水平扩容(RocketMQ的Broker是包含存储的,是有状态的,Broker的扩容更像是“拆分”)。高可靠,一致性等通过BookKeeper去保证。

    上图是Pulsar Cluster的架构:

    • 采用ZooKeeper存储元数据,集群配置,作为coordination
      • local zk负责Pulsar Cluster内部的配置等
      • global zk则用于Pulsar Cluster之间的数据复制等
    • 采用Bookie作为存储设备(大多数MQ系统都采用本地磁盘或者DB作为存储设备)
    • Broker负责负载均衡和消息的读取、写入等
    • Global replicators负责集群间的数据复制
    GEO-REPLICATOIN

    多个Broker节点组成一个Pulsar Cluster;多个Pulsar Cluster组成一个Pulsar Instance。

    Pulsar通过GEO-REPLICATION支持一个Instance内在不同的地域发送和消费消息。

    上图中,Producer P1、P2、P3在不同的Cluster发送给Topic T1的消息,会在Cluster之间进行复制,Consumer C1、C2可以在自己所在的Cluster消费到所有的消息。

    当消息被写入Pulsar时,首先消息被持久化在local cluster,之后异步的发送到其他cluster。在没有链接问题的情况下,通常复制的latency相近于网络的RTT。

    Pulsar的应用

    • 作为普通的Pub-Sub模型的消息队列使用,类似于RocketMQ
    • 支持Function(Stream),整合到Stream平台

    Pulsar VS RocketMQ

     RocketMQPulsar
    架构 单层架构,Broker服务也负责存储 存储和服务分离,Broker负责提供服务,BookKeeper提供存储能力
    存储 Master-Slave结构 BookKeeper,高可用存储
    多域部署 GEO-REPLICATION
    订阅模式 集群消费、广播消费 Exclusive、Shared、Failover三种模式
    Stream 不支持 支持
    ACK cumulative ack individual & cumulative ack
    顺序消息 支持 支持
    事务消息 支持
    二级消息 支持
    定时消息 支持

    总结

    主要是简单的介绍了Pulsar的概念和架构,最重要的是去理解“存储和服务”分离的两层架构。之后和Rocket进行了对比,RocketMQ提供了更多消息领域的能力比比如事务消息、定时消息等等,而Pulsar在Streaming方便做的更好一些。

  • 相关阅读:
    UVa 10118 记忆化搜索 Free Candies
    CodeForces 568B DP Symmetric and Transitive
    UVa 11695 树的直径 Flight Planning
    UVa 10934 DP Dropping water balloons
    CodeForces 543D 树形DP Road Improvement
    CodeForces 570E DP Pig and Palindromes
    HDU 5396 区间DP 数学 Expression
    HDU 5402 模拟 构造 Travelling Salesman Problem
    HDU 5399 数学 Too Simple
    CodeForces 567F DP Mausoleum
  • 原文地址:https://www.cnblogs.com/hzmark/p/pulsar.html
Copyright © 2011-2022 走看看