我有向某些第三方API发出请求并从中返回响应的方法。 由于此API每1分钟仅允许50个调用,因此我想限制对此API的请求。
目前,我正在考虑使用Polly,并在代码中添加类似包装器的内容
$o->$p()
但是也许这是更好的方法。
答案 0 :(得分:2)
Polly
很好,我们在基础架构中将其用于微服务之间的重试机制,但是我不推荐.WaitAndRetryForever
,因为它听起来确实很危险,就像@Stefan所说的那样。如果第三方API在30分钟的维护/停机/无响应状态中会发生什么,我知道这种情况很少发生,但仍然会发生。
我建议使用Polly
解决网络问题。例如,第三方API可能会出现网络中断时间,但与节流无关。
关于节流,我建议创建一些queue based模式,在其中存储请求并以给定的速率处理它们。
遗憾的是,这还有两个缺点:
由于我不知道您的API的性质,就我所能提供的建议而言,您必须确定这是否适合您。祝你好运!
注意:如果您将.waitAndRetryForever
用于内部通信,并且希望放松自己的service-level agreement,则还不错。 (您不希望整个基础架构崩溃,例如仅因为一项服务失效)。
答案 1 :(得分:0)
我更愿意控制一切(根据需要自定义)
您还可以扩展工作人员以并行地发出多个请求
示例
{{2 }}工人阶级
Worker worker = new Worker();
worker.OnRetry += (id) =>
{
//called when error occurs
//here you can wait as you want and send next request
};
worker.OnRespnse += (sender, success) =>
{
//called on response
//customize success depend on response status-code/body
//here you can wait as you want and send next request
};
worker.Start("request body");
//you can start this worker over and over