起搏速率限制 API
起搏速率限制 API
今天,大多数应用程序都是 API 驱动的。无论是创建天气预报、金融行情、体育比分提醒,还是翻译当地语言,您都需要连接 3rd 方 API 来访问您需要的数据。 API 通常被计量并限制使用。
设置场景
假设您要检索所有人的天气预报 19000
印度的(大约)邮政编码 (PIN)。一个请求只包含一个邮政编码的预测,最大API调用率为每秒50次。
你不能打 19000
立即请求检索数据。我们需要建立一种按节奏请求的机制。
这篇文章将演示如何创建一个 Pacer(在 Typescript 中),它可以接收所有对 pin 码的请求并以适当的速率访问 API。浏览器和节点端都将与代码兼容。
编码
最好将 API 调用逻辑和起搏逻辑分开。然后可以在不同的上下文中应用起搏。起搏逻辑很可能包含在一个类中。
起搏器界面
类步行者
接受请求并以给定的速度处理它们。它提供了一种接受请求的方法。请求包含执行它的可执行代码,Pacer 决定何时运行该代码。
使用起搏器
要添加请求,我们必须使用 步伐
实例化后的方法 起搏器
以所需的速率。
实施起搏器
首先,我已经展示了 步伐
方法实现为:
使用上述实现时,pace 方法会在接收到请求后立即执行,类似于没有 pacing 的代码。因此,我们需要更进一步。
微配料
请求必须被批处理并每秒执行一次以进行适当的实施。这种技术被称为微批处理:小批量,频繁执行。为了以可控的方式完成请求,我们需要一个 Queue 和一个 Executor。
队列
一个请求将是 一收到就排队。 我们还需要返回请求结果的 Promise。但是我们不能在不执行请求的情况下解决承诺。
一个 代理承诺, 它将在执行时捕获请求的结果,将被返回。我们需要将其解析和拒绝引用与请求一起存储。
执行
一个可靠的设计选择是将请求执行保持在一个单独的函数中,该函数执行多个排队的请求。现在,我们需要每秒触发一次。
设置超时()
是合理的构造使用比 设置间隔
(),与 设置超时
我们可以控制下一次执行。
调度逻辑
- 当一个请求被接受时,它可能会立即被处理,如果没有安排执行,它可能会延迟几毫秒。
- 在执行端,在触发请求后,我们检查队列大小,以便以 1s 的延迟调度下一次执行。
Scheduling Logic | Image is partly created using https://www.nomnoml.com
如果请求在一秒钟内完成,则执行工作;在现实世界中几乎不是这种情况。为了使其更有效,我们必须跟踪正在处理的请求数量并相应地调整速度。
下一步是什么?
这是实际的实施。另一种选择是包括重试或失败机制。我还没有想过实现这个功能;感谢您的反馈以改进它。
该代码可在以下位置访问:
[
GitHub - DM8tyProgrammer/api-pacer
您目前无法执行该操作。您使用另一个选项卡或窗口登录。您在另一个选项卡中退出或...
github.com
](https://github.com/DM8tyProgrammer/api-pacer)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明