使用 Nodejs 在未来的准确时间发送 HTTP 请求
Posted
技术标签:
【中文标题】使用 Nodejs 在未来的准确时间发送 HTTP 请求【英文标题】:Send HTTP request at exact time in future with Nodejs 【发布时间】:2021-12-23 10:02:05 【问题描述】:我需要在将来以精确的时间戳发出 POST http 请求,尽可能准确,精确到毫秒。但是也有网络延迟。我怎样才能实现这样的目标?
setTimeout 在这里是不够的,因为它总是需要一些时间,导致由于网络延迟不同而导致后来者请求。在目标时间戳之前触发此请求可能会导致请求提前到来。
我的目标是让请求保证在目标时间戳之后到达服务器,但在它之后尽快。您能建议任何使用 Nodejs 的解决方案吗?
【问题讨论】:
1.测量延迟 2. 等待(exactMoment - 延迟),触发请求。 3. ??? 4. 利润! 听起来不错。但是我怎样才能保持延迟测量和主请求之间的连接?应该有一些乒乓球吧? 重点是,除非您有一些保证,否则没有办法做到这一点——这一切都只是猜测。要使其正常工作,您需要: * 具有稳定延迟的专用网络连接 * 另一端的硬实时系统 毕竟,不能保证服务器会开始处理您的请求。如果每个人的想法都和你一样,时间到了,服务器上满是请求怎么办?您已按时发送请求,但仍可能延迟交付。在任何情况下,您都可能需要保持连接和“ping”。 【参考方案1】:在 nodejs(它不是实时系统)中你能做的最好的事情是做以下事情:
预先测量预期的延迟时间,以便了解发送请求的时间。
使用setTimeout()
将发送安排在您的目标时间之前的单向延迟时间。 nodejs 中没有其他机制更精确。
如果您的请求涉及 DNS 查找,您可以为您的主机名预取 TCP 地址,并将 DNS 查找时间从您的请求周期中取出,或者至少准备好本地 DNS 缓存。
创建一个不做任何其他事情的专用 nodejs 程序 - 这样它的事件循环在setTimeout()
需要运行时不会做任何其他事情。如果需要,您可以在较大的程序中将其作为 child_process 运行。
运行一些测试以查看时间是如何工作的,如果您始终偏离一定幅度,则调整您的延迟偏移量。
您可以开发定期延迟测试来确定延迟是否随时间变化。
正如其他人所说,无法预测目标服务器的自然响应时间(从网络数据包到达那里开始处理您的请求需要多长时间)。如果大量传入请求都在同一时间段内竞争,那么您的请求将在所有其他请求中交错并以您无法控制的某种顺序提供服务。
您可以考虑的其他事项。如果目标服务器支持最新的 http 规范,那么您可以与主机(可能针对其他端点)建立预先建立的 http 连接,该连接将保持活动状态,以便您发送精确的计时请求。这需要一些实验来确定目标主机支持什么以及这是否可行。
【讨论】:
以上是关于使用 Nodejs 在未来的准确时间发送 HTTP 请求的主要内容,如果未能解决你的问题,请参考以下文章
使用脚本从客户端发送 http post 并在 NODEJS 中获取请求