使用 Nodejs 在未来的确切时间发送 HTTP 请求

Send HTTP request at exact time in future with Nodejs

我需要在将来的确切时间戳发出 POST http 请求,尽可能准确,精确到毫秒。但是也有网络延迟。我怎样才能实现这样的目标?

setTimeout 在这里是不够的,因为它总是需要一些时间导致迟到请求由于不同的网络延迟。在目标时间戳之前触发此请求可能会导致提前到达请求。

我的目标是保证请求在目标时间戳后到达服务器,但在它之后尽快。你能建议任何关于 Nodejs 的解决方案吗?

您在 nodejs(不是实时系统)中可以做的最好的事情是执行以下操作:

  1. 预先测量预期的延迟,这样您就知道需要多长时间才能发送请求。

  2. 使用 setTimeout() 将发送安排在您的目标时间之前的单向延迟时间。 nodejs 中没有其他机制更精确。

  3. 如果您的请求涉及 DNS 查找,您可以为您的主机名预取 TCP 地址,并将 DNS 查找时间从您的请求周期中取出或至少准备好本地 DNS 缓存。

  4. 创建一个不做任何其他事情的专用 nodejs 程序 - 因此它的事件循环在 setTimeout() 需要 运行 时不会做任何其他事情。如果需要,您可以从较大的程序中 运行 将其作为 child_process。

  5. 运行 进行多项测试以查看时序如何工作,如果您始终偏离一定程度,则调整您的延迟偏移量。

  6. 您可以开发定期延迟测试以确定延迟是否随时间变化。

正如其他人所说,无法预测目标服务器的自然响应时间(从您的网络数据包到达那里开始处理您的请求需要多长时间)。如果大量传入请求都在争夺同一时间段,那么您的请求将交织在所有其他请求中,并以您无法控制的某种顺序提供服务。

您可以考虑的其他事情。如果目标服务器支持最新的 http 规范,那么您可以与主机(可能针对其他端点)建立预先建立的 http 连接,该连接将保持活动状态,以便您发送精确的计时请求。这将需要一些实验来弄清楚目标主机支持什么以及这是否可行。