一条核心交换机故障可能在几秒内触发上百条主机告警,监控如果不加节制地调用预警接口,短时间大量并发既可能被平台限流,也会让值班人被电话淹没。合理规划发送节奏,是接入后必须做的功课。 限流与并发控制要解决的两个问题 一是保护平台:互亿无线接口对…
一条核心交换机故障可能在几秒内触发上百条主机告警,监控如果不加节制地调用预警接口,短时间大量并发既可能被平台限流,也会让值班人被电话淹没。合理规划发送节奏,是接入后必须做的功课。
限流与并发控制要解决的两个问题
一是保护平台:互亿无线接口对单账号有合理并发上限,超过会被拒绝,需客户端自行控制速率。二是保护人:短时间几十通语音同时打出,值班人听不过来,反而把真正重要的告警淹没在噪音里。限流本质是在"发得快"和"发得稳"之间取平衡。
客户端限流的代码示例
下面用 Python 实现一个简单的限流器,通过固定间隔把发送速率控制在每秒 5 条以内,适合大多数告警场景:
import time, requests
APIID, APIKEY = "你的APIID", "你的APIKEY"
def send_alert(mobile, content):
time.sleep(0.2) # 每秒不超过5条
try:
r = requests.post("https://api.ihuyi.com/sms/Submit.json",
data={"account": APIID, "password": APIKEY,
"mobile": mobile, "content": content}, timeout=(5, 10))
return r.json()
except requests.RequestException as e:
print("发送失败:", e)
return None
规划发送节奏的建议
- 按告警等级分配通道与速率:P0 用语音立即发,P1 用短信缓冲,P2 聚合后发。
- 批量通知时用线程池限制并发,同时在途请求不超过 5 个。
- 夜间告警适当合并,避免每台服务器各打一通电话。
- 控制台若频繁出现限流返回码,再调低客户端速率,避免无效重试。
不同限流方式的取舍
限流实现上有几种常见做法:固定间隔 sleep 实现简单,适合发送量小的场景;令牌桶允许一定程度的突发,适合告警这种瞬时突发的业务;漏桶则输出均匀,适合对下游通道压力敏感的场景。告警通常是突发式的,令牌桶更合适,它既能在平时节流,又能在 P0 告警到来时消耗预存令牌立即发送。
| 限流方式 | 特点 | 适合场景 |
|---|---|---|
| 固定间隔 | 实现简单、速率均匀 | 发送量小、非紧急通知 |
| 令牌桶 | 允许短时突发 | P0 告警瞬时触发 |
| 漏桶 | 输出恒定、削峰填谷 | 批量群呼、通道压力敏感时 |
限流不是拖慢告警
好的限流策略是"该快的快、该慢的慢":紧急告警走高优先级通道立即下发,普通告警排队聚合后发送。互亿无线三网直连与智能路由配合客户端限流,在不压垮平台的前提下保障关键告警触达。
按告警等级分配速率
限流不是一刀切地慢,而是给不同等级不同待遇。P0 告警走快速通道,令牌桶里预留额度,一到立即发出;P1 排队缓冲,攒几秒一起发;P2 完全降级到聚合,甚至工作日再汇总。这样既保护平台,又不耽误紧急告警。
| 等级 | 发送策略 | 通道 |
|---|---|---|
| P0 | 立即穿透 | 语音 |
| P1 | 缓冲数秒 | 短信 |
| P2 | 攒批聚合 | 汇总短信 |
并发控制的代码要点
用线程池时要同时限制并发数和队列长度,超出队列直接丢弃并记录,避免内存被告警堆爆。一个稳妥的做法是:线程池开 5 个线程,队列只留 20 条,多余的 P2 告警合并成摘要,P0 告警允许插队。
from concurrent.futures import ThreadPoolExecutor
pool = ThreadPoolExecutor(max_workers=5)
# 队列满时,P0 直接 submit,P2 先合并再发限流参数的现场调整
接入初期不知道速率合不合适,可以先按保守值跑:每秒 5 条、并发 5。观察控制台返回,如果很少出现限流拒绝,再逐步放宽;如果频繁被拒,就再调小。限流参数没有标准答案,靠运行数据微调。
批量群呼时尤其要注意节奏,上百人同时接到来电虽然快,但通道压力和打扰都大,建议分段匀速呼出。互亿无线智能路由会在通道层做调度,客户端配合限流即可。
接入限流后,告警从"能发出去"走向"发得有节奏",注册免费试用压一压发送节奏。