You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Twilio API发送并发请求时触发429 Too Many Requests错误如何解决?

解决方案

核心问题原因

  • 重复初始化静态TwilioClient:TwilioClient.Init是全局静态方法,仅需在应用启动时执行1次,你将其放在每次发送短信的逻辑中,并发调用时会打乱Twilio内部的HTTP连接池、请求计数逻辑,直接导致请求统计异常触发限流。
  • PLINQ不支持异步操作:AsParallel().ForAll是为CPU密集型同步逻辑设计的,传入async lambda会生成异步无返回方法(async void),你配置的2并发度完全不生效,所有请求几乎同时发出,实际并发量远高于预期,必然触发429限流。

修复步骤

1. 调整TwilioClient初始化逻辑

将初始化逻辑移到应用启动入口,全局仅执行一次:

// 应用启动时执行一次即可,例如Program.cs、Startup.cs的启动逻辑中
Twilio.TwilioClient.Init(config.apiKey, config.apiSecret, config.accountSID);

删除SendMessage方法中的初始化代码,修改后逻辑如下:

public async Task<MessageResource> SendMessage(string body, string ToNumber)
{ 
    var message = await MessageResource.CreateAsync(
        body: body,
        from: config.fromNumber,
        to: new Twilio.Types.PhoneNumber(ToNumber)
     );
    return message;
}

2. 用SemaphoreSlim控制异步并发度

针对IO密集型的异步短信发送操作,使用SemaphoreSlim实现精准的并发控制,替换原有的PLINQ实现:

// 设定最大并发数为2
using var concurrencyLimiter = new SemaphoreSlim(2);
var sendTasks = reminders.Select(async reminder =>
{
    await concurrencyLimiter.WaitAsync();
    try
    {
        await ProcessReminders(reminder);
    }
    finally
    {
        concurrencyLimiter.Release();
    }
});
// 等待所有短信发送任务完成
await Task.WhenAll(sendTasks);

3. 可选:配置429错误重试策略

如果业务场景允许少量延迟,可配置指数退避重试策略处理偶发的429错误,可通过Twilio原生的HttpClient配置实现,也可接入Polly等重试组件,针对Twilio 429异常设置最多3次、间隔逐次递增的重试规则。

Twilio官方默认的账户API请求速率限制为每秒100次,2并发的发送频率远低于限制阈值,完成上述修复后不会再触发429错误。

内容的提问来源于stack exchange,提问作者jrandomuser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 01:54:08