【问题标题】:Guarantees about latency in node.js关于 node.js 中延迟的保证
【发布时间】:2017-11-28 07:24:31
【问题描述】:

对于node.js 事件循环中任何单个请求的延迟是否有明确的考虑? AFAICT 每个 IO 调用都会返回一个eventEmitter,它会发出一个事件。通过使用pipe 对所有事件的处理进行多路复用。因此,对于 important 请求需要处理的event 可能被放置在管道中太远。是否有某种优先级队列可用于安排 eventHandlers 的执行顺序?

Here's why I asked this question in the first place。我决定给出一个gist.github链接,因为原因很长并且与技术问题有关

【问题讨论】:

  • 链接现在指向 404

标签: node.js latency starvation


【解决方案1】:

不清楚你在这里问的是什么。您的 Javascript 不会直接将内容添加到事件队列(仅使用本机代码完成)。相反,您调用一些异步操作,并且该操作背后的本机代码在异步操作完成时将一些内容添加到事件队列中。

这篇文章The Node.js Event Loop, Timers, and process.nextTick() 为您详细介绍了事件队列的服务方式以及它如何处理不同类型的事件(定时器、I/O 等...)。

一般情况下,事件类型中的事物是 FIFO(先进先出),但有一些例外。

process.nextTick() 将在等待 I/O 事件之前运行其回调。

setImmediate() 将在等待 I/O 事件后运行其回调。

更多详情:setImmediate vs. nextTicknextTick vs setImmediate, visual explanationsetTimeout vs. setImmediate vs. nextTick

因此,对于重要请求需要处理的事件可能会被放置在管道中太远。

您必须向我们展示您所关注的具体情况。如果您自己正在使用setTimeout()setImmediate()process.nextTick() 安排回调,那么您可以通过选择这三个中的哪一个来控制何时发生。如果您不是自己调度它(例如,它是某些异步操作的完成回调),那么您就无法控制它在事件循环中的调度。它将进入与其类型匹配的子队列,并从该阶段或事件循环中获得 FIFO 服务(如上述文章中所述)。

是否有某种优先级队列可用于安排 eventHandlers 的执行顺序?

没有公开的优先系统。在事件类型中,事物是先进先出的。同样,如果您给我们一个实际的编码示例,以便我们可以准确地看到您正在尝试做什么,我们可以为您的选择提供一些帮助。您可能可以使用已经可用的setTimeout()setImmediate()process.nextTick() 工具,或者您可能希望实现自己的任务排队和优先级系统,该系统运行上述三种方法中的一些允许您优先级自己已经排队的东西。

【讨论】:

  • 嗨@jfriend00 感谢您的详细回复。我实际上只是在学习 web api 开发,并试图了解 gevent twisted node.js asyncioj2ee tomcat 等之间的差异。我刚刚观看了 Ryan Dahl 的 2009 视频并根据他对事件循环这是我想到的问题。老实说,如果有一本书/博客文章涵盖了所有 javajavascriptpython web/rpc 框架,并按功能/应用程序对它们进行分类,那会很有帮助,但我怀疑这样的事情存在。
  • @Pushpendre - 很少有人会因为您要问的问题而选择一种语言/框架,因此这不太可能成为主要文章中的比较点。相反,您必须研究每种语言本身的工作原理并进行自己的比较。如果您解释了您的实际用例,我们才能真正提供进一步的帮助,这样我们才能理解您为什么关心以及您想要完成什么。我从未发现 node.js 在这方面对我编写的任何代码都有限制,因此需要了解您要做什么。
  • 嗨,我在下面的要点中准确地写下了我想要做的事情并更新了问题。我希望这可以让我更多地了解我提出这个问题的原因。 gist.github.com/se4u/a492ca3ef327a7816362a8be0d02d403
  • @Pushpendre - 我认为您的任何选择都可以按照您的建议进行(以您提供的最低限度的详细信息)。您说的是 10k/hr 的峰值负载约为 3 个请求/秒。根据响应典型请求所需的时间,您可能需要也可能不需要涉及多个进程(例如 node.js 的集群),但您可以衡量可伸缩性并在时机成熟时进行调整。您在那里描述的内容没有描述事件循环调度的任何要求。
  • 再次感谢您阅读我发布的内容!并帮助我理清头绪。另外我想指出,我将描述保持在最低限度并不是为了隐藏我想要做的事情,而是因为我害怕如果太长没有人会读到它。
【解决方案2】:

关于事件循环中的执行优先级:

  1. setImmediate() 在 setTimeout(fn, 0) 之前运行
  2. nextTick() 在下一个刻度(迭代)触发回调

node.js 中的事件循环本身不支持优先级。您始终可以实现自己的优先级队列或使用现有的优先级队列,并将您的功能分配给优先级队列。

【讨论】:

猜你喜欢
  • 2021-08-25
  • 2010-10-20
  • 1970-01-01
  • 2014-04-04
  • 2012-08-08
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 2021-03-28
相关资源
最近更新 更多