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
相关产品推荐
相关产品推荐

