Apache Pulsar入门指南

这篇具有很好参考价值的文章主要介绍了Apache Pulsar入门指南。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.概述

Apache Pulsar 是灵活的发布-订阅消息系统(Flexible Pub/Sub messaging),采用计算与存储分离的架构。雅虎在 2013 年开始开发 Pulsar ,于 2016 年首次开源,目前是 Apache 软件基金会的顶级项目。Pulsar 具有支持多租户、持久化存储、多机房跨区域数据复制、高吞吐、低延迟等特性。

2.Pulsar 组件

Pulsar 集群主要由以下三部分组成:

  • Broker:Pulsar 的 broker 是一个无状态组件,本身不存储数据。主要负责处理 producer 和 consumer的请求,消息的复制与分发,数据的计算。
  • Zookeeper:主要用于存储元数据、集群配置,任务的协调(例如哪个 broker 负责哪个
    topic),服务的发现(例如 broker 发现 bookie 的地址)。
  • Bookeeper:主要用于数据的持久化存储。除了消息数据,cursors 也会被持久化到 Bookeeper,cursors 是消费端订阅消费的位移。Bookeeper 中每一个存储节点叫做 bookie。

Apache Pulsar入门指南

3. Pulsar 基本概念

Producer & Consumer
身为⼀个 Pub/Sub 系统,⾸先的存在要素必然是 producer(⽣产者)。producer 发送数据给 Pulsar,将消息以 append 的形式追加到 topic 中。发送的数据是 key/value 形式的,并且数据会上 schema 的信息。Pulsar 会确保⼀个 producer 往 topic 发送的消息满⾜⼀定的 schema 格式。
Apache Pulsar入门指南
既然有 producer 负责生产消息,那么相应地就有 consumer 负责消费消息。在 Pulsar 中 consumer 可以使用不同的订阅模式来接受消息。

Subscription
Pulsar ⾥将 consumer 接收消息的过程称之为:subscription(订阅),类似于 Kafka 的 consumer group(消费组)。⼀个订阅⾥的所有 consumer,会作为⼀个整体去消费这个 topic ⾥的所有消息。Pulsar 有四种订阅模式:独占(exclusive)、故障转移(failover)、共享(shared)、共享键(key_shared)。

Exclusive
在 exclusive 模式下,一个 subscription 只允许被一个 consumer 用于订阅 topic ,如果多个 consumer 使用相同的 subscription 去订阅同一个 topic,则会发生错误。exclusive 是默认的订阅模式。如下图所示,Consumer A-0 和 Consumer A-1 都使用了相同的 subscription(相同的消费组),只有 Consumer A-0 被允许消费消息。
Apache Pulsar入门指南
Failover
在 failover 模式下,多个 consumer 允许使用同一个 subscription 去订阅 topic。但是对于给定的 topic,broker 将选择⼀个 consumer 作为该 topic 的主 consumer ,其他 consumer 将被指定为故障转移 consumer 。当主 consumer 失去连接时,topic 将被重新分配给其中⼀个故障转移 consumer ,⽽新分配的 consumer 将成为新的主 consumer 。发⽣这种情况时,所有未确认的消息都将传递给新的主 consumer ,这个过程类似于 Kafka 中的 consumer 组重平衡(rebalance)。

如下图所示,Consumer B-0 是 topic 的主 consumer ,当 Consumer B-0 失去连接时,Consumer B-1 才能成为新的主 consumer 去消费 topic。
Apache Pulsar入门指南
Shared
在 shared 模式下,多个 consumer 可以使用同一个 subscription 去订阅 topic。消息以轮询的方式分发给 consumer ,并且每条消费仅发送给一个 consumer 。当有 consumer 失去连接时,所有发送给该 consumer 但未被确认的消息将被重新安排,以便发送给该 subscription 上剩余的 consumer 。

如下图所示,Consumer C-1,Consumer C-2,Consumer C-3 以轮询的方式接受消息。
Apache Pulsar入门指南
shared 模式有以下限制:

  • 消息不能保证有序。
  • 不支持批量 ack。

Key_Shared
key_shared 是 Pulsar 2.4.0 以后⼀个新订阅模式。在 shared 模式下,多个 consumer 可以使用同一个 subscription 去订阅 topic。消息按照 key 分发给 consumer ,含有相同 key 的消息只被发送给同一个 consumer 。

如下图所示,不同的 consumer 只接受到对应 key 的消息。
Apache Pulsar入门指南
key_shared 模式有以下限制:

  • 需要为每条消息指定一个 key 或者 orderingKey。
  • 不支持批量 ack。
  • producer 应该禁用 batch 或者使用基于
    key 的 batch。

Cursor
cursor 是用来存储一个 subscription 中消费的状态信息(类似 Kafka 中的 offset,偏移量)。Pulsar 将 subscription 的 cursor 存储至 BookKeeper 的 ledger 中。
Apache Pulsar入门指南
存储模型

  • 第一层抽象是 topic(partition),topic 是一个逻辑的概念,topic 是消息的集合,所有⽣产者的消息,都会归属到指定的
    topic ⾥。所有在 topic ⾥的消息,会按照⼀定的规则,被切分成不同的分区(partition)。在 Kafka 中
    partition 是真正的物理单元,但是在 Pulsar 中 partition 仍然是一个逻辑的概念。
  • Pulsar 把 partition 进一步分成多个分片(segment),segment 是 Pulsar
    中真正的物理单元,Pulsar 中的数据是持久化在 Bookeeper 中的,segment 其实对应的就是 Bookeeper 中的
    ledger。
  • 在分片中存储了更小粒度的 entry,entry 存储的是一条或者一个 batch 的消息,batch 是一次性批量提交多条消息。
    Apache Pulsar入门指南
    ⽽最底层的 message 通常包含 Message ID,由以下几个部分组成:
  • partition-index
  • ledger-id(segment)
  • entry-id
  • batch-index

Broker
Pulsar 中的 broker 是无状态的,不存储数据,真正的数据存储在 Bookeeper 上。每个 topic 的 partition 都会分配到某一个 borker 上,producer 和 consumer 则会连接到这个 broker,从而向该 topic 的 partition 发送和消费消息。broker 主要负责消息的复制与分发,数据的计算。
Apache Pulsar入门指南
Namespace & Tenant
Pulsar 从一开始就支持多租户,topic 的名称是层级化的,最上层是租户(tenant),然后是命名空间(namespace),最后才是 topic。

{persistent|non-persistent}://tenant/namespace/topic
  • 租户可以跨集群分布,每个租户都可以有单独的认证和授权机制。租户也是存储配额、消息 TTL 和隔离策略的管理单元。
  • 命名空间是租户的管理单元,命名空间上配置的策略适用于在该命名空间中创建的所有 topic。租户可以使用 REST API 和
    pulsar-admin CLI 工具来创建多个命名空间。
  • persistent|non-persistent 标识了 topic 的类型,默认情况下 topic 是持久化存储到磁盘上的。
    Apache Pulsar入门指南

Ack 机制
在 Pulsar 中支持了两种 ack 的机制,分别是单条 ack 和批量 ack。单条 ack(AckIndividual)是指 consumer 可以根据消息的 messageID 来针对某一个特定的消息进行 ack 操作;批量 ack(AckCumulative)是指一次 ack 多条消息。

消息生命周期
默认情况下,Pulsar Broker 会对消息做如下处理:

  • 当消息被 consumer 确认之后,会立即执行删除操作。
  • 对于未被确认的消息会存储到 backlog 中。

但是,很多线上的生产环境下,这种默认行为并不能满足我们的生产需求,所以,Pulsar 提供了
如下配置策略来覆盖这些行为:

  • Retention 策略:用户可以将 consumer 已经确认的消息保留下来。
  • TTL 策略:对于未确认的消息,用户可以通过设置 TTL 来使未确认的消息到达已经确认的状态。

上述两种策略的设置都是在NameSpace 的级别进行设置。

Backlog
backlog 是未被确认的消息的集合,它有一个大前提是,这些消息所在的 topic 是被 broker 所持久化的,在默认情况下,用户创建的 topic 都会被持久化。换句话说,broker 会将所有未确认或者未处理的消息都存放到 backlog 中。

需要注意的是,对 backlog 进行配置时,我们需要明确以下两点:

  • 在当前的 namespace 下,每一个 topic 允许 backlog 的大小是多少。
  • 如果超过设定的 backlog 的阈值,将会执行哪些操作。

当超过设定的 backlog 的阈值,Pulsar 提供了以下三种策略供用户选择:
Apache Pulsar入门指南
Retention
Retention 策略的设置提供了两种方式:

  • 消息的大小,默认值:defaultRetentionSizeInMB=0
  • 消息被保存的时间,默认值:defaultRetentionTimeInMinutes=0
    Apache Pulsar入门指南
    Time To Live(TTL)
    TTL 参数就像附在每条消息上的秒表,用于定义允许消息停留在未确认状态的时间。当 TTL 过期时,Pulsar 会自动将消息更改为已确认状态(并使其准备删除)。TTL 只去处理一件事情,就是将未被确认的消息变为被确认的状态,TTL 本身不会去涉及相应的删除操作。
    Apache Pulsar入门指南
    消息写入流程
    producer 向 topic 的 partition 对应的 broker 发送消息。broker 以并行的方式将消息写到多个 bookie 中,当指定数量的 bookie 写入成功时,broker 会向 producer 响应消息写入成功。
    Apache Pulsar入门指南
    消息读取流程
    consumer 向订阅 topic 的 partition 对应的 broker 请求消息,如果消息在 broker 的缓存中存在,则 broker 直接将消息返回给 consumer 。如果缓存中不存在,broker 去 bookie 中读取消息,然后返回给 consumer 。consumer 在完成消费后,向 broker 响应 ack 表示完成消费。consumer ack 的元数据也是会持久化在 bookie 中的。
    Apache Pulsar入门指南

4.Pulsar vs Kafka

数据存储

  • Kafka 的服务层和存储层位于同一节点上,broker 负责数据的计算与存储。
  • Pulsar 的架构将服务层与存储层解耦:无状态 broker 节点负责数据服务;bookie 节点负责数据存储。
  • 另外 Pulsar 还支持分层存储,如主存储(基于 SSD)、历史存储(S3)等。可以将访问频率较低的数据卸载到低成本的持久化存储(如
    AWS S3、Azure 云)中。

存储单元:文章来源地址https://www.toymoban.com/news/detail-457448.html

  • Kafka 和 Pulsar 都有类似的消息概念,客户端通过主题与消息系统进行交互,每个主题都可以分为多个分区。Pulsar 和Kafka 之间的根本区别在于 Kafka 是以分区(partition)作为数据的存储单元,而 Pulsar是以分片(segment)作为为数据的存储单元。
  • 在 Kafka中,分区只能存储在单个节点上并复制到其他节点,其容量受最小节点容量的限制。当对集群进行扩容时或者发送副本故障时,会触发数据的拷贝,这将耗费很长的时间。
  • 在 Pulsar 中,同样是以分区作为为逻辑单元,但是是以 segment为物理存储单元。分区随着时间的推移会进行分段,并在整个集群中均衡分布,能够有效迅速地扩展。
    Apache Pulsar入门指南
    名词对应表
    根据个人对 Pulsar 和 Kafka 的理解,整理如下 Pulsar 和 Kafka 的名词对应表:
Pulsar Kafka
Topic Topic
Partition Partition
Segment(Ledger) Segment
Bookie Broker
Broker Client SDK
Write Quorum Size (Qw) Replica Number
Ack Quorum Size (Qa) request.required.acks
  • Pulsar 和 Kafka 都是以 topic 描述一个基本的数据集合,topic 数据又逻辑分为若干个 partition。
  • 但 Kafka 以 partition 作为物理存储单位,每个 partition 必须作为一个整体(一个目录)存储在某一个 broker上,虽然 Kafka 也会将一个 partition 分成多个 segment,但是这些 segment 是存在 Kafka broker的同一个目录下。而 Pulsar 的每个 partition 是以 segment(对应到 Bookkeeper 的 ledger)作为物理存储的单位,所以 Pulsar 中的一个逻辑上有序的 partition 数据集合在物理上会均匀分散到多个 bookie 节点中。
  • Pulsar 的数据存储节点 Bookkeeper 被称为 bookie,相当于一个 Kafka broker。
  • ensemble size 表示 topic 要用到的物理存储节点 bookie 个数,其副本数目 Qw 不能超过 bookie个数,因为一个 bookie 上不能存储超过一个以上的数据副本。
  • Qa 是每次写请求发送完毕后需要回复确认的 bookie 的个数。

到了这里,关于Apache Pulsar入门指南的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Postman入门指南】

    前言 Postman 提供了测试 API 的友好界面和功能,使用简单便捷,安全可靠。 目录 前言 一、Postman安装 二、Postman的基础功能 三、Postman的进阶功能 一、Postman安装 1、Postman安装 Postman在2018年之后不再支持浏览器版本,下载客户端,安装即可使用。 下载网址:Download Postman | Get

    2024年02月04日
    浏览(41)
  • Flutter入门指南

    笔者项目中使用Flutter的模块并不多。虽然笔者还没有机会在项目中正式使用Flutter,但是也在学习Flutter的一些基本用法。本文就是一篇Flutter的入门介绍,后续会写更多深入介绍的文章。Flutter可以通过一套代码库快速构建高质量、高性能的跨平台应用,支持iOS、Android、Web以及

    2024年04月10日
    浏览(43)
  • IOS小白入门指南

            加入ios 项目已经一个多月了,本篇文章主要介绍IOS开发入门的一些基础知识,帮助想学习iOS开发的人更有效率地学习。 目录 需要的计算机基础    开发语言选择 IOS两种开发语言的异同 Objective-C和swift的相同点: 二者的不同点: 开发环境---XCode介绍 基本信息 S

    2024年02月01日
    浏览(36)
  • Go 语言入门指南

    学一门语言先看看helloworld吧,感觉go结合了好多语言的方式,写起来一会像python一会像c++,java差不多。反正语法挺奇特 go语言特点: 高性能、高并发 语法简单,学习曲线平缓 丰富的标准库 完善的工具链 静态链接 快速编译 跨平台 垃圾回收 首先听到老师说 go语言编译贼快,

    2024年02月15日
    浏览(43)
  • HTML 入门指南

    参考:HTML 教程- (HTML5 标准) HTML:超级文本标记语言(HyperText Markup Language) “超文本” 就是指页面内可以包含图片、链接等非文字内容。 “标记” 就是使用标签的方法将需要的内容包括起来。例如: a herf=\\\"sfdsfsd\\\"www.itcast.cn/a img/ HTML 用于 编写网页 。平时上网通过浏览器看到

    2024年02月20日
    浏览(34)
  • RabbitMQ入门指南

    提供了系统之间的异步调用,比如一个支付功能,用户在支付完成之后,会去数据库中执行后续操作,然后更新支付状态,会生成订单信息,如果后续还需要添加功能,就需要去业务逻辑中修改代码,这样就会出现业务耦合。同时想要执行后续操作,需要等待支付功能完成,

    2024年02月21日
    浏览(79)
  • ES入门指南

    前言 本文章适用于未接触ES或接触较少的中高级开发工程师,以较低的学习成本,快速学习ES并在生产中应用为核心目的 本文章主要以实战维度展开,在不影响数据安全以及基本的性能危机的前提下,不会过多的涉及深层次的底层原理(但也会涉及一些基本的原理,防止出现类

    2023年04月08日
    浏览(60)
  • 谷歌Bard入门指南

    Bard 是一个大型语言模型,也称为对话式 AI 或聊天机器人,经过训练,内容丰富且全面。Bard 接受过大量文本数据的培训,能够针对各种提示和问题进行交流并生成类似人类的文本。例如,Bard 可以提供事实主题的摘要或创建故事。 看起来不错哟。你猜的没错,这就是他自己

    2024年02月12日
    浏览(65)
  • 领域驱动设计入门指南

    ​ 领域驱动设计(Domain-Driven Design,简称DDD)是一种软件架构风格,它强调在软件开发过程中紧密关注业务需求和领域知识。本文将简要介绍领域驱动设计的核心概念,帮助人开始学习和实践领域驱动设计。 什么是领域驱动设计? 领域驱动设计是一种软件开发方法,它侧重

    2024年02月11日
    浏览(36)
  • Python爬虫入门指南

    随着大数据时代的到来,网络爬虫技术变得越来越重要。Python作为一种功能强大的编程语言,非常适合用来编写爬虫程序。本文将带领大家入门Python爬虫,从基础知识讲起,逐步深入实践。 一、爬虫基础知识 网络爬虫,又称为网络蜘蛛、网络机器人,是一种按照一定的规则

    2024年04月10日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包