限流系列之三:TDMQ for Apache Pulsar 限流技术深度解析

导语

在高速、高吞吐量的消息处理场景中,TDMQ Pulsar 版以其卓越的性能和可扩展性成为众多企业的首选。然而,随着生产者和消费者以极高的速度生产/消费大量消息,服务器资源如 CPU、内存、网络及磁盘 IO 等可能会面临饱和风险。为此,TDMQ Pulsar 版设计了完善的限流机制,以保护集群资源,确保系统的全局稳定性。本文将深入探讨 TDMQ Pulsar 版的集群级与主题分区限流技术,并提供实践指南。

为什么要做限流?

在 TDMQ Pulsar 版集群的运行过程中,生产者和消费者的高速运作犹如一把双刃剑,在带来高效数据传输的同时,也对服务端资源造成了巨大的压力。当它们以极高的速度生产和消费大量消息时,服务端的 CPU 需要不断地处理这些消息的生产和消费请求,磁盘需要存储大量的消息数据以及相关的元数据信息,网络磁盘 IO 则需要频繁地进行数据的读写操作,以保证消息的持久化存储和快速传输。如果不对这些操作进行限制,很容易导致 CPU 使用率飙升,内存耗尽,网络磁盘 IO 饱和,进而影响整个集群的性能和稳定性。

这种资源饱和的情况可能会引发一系列严重的问题。例如,CPU 过度繁忙会导致消息处理延迟增加,使得生产者发送消息的耗时大幅增长,甚至出现发送超时的情况;内存不足可能会导致消息丢失或者数据处理错误;网络磁盘 IO 瓶颈则会导致消息堆积,严重时可能会使整个集群陷入瘫痪状态。为了避免这些问题的发生,确保集群在高负载情况下仍能稳定运行,TDMQ Pulsar 版设计了一套完整的限流方案。

TDMQ Pulsar 版限流机制浅谈

TDMQ Pulsar 版支持两种维度的限流:集群级分布式限流和主题分区限流。这两种限流机制就像是为 TDMQ Pulsar 版集群安装了两道坚固的 “安全阀”,确保集群在高负载情况下仍能稳定运行。

  • 集群级分布式限流:适用于 TDMQ Pulsar 版专业集群。通过按照实例规格设置不同的限流阈值,对整个集群进行自我保护,避免因为资源消耗过高影响集群质量,造成全局稳定性风险。

  • 主题分区限流:适用于所有类型的 TDMQ Pulsar 版集群。对每个主题分区的生产和消费速率进行限制。

集群级分布式限流:秒级窗口的自我保护机制

限流机制

TDMQ Pulsar 版的生产限流机制采用了一种独特的延迟回包方式,这种方式就像是在消息传输的道路上设置了一个 “红绿灯”,通过控制消息的处理节奏来实现限流。其限流的统计窗口被设定为 1 秒,这是一个关键的时间单位,所有的限流统计和控制都在这个时间窗口内进行。

以生产 TPS 限流为例,假设我们将生产 TPS 设置为 100,这就意味着在 1 秒的时间内,系统最多处理 100 个消息。当用户在 1 秒中的前 400ms 发送了 100 个消息时,此时已经达到了设定的 TPS 阈值。那么第 101 个消息发送的请求就会遇到 “红灯”,它需要等待 600ms 后才能被处理。

  • 从生产者的角度来看,当出现生产限流时,由于消息需要等待处理,发送消息的耗时必然会增加。如果等待时间过长,就可能出现发送超时的情况。

  • 从消费者的角度来看,当发生消费限流时,消息从生产到消费的整体链路时延会增加。这就可能导致消息在队列中堆积,影响整个数据处理流程的效率。

限流原理

在这里插入图片描述

生产端

生产端的限流原理是基于 1 秒的统计窗口来实现的。当统计窗口内的配额被用尽时,服务端会将生产者的 Channel 全部关闭。直到下一个时间窗口到来,服务端才会重新打开生产者的 Channel,重新允许处理消息发送请求。

消费端

消费端的限流原理同样基于 1 秒的统计窗口。当统计窗口内的配额被用尽时,服务端会停止推送消息到消费者。消费者在这段时间内无法接收到新的消息,直到下一个时间窗口,服务端恢复推送消息,消费者才能继续进行消费操作。

需要注意的是,生产端限流后关闭 Channel,具体来说就是当生产出现限流后,服务端会将生产者对应的 TCP 连接通道关闭。关闭后,服务端就不再接受对应 TCP 连接的请求,直到 TCP 连接通道被再次打开。

实践教程

合理选购集群规格:用户应深入了解业务实际的峰值生产 / 消费量,这需要对业务的历史数据进行详细分析,预测未来的业务增长趋势。根据生产消费的扇出比例,科学合理地设置限流的生产 / 消费分配比例。在正式上线前,务必做好压测工作,通过模拟真实的业务场景和负载情况,提前评估集群容量是否能够满足业务需求。

避免延迟消息字段设置错误:如果业务发送的是非延迟消息,一定要注意不要设置延迟消息字段。因为一旦发送端设置了延迟消息字段,无论设置的延迟时间是多久,服务端都会按照延迟消息统计速率。以 Java 为例(GO 等其他 SDK 也类似),只要在发送消息的时候,设置了 DeliverAfter 或者 DeliverAt,就会被认为是延迟消息,即使里面的值为 0 或者小于当前时间。

配置集群的生产/消费的速率和带宽的告警:当集群的生产 / 消费的速率和带宽超过设置规格的 80% 时,建议及时升配专业版实例规格,以避免限流带来的耗时增加的风险。

配置生产 / 消费的限流次数的告警:当出现限流的时候,表示在秒级的窗口内存在生产 / 消费超限的情况,这时候也建议及时升配专业版实例的规格,避免限流带来耗时增加的风险。

常见现象说明

问题1:为什么生产/消费低于规格时会触发限流?

如上面限流原理所述,限流是以 秒(s) 为单位的,控制台监控平台数据是按分钟(min)维度采集上报。监控平台上的生产/消费的统计值的计算公式是 [1min内消息量/60]。当客户端生产消费的量在 1min 内分布不均衡的时候,可能集中在 1min 内的 1 秒或者几秒的时间窗口内生产/消费量很高,超过限流窗口中的配额,其他时间远低于限流窗口配额,这种情况下,监控到的生产/消费低于实例规格,但是触发了限流。

问题2:为什么生产/消费峰值会高于实例规格?

  • 情况1:TDMQ Pulsar 版是分布式系统,一个 TDMQ Pulsar 版节点由多个 Broker 节点组成,同一个时间点(一个限流窗口内),限流是由各个节点进行的,每个节点的限流阈值是当前集群剩余阈值。例如集群限流阈值 1000,Broker 节点数量为5,当实际使用量为 750 的时候(假设此时每个节点的使用量均匀,都是 150),每个节点此时的限流阈值是 400(150 + 1000-750)。此时,实际上瞬时能达到的流量可能到 2000(400*5),这样,一个限流窗口内可能出现超过规格的情况。

  • 情况2:如上面限流原理所述,当出现限流后,会将写的通道关闭,但是当前的请求(即使已经超过了限流阈值)还是会继续处理,所以,当并发请求较高的情况下,可能出现一个统计窗口内超过限流阈值的情况。

问题3:如何判断 TDMQ Pulsar 版是否发生限流?

在 TDMQ Pulsar 版专业集群控制台的集群监控页面查看集群监控信息,当限流次数大于 0,证明发生过限流。

主题分区限流:细粒度的流量管控

限流原理

主题分区限流在 TDMQ Pulsar 版的消息处理体系中扮演着重要的角色,它如同一个精密的流量调节阀,对每个主题分区的生产和消费速率进行精细管控,确保整个系统在高负载情况下仍能稳定、高效地运行。与集群级分布式限流不同,主题分区限流适用于所有类型的 TDMQ Pulsar 版集群,为各种规模和应用场景的集群提供了统一的流量控制保障。

生产端

生产端的限流逻辑依赖于内部的定时任务,这个定时任务默认每 50ms 执行一轮,检查每个分区在 1 秒的时间窗口内生产的消息量是否超过了预设的配额。

当检测到某个分区的生产配额被用尽,即出现限流情况时,服务端会采用软限流的方式进行处理。具体来说,服务端会关闭主题对应生产者的读 Channel,不再处理生产请求。不过,这种关闭并非永久性的,至多等待 1 秒后,服务端会重新恢复生产者的读 Channel,允许生产者继续处理发送消息的请求,直到再次出现限流。

从客户端的角度来看,当出现限流后,由于消息发送请求需要等待读 Channel 恢复才能被处理,发送耗时必然会增加。如果等待时间过长,就可能出现发送超时的情况。

消费端

消费端的限流逻辑同样是基于 1 秒的时间窗口,统计消费的 TPS 和带宽是否超过了配额。

当出现限流时,服务端会在 1 秒内停止推送消息到消费者。消费者在这段时间内无法接收到新的消息,这会导致消息从生产端到消费端的整体时延增加,因为消息在服务端被暂时扣留,无法及时传递到消费者手中。如果限流情况持续存在,就可能出现消息堆积的情况。

实践教程

  • 合理扩容分区:单主题分区有生产 / 消费的 TPS 和带宽限制,如果主题的 TPS / 带宽并发比较大,需要适当扩容分区。

  • 配置告警:配置主题的生产 / 消费的速率和流量已使用配额百分百的告警,当超过 80%,建议扩容分区数量,避免触发单主题分区限流。

常见现象说明

为什么分区的生产/消费流量可以超过限流阈值?

如上面限流原理所述,主题分区的限流采用的是非精确软限制的限流算法,结合生产端和消费端的限流逻辑,生产和消费都可能出现流量超过限流阈值的情况。

结语

TDMQ Pulsar 版的限流技术是保障其在复杂业务场景下稳定运行的关键因素。在实际应用中,用户需要深入理解限流机制的原理和特点,根据业务的实际需求和流量模式,合理地配置限流参数,如生产 / 消费速率、带宽限制、配额等。同时,要充分利用实践教程中的建议,做好集群规格的选择、告警配置以及分区扩容等工作,以确保系统在高负载情况下仍能保持高效、稳定的运行。

此外,对于常见现象的理解和应对也是至关重要的。通过对生产 / 消费带宽低于实例规格时触发限流、生产 / 消费峰值高于实例规格以及如何判断限流等问题的深入分析,用户能够更好地排查和解决实际应用中可能出现的问题,提高系统的可靠性和可用性。总之,合理运用 TDMQ Pulsar 版的限流技术,能够为分布式应用系统提供更加可靠的消息通信保障,助力业务的稳健发展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/87809.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87809.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

非研发部门参与产品开发过程的价值体现

汉捷咨询 胡红卫 企业已经越来越意识到新产品开发项目需要市场、销售、制造、采购、服务、财务等非研发部门的参与,尝试建立跨部门的项目组,安排相关人员参与项目,但是效果如何呢?在汉捷咨询对很多企业调研诊断过程中,…

Kafka的存储与索引:数据处理的底层奥秘

一、引言 Kafka 之所以能在海量数据的传输和处理过程中保持高效的性能和低延迟,背后隐藏着众多精妙的设计,而其存储与索引机制便是其中的核心奥秘。接下来,让我们深入探寻 Kafka 存储机制的基石与架构。 二、分区与日志组织​ Kafka 中的消…

大模型与搜索引擎的技术博弈及未来智能范式演进

基于认知革命与技术替代的全景综述 一、大模型对搜索引擎的替代性分析:技术范式与市场重构 (1)技术原理的代际分野 传统搜索引擎遵循 "爬虫抓取 - 索引构建 - 关键词排序" 的三段式架构,其核心是基于 PageRank 算法的…

XC7K325T数据采集卡设计原理图:786-基于X86 CPU+XC7K325T的16路16bit 1M sps同步数据采集卡

基于X86 CPUXC7K325T的16路16bit 1M sps同步数据采集卡 一、板卡概述 板卡为紧凑型的X86FPGA的工业监测处理平台,高度集成的硬件和完整的labview开发软件,大大方便客户现场使用。 二、板卡功能 板卡功能 参数内容 X86 SOM核心板 主频 2.0GHz …

单片机3种按键程序消抖方法

1,查询法延时模式 u8 key01;u8 x0;KEY1;while(1){if(KEY0) //"按键按下"{delay(10); //延时10msif(KEY0 && kdy01) //按下有10ms 且上状态是1。即下降沿时{key00; //将上状态置0.防止按住不放时&#xff0…

【java面试】线程篇

【java面试】线程篇 一、基础知识1 线程与进程的区别2 并行与并发的区别3 创建线程的方式4 线程包含了哪些状态,状态之间是如何变化的?5 新建三个线程,如何保证他们按照顺序执行?6、java中的wait和sleep方法的不同7 如何停止一个正…

RAGFlow是一个基于深度文档理解的开源RAG引擎

RAGFlow概述 RAGFlow是一款基于深度文档理解的开源RAG(检索增强生成)引擎,专注于处理复杂文档结构并提供精准的语义检索与生成能力。其核心优势在于结合多模态文档解析和智能分段技术,优化传统RAG流程中的信息提取与答案生成效果…

Git Commit 模板完整配置指南

Git Commit 模板完整配置指南 📋 目录 Git Commit 模板完整配置指南 📋 目录🎯 为什么需要 Commit 模板📝 推荐的 Commit 模板 标准模板格式C 项目特化模板 ⚙️ 系统级配置 1. 创建模板文件2. 配置 Git 使用模板3. 验证配置 &a…

【ELK服务搭建】

Ubuntu 20.04环境下部署Elastic Stack 8.18日志系统完整指南 一、环境准备 系统要求 Ubuntu 20.04 LTS硬件配置:4核CPU / 8GB内存 / 100GB硬盘网络:需外网访问权限 1. 基础环境配置 首先安装SSH服务以便远程管理: # 更新软件源 apt u…

Mac电脑 Office 2024 LTSC 长期支持版(Excel、Word、PPT)

Office 2024 mac,是一款是一款专为苹果电脑用户设计的高性能、高安全性的办公套装 集成了Word、Excel、PowerPoint、Outlook等经典应用,为用户提供了一站式的办公解决方案。 不仅继承了Office系列一贯的卓越性能,还在功能性和用户体验上进行…

深入解析 Schema 在不同数据库中的百变面孔

在数据库的世界里,数据是核心资产,但如何高效、有序、安全地组织和理解这些数据?答案就是 Schema(模式或架构)。它如同建筑的图纸、乐队的乐谱,是数据库的设计蓝图和运行规则手册。今天,我们就来…

Python 数据分析与可视化 Day 2 - 数据清洗基础

🎯 今日目标 学会识别和处理缺失数据(NaN)学会删除/填补缺失值清理重复数据修改列类型,准备数据分析 🧼 一、缺失值处理(NaN) ✅ 1. 检查缺失值 import pandas as pd df pd.read_csv("…

3DS中文游戏全集下载 任天堂3DS简介3DS第一方独占游戏推荐

任天堂3DS 的详细介绍,涵盖其硬件特性、核心功能、游戏阵容及历史地位: 3DS游戏全集下载 https://pan.quark.cn/s/dd40e47387e7 https://sink-698.pages.dev/3ds CIA CCA 等格式可用于3DS模拟器和3DS实体机 3DS 是什么? 全称:Nin…

【Python小练习】3D散点图

资产风险收益三维分析 背景 王老师是一名金融工程研究员,需要对多个资产的预期收益、风险(波动率)和与市场的相关性进行综合分析,以便为投资组合优化提供决策依据。 代码实现 import matplotlib.pyplot as plt from mpl_toolk…

安宝特案例丨突破传统手术室,Vuzix AR 眼镜圆满助力全膝关节置换术

在巴西圣保罗医院的手术室里,骨科权威 Ricardo Gobbi医生正戴着 安宝特 Vuzix 智能 AR 眼镜,为一位膝关节炎患者实施全膝关节置换术。与传统手术不同的是,他的视野中实时叠加着骨骼三维模型、切割路径标线和动态数据 —— 这并非科幻场景&…

qt设置文件自动保存-cnblog

步骤: 「工具」->「选项」->「环境」->「Auto-save modified files」。 可开启/关闭自动保存文件功能,还可设置自动保存时间的间隔(最短间隔1分钟)。 钟)。

linux下如何找到dump文件被生成到哪里了

在大多数 Linux 系统中,核心转储文件(core dump)通常由系统自动保存在当前工作目录下,或者由配置决定其保存位置。核心转储文件的默认文件名通常包含进程 ID(PID)和程序名,例如 core.PID 或 cor…

API 调试工具校验 JSON Mock 接口(一):无参请求与基础响应验证

在前后端分离的开发模式中,JSON Mock 工具为前端开发人员在后端接口未就绪时提供了极大便利,能够模拟返回 JSON 数据的 API 接口,实现前端独立开发与测试。而 API 开发调试工具 作为一款强大的接口测试工具,可进一步对这些 Mock 接…

单体架构、微服务架构和分布式架构的区别

. 架构定义与核心特征 1.1 单体架构(Monolithic Architecture) 单体架构是将所有功能模块集中在一个单一代码库中的传统架构模式: 所有功能(UI层、业务逻辑、数据访问)打包为单一部署单元通常使用单一技术栈开发(如Spring Boot、Django等)共享单一数据库实例进程内通信(方法…

如何重新安装 Rust

在开发过程中,我们有时可能需要重新安装 Rust,比如遇到版本冲突、环境配置错误,或者仅仅是想更新到最新版本。本文将详细介绍如何卸载现有 Rust 安装,并重新安装 Rust,同时还会介绍一些常见的配置技巧,帮助…