Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >生存还是毁灭?一文带你看懂 Pulsar 的消息保留和过期策略

生存还是毁灭?一文带你看懂 Pulsar 的消息保留和过期策略

作者头像
腾讯云中间件团队
发布于 2023-03-24 13:10:09
发布于 2023-03-24 13:10:09
2K00
代码可运行
举报
运行总次数:0
代码可运行

导读

Apache Pulsar 是 Apache 软件基金会顶级项目,是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体,采用计算与存储分离架构设计,支持多租户、持久化存储、多机房跨区域数据复制,具有强一致性、高吞吐、低延时及高可扩展性等流数据存储特性。

作者介绍

冉小龙

腾讯云微服务产品中心研发工程师 Apache Pulsar Committer Apache BookKeeper Contributor

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

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

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

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

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

Retention 策略

Retention 策略的设置提供了两种方式:

  • 消息的大小,默认值:defaultRetentionSizeInMB=0
  • 消息被保存的时间,默认值:defaultRetentionTimeInMinutes=0

我们可以在 broker.conf 中对这两项内容进行配置也可以通过命令行的形式。上文提到过,这两种策略的设置,都是在 NameSpace 的级别进行设置,所以当我们使用命令行配置时,使用 NameSpaces 来进行配置,具体如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root@e6df71e544ea:/pulsar# ./bin/pulsar-admin namespaces set-retentionThe following options are required: --size, -s --time, -t
Set the retention policy for a namespaceUsage: set-retention [options] tenant/namespace  Options:  * --size, -s       Retention size limit (eg: 10M, 16G, 3T). 0 or less than 1MB means no       retention and -1 means infinite size retention  * --time, -t       Retention time in minutes (or minutes, hours, days, weeks eg: 100m, 3h, 2d,       5w). 0 means no retention and -1 means infinite time retention

如上所示:我们可以通过 -s 或者 -t 来指定我们需要配置的大小或者时间。

当你设置 Retention 策略之后,可以通过如下命令来查看具体的信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ pulsar-admin namespaces get-retention [your tenant]/[your-namespace]{  "retentionTimeInMinutes": 10,  "retentionSizeInMB": 0}

Backlog

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

同样的,我们可以在 NameSpace 级别对 backlog 的大小进行配置。需要注意的是,对 backlog 进行配置时,我们需要明确以下两点:

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

当超过设定的 backlog 的阈值,Pulsar 提供了以下三种策略供用户选择:

你可以通过 set-backlog-quota 在 NameSpace 级别对 backlog 进行配置,具体如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root@e6df71e544ea:/pulsar# ./bin/pulsar-admin namespaces set-backlog-quotaThe following options are required: -l, --limit -p, --policy
Set a backlog quota policy for a namespaceUsage: set-backlog-quota [options] tenant/namespace  Options:  * -l, --limit       Size limit (eg: 10M, 16G)  * -p, --policy       Retention policy to enforce when the limit is reached. Valid options are:       [producer_request_hold, producer_exception, consumer_backlog_eviction]

如上所示,set-backlog-quota 提供了两个参数,-l 用来指定你设置 backlog 的大小,-p 用来指定,当超过你设置的 backlog 的阈值之后,Broker 将会执行的策略。

当你设置 backlog 之后,可以通过如下命令,查看相应的信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ pulsar-admin namespaces get-backlog-quotas [your tenant]/[your namespace]{  "destination_storage": {    "limit" : 2147483648,    "policy" : "producer_request_hold"  }}

如果你期望取消 backlog 的配置,可以使用如下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ pulsar-admin namespaces remove-backlog-quota [your tenant]/[your namespace]

当有消息积压时,你可以通过 clear-backlog 来清除积压的消息。清除 backlog 中积压的消息是相对危险的操作,所以系统会提示你,是否确认要删除 backlog 中的消息, clear-backlog 提供了 -f(--force) 的参数来屏蔽该提示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ pulsar-admin namespaces clear-backlog [your tenant]/[your namespace]

Time To Live (TTL)

默认情况下,Pulsar 会持久化所有未被确认的消息。如果未被确认的消息有很多,这种策略会造成大量的消息被积压,导致磁盘空间增大。有些场景下,消息并不需要被持久化,用户更期望的行为是,将这些未被确认的消息直接丢弃。这种情况下,你可以通过设置 TTL 使得未被确认的消息进入到被确认的状态,当超过设定的 TTL 时间之后,配合相应的 Retention 策略将消息丢弃。

TTL 的一个典型使用场景是,当 Consumer 由于某些原因出现故障,不能正常消费消息,这时 Producer 还在不断的往 Topic 中生产消息,会造成 Topic 中有大量的未确认的消息出现,这时你可以通过设置 TTL 将这些未确认的消息变为已确认的状态。

同样的,你可以在 Namesapce 级别下,通过指定 set-message-ttl 对 TTL 进行设置,具体命令如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root@e6df71e544ea:/pulsar# ./bin/pulsar-admin namespaces set-message-ttlThe following option is required: --messageTTL, -ttl
Set Message TTL for a namespaceUsage: set-message-ttl [options] tenant/namespace  Options:  * --messageTTL, -ttl       Message TTL in seconds       Default: 0

如上所示,set-message-ttl 只有一个参数 -ttl,单位为秒,默认值为 0。

当你设置 TTL 策略之后,可以通过 get-message-ttl 查看相应的配置信息,具体如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ pulsar-admin namespaces get-message-ttl [your tenant]/[your namespace]60

TTL、Backlog 与 Retention 的区别和联系

在上述的描述过程中,可以发现,TTL 只去处理一件事情,将未被确认的消息变为被确认的状态,TTL 本身不会去涉及相应的删除操作,具体如下图所示:

  1. 在 T1 阶段,m1-m5 这 5 条消息被确认,m6-m10 这 5 条消息未被确认
  2. 在 T2 阶段,对 m6、m7、m8 这三条消息设置 TTL 策略
  3. 在 T3 阶段,到达 TTL 设定的阈值,m6、m7、m8 这三条消息被确认

通过上图可以看到,对于 backlog 中未被确认的消息,当你设置 TTL 之后,会将未确认消息的状态变为确认的状态。TTL 在这里所起到的作用就是将消息的 Cursor 从 m5 移动到 m8,m6、m7、m8 这三条消息变为已确认状态。

Pulsar 是一个 multiple-subscription 的消息系统,对于 Topic 中的一条消息,只有当所有订阅者都对这条消息 ack 或者消费了,它才能被删除。

默认情况下,Pulsar Broker 会将所有未确认的消息持久化到 backlog 中。TTL 的功能是,你可以将这些未被确认的消息变为被确认的状态,而 Retention 所关注的点是,当消息处于被确认的状态时,你可以对已确认的消息进行的保留策略是什么。换句话说,backlog 是针对未确认的消息,Broker 所做的处理是什么。Retention 是针对已确认的消息,Broker 所做的保留策略是什么。

TTL 与死信队列

死信队列的相关介绍在此不做赘述。

在生产环境中,有时可能遇到质量差的数据是由于上游的原因导致的,必须由上游来解决,继续尝试处理其它的消息已经没有意义,这时候用户希望在发生错误时立即停止处理。Pulsar 中提供了一种特殊的 Topic——死信队列。

死信队列与 TTL 都可以将未确认的消息变为已确认的状态。他们之间主要的不同在于,在上图中的 T2 阶段,TTL 只是将未确认的消息变为已确认的状态,死信队列的做法是将消息丢弃到死信队列中,m6、m7、m8 这三条消息变为被确认的状态。m9、m10 这两条有效消息会正常处理,Broker 也会继续运行。之后,你可以从死信队列中检查无效消息,并根据需要忽略或修复并重新处理。用户可以根据自己的需求来确定未确认的消息是通过 TTL 的形式将其变为确认状态还是通过死信队列的方式来实现,依据的主要标准就是看你需不要处理消费不了的消息。

使用问题

  • 场景一:

启动 Producer 往 Broker 发送消息,设置了 TTL ,没有启动 Consumer,同时设置了 Retention 策略为半小时,到达 Retention 的阈值之后,发现设置 TTL 的消息并没有被移除,这是为什么呢?

在上述场景中,有一个问题需要注意,没有启动 Consumer,在上面我们说到,TTL 是将消息设置的 Cousor 向前移动,如果没有启动 Consumer,相当于 Cousor 没有被初始化,也就是如果没有 Consumer,你就没有必要去设置 TTL。

  • 场景二:

我设置了Retention 策略,但是到达了 Retention 的阈值,Topic 中的数据并没有被删除掉,这是为什么呢?

这个是 Pulsar 内部的一个实现机制,在 Pulsar 中 Topic 是一个逻辑的概念,一个 Topic 对应一个 manage ledger,当你写数据的时候,实际上是将数据写到了 ledger 中,还记得在之前很多文章中提到的有关 Pulsar 设计的一个核心所在:在 Pulsar 中,所有的操作都是异步的,所以当 Retention 到达指定阈值之后,是否删除对应 ledger 中的数据,这个操作也是异步的。delete 的操作是不会对当前 active 的 ledger 执行的。只有当数据写满了当前的 ledger ,ledger 发生切换时,才会去真正的执行 retention 策略。

如果想要强制执行,可以使用 pulsar-admin 将当前的 ledger 强制卸载,迫使其发生 ledger 的切换。

往期

推荐

《一天,把 Pulsar 客户端的性能提升3倍+!》

《超有料!万字详解腾讯微服务平台 TSF 的敏捷开发流程》

《火速围观!鹅厂中间件产品遭遇暴风吐槽!》

扫描下方二维码关注本公众号,

了解更多微服务、消息队列的相关信息!

解锁超多鹅厂周边!

戳原文,了解更多消息队列TDMQ的信息

点亮在看,你最好看

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯云中间件 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
究极缝合怪 | Pulsar核心概念和特性解读
Pulsar 是一个用于服务器到服务器的消息系统,具有多租户、高性能等优势。Pulsar 最初由 Yahoo 开发,目前由 Apache 软件基金会管理。
王知无-import_bigdata
2022/03/11
2.1K0
究极缝合怪 | Pulsar核心概念和特性解读
Pulsar 介绍与部署
Apache Pulsar 是灵活的发布-订阅消息系统(Flexible Pub/Sub messaging),采用计算与存储分离的架构。雅虎在 2013 年开始开发 Pulsar ,于 2016 年首次开源,目前是 Apache 软件基金会的顶级项目。Pulsar 具有支持多租户、持久化存储、多机房跨区域数据复制、高吞吐、低延迟等特性。
Se7en258
2021/07/01
3.2K0
你可能并不懂 Apache Pulsar 的消息存储模型
Apache Pulsar 系列第一篇文章为读者们详细解释了 Pulsar 的消息保留和过期策略,本文是系列第二篇,主要从 Pulsar 设计的原理以及在 BookKeeper 中如何存储做一个梳理。
腾讯云中间件团队
2021/03/24
1.8K0
你可能并不懂 Apache Pulsar 的消息存储模型
云原生消息流系统 Apache Pulsar 在腾讯云的大规模生产实践
导语 由 InfoQ 主办的 Qcon 全球软件开发者大会北京站上周已精彩落幕,腾讯云中间件团队的冉小龙参与了《云原生机构设计与音视频技术应用》专题,带来了以《云原生消息流系统 Apache Pulsar 在腾讯云的大规模生产实践》为主题的精彩演讲,在本篇内容中,将重点围绕腾讯云近期在 Apache Pulsar 稳定性和性能方面优化的工作展开介绍,为开发者提供参考。 作者简介 冉小龙 腾讯云高级研发工程师 Apache Pulsar committer RoP maintainer Apache Pul
腾讯云中间件团队
2023/02/16
1.2K0
云原生消息流系统 Apache Pulsar 在腾讯云的大规模生产实践
8张图带你彻底理解Pulsar的跨地域复制
跨地域复制是 Apache Pulsar 企业级特性的重要组成部分,它保证了系统的高可用,在操作和管理上也非常便捷,今天用 5 张图来带大家学习这个功能。
jinjunzhu
2022/09/23
1.3K0
8张图带你彻底理解Pulsar的跨地域复制
百万级 Topic,Apache Pulsar 在腾讯云的稳定性优化实践
作者简介 冉小龙 腾讯云高级研发工程师 Apache Pulsar committer RoP maintainer Apache Pulsar Go Client、Pulsarctl 与 Go Functions 作者与主要维护者 Apache Pulsar 作为云原生时代消息流系统,采用存储计算分离架构,支持大集群、多租户、百万级 Topic、跨地域数据复制、持久化存储、分层存储、高可扩展性等企业级和金融级功能。Apache Pulsar 提供了统一的消费模型,支持消息队列和流两种场景,既能为队列场景提
腾讯云中间件团队
2022/09/27
1.1K0
百万级 Topic,Apache Pulsar 在腾讯云的稳定性优化实践
pulsar-6:生产环境解决pulsar-flink-connector导致磁盘满的问题
在aws上部署了3台8c16g的pulsar集群。选择的是1:2的c系列机型:c5a.2xlarge。
千里行走
2021/11/10
8240
pulsar-6:生产环境解决pulsar-flink-connector导致磁盘满的问题
颠覆Kafka的统治,新一代云原生消息系统Pulsar震撼来袭!
导语 | 在信息流场景,内容的请求处理、原子模块调度、结果的分发等至关重要,将会直接影响到内容的外显、推荐、排序等。基于消息100%成功的要求,我对Pulsar进行了调研,并采用Pulsar实现消息的可靠处理。本文主要参考Pulsar的官方文档和技术文章,对Pulsar的特性、机制、原理等进行整理总结。 一、Pulsar概述 Apache Pulsar是Apache软件基金会顶级项目,是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体,采用计算与存储分离架构设计,支持多租户、持久化存储、多
腾讯云开发者
2022/01/12
8160
详解 Apache Pulsar 消息生命周期
在用户视角下,MQ 可以理解为 Pub-Sub 模型,在 Broker 抽象一个 Topic,消息经由生产者发送到 Topic 中然后进入消费者进行消费。
从大数据到人工智能
2023/03/10
1K0
详解 Apache Pulsar 消息生命周期
助力联邦——­Pulsar在Angel PowerFL联邦学习平台中的应用
导语 Apache Pulsar是Yahoo开源的MQ解决方案,功能上跟Kafka、RocketMQ、TubeMQ等类似,同时支持多租户、读写分离、跨地域复制等特性。联邦学习作为新一代人工智能基础技术,通过解决数据隐私与数据孤岛问题,重塑金融、医疗、城市安防等领域。本文将介绍Pulsar在Angel PowerFL 联邦学习平台中的应用,探索MQ和联邦学习的跨界合作过程。 01 背  景 Angel PowerFL联邦学习平台及其通信模块要求 Angel PowerFL联邦学习平台构建在Angel之
腾讯大数据
2020/08/06
1.3K0
pulsar总览
pulsar 是 Apache 的顶级项目, 定位为下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体,采用计算与存储分离架构设计,支持多租户、持久化存储、多机房跨区域数据复制,具有强一致性、高吞吐、低延时及高可扩展性等流数据存储特性,被看作是云原生时代实时消息流传输、存储和计算最佳解决方案。Pulsar 是一个 pub-sub (发布-订阅)模型的消息队列系统。
leobhao
2023/03/08
1.2K0
pulsar总览
Pulsar集群部署
Pulsar集群至少需要3个组件,zookeeper集群、broker集群、bookkeeper集群 zookeeper集群:由3个节点组成 broker集群:由3个节点组成,已包含在pulsar安装包中 bookeeper集群:bookie集群,由3个节点组成,已包含在pulsar安装包中
陳斯托洛夫斯記
2022/10/27
1.1K0
【12图】你管这破玩意叫Pulsar
这两年pulsar发展比较快,有好多大公司引入了pulsar,相关的资料和课程也多了,今天一起来了解一下pulsar这款中间件。
jinjunzhu
2022/09/23
7880
【12图】你管这破玩意叫Pulsar
一篇文搞定消息队列选型
消息队列是重要的分布式系统组件,在高性能、高可用、低耦合等系统架构中扮演着重要作用。可用于异步通信、削峰填谷、解耦系统、数据缓存等多种业务场景。本文是关于消息队列(MQ)选型和常见问题的精心整理。在这篇文章中,我们将详细介绍消息队列的概念、作用以及如何选择适合自己需求的消息队列系统。 本文中介绍到的 Kafka 、 RabbitMQ 、 RocketMQ 等,均有对应的腾讯云产品,除了兼容社区开源版以外,还具备更高的性能、可用性和产品特性,欢迎大家了解试用。
腾讯云开发者
2024/09/06
2.4K0
一篇文搞定消息队列选型
Pulsar3.0 升级指北
如图所示,LTS 版本会最长支持到 36 个月,而 Feature 版本最多只有六个月;类似于我们使用的 JDK11,17,21 都是可以长期使用的;所以也推荐大家都升级到 LTS 版本。
crossoverJie
2023/12/26
3090
Pulsar3.0 升级指北
Pulsar#1 Pulsar部署与线上配置
Apache Pulsar越来越多的公司使用,与Apache Kafka、Apache RocketMQ并列成为消息领域三家马车,有必要对其研究一番。下面以笔者曾在生产环境使用的配置梳理,内容提要:
瓜农老梁
2022/03/29
1.7K0
Pulsar与Rocketmq、Kafka、Inlong-TubeMQ,谁才是消息中间件的王者?
导语 | Pulsar作为下一代消息中间件的典型代表,在设计和实现上面都具备很好的前瞻性,综合考量了业界现存的一些比较常用的、优秀的消息中间的架构设计、适用场景、运营中的问题等,如目前用的比较多的Kafka、Rocketmq、Inlong-TubeMQ等。本文仅从设计角度出发,说明下Pulsar与Kafka、Rocketmq及腾讯开源的Inlong-TubeMQ在实现上的几点区别和可能遇到的问题,供大家参考。 一、云原生多租户设计 (一)分级命名 Pulsar原生支持多租户设计,非常适合作为云产品进
腾讯云开发者
2021/10/27
8750
构建下一代万亿级云原生消息架构:Apache Pulsar 在 vivo 的探索与实践
作者 | 陈建波、全利民 本文整理自 vivo 互联网大数据工程师陈建波与全利民在 Apache Pulsar Meetup 上的演讲《Apache Pulsar 在 vivo 的探索与实践》,介绍 vivo 在集群管理与监控上应用 Pulsar 的实践。 vivo 移动互联网为全球 4 亿 + 智能手机用户提供互联网产品与服务。其中,vivo 分布式消息中间件团队主要为 vivo 所有内外销实时计算业务提供高吞吐、低延时的数据接入、消息队列等服务,覆盖应用商店、短视频、广告等业务。业务集群已达每天十
深度学习与Python
2023/03/29
7640
构建下一代万亿级云原生消息架构:Apache Pulsar 在 vivo 的探索与实践
Apache Pulsar 技术系列 - Pulsar事务实现原理
导语 Apache Pulsar 是一个多租户、高性能的服务间消息传输解决方案,支持多租户、低延时、读写分离、跨地域复制、快速扩容、灵活容错等特性。腾讯云MQ Oteam Pulsar工作组对 Pulsar 做了深入调研以及大量的性能和稳定性方面优化,目前已经在TDBank、腾讯云TDMQ落地上线。本篇将简单介绍Pulsar服务端消息确认的一些概念和原理,欢迎大家阅读。 作者简介  林琳                                                           
腾讯云中间件团队
2022/03/03
2.1K0
消息队列基本概念与pulsar学习
Pub-sub架构(发布/订阅),异步的服务间通信方式,适用于无服务器和微服务。发布到主题的任何消息都会立即被主题的所有订阅者接收。
千灵域
2022/06/17
4470
推荐阅读
相关推荐
究极缝合怪 | Pulsar核心概念和特性解读
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验