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方便做的更好一些。

  • 相关阅读:
    【原】WPF客户端只能启动一次
    【转载】U3D 游戏引擎之游戏架构脚本该如何来写
    【转载】u3d游戏客户端架构(---)
    【转载】asp.net 后台弹出提示框
    【转载】浅谈Excel开发:一 Excel 开发概述
    MyBatis 学习
    windows下关闭指定端口服务,解决tomcat端口占用问题
    中文用户名的js检验正则
    演讲稿
    面向对象和面向过程,python中的类class,python中程序的入口——main方法,
  • 原文地址:https://www.cnblogs.com/hzmark/p/pulsar.html
Copyright © 2011-2022 走看看