- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
据我了解,Node 事件 IO 模型的后果之一是,一旦您连接了接收事件,就无法告诉(例如)通过 TCP 套接字接收数据的 Node 进程阻塞处理程序(或以其他方式开始监听数据)。
如果接收方不能足够快地处理传入的数据,则可能会导致“无限并发”,即引擎盖下的 Node 会继续尽可能快地从套接字读取数据,并在事件上安排新的数据事件在套接字上循环而不是阻塞,直到进程最终耗尽内存并死亡。
接收方不能告诉 Node 放慢读取速度,否则会允许 TCP 的内置流量控制机制启动并向发送方指示它需要放慢速度。
首先,到目前为止我所描述的是否准确?有什么我错过的东西可以让 Node 避免这种情况吗?
Node Streams 备受吹捧的功能之一是自动处理背压。
AFAIK,可写流(tcp 套接字)判断它是否需要减速的唯一方法是查看 socket.bufferSize
(指示写入套接字但尚未发送)。鉴于接收端的 Node 总是尽可能快地读取,这只能表明发送方和接收方之间的网络连接速度较慢,而不是接收方是否跟不上。
其次,Node Streams 自动背压能否在这种情况下以某种方式工作以处理无法跟上的接收器?
这个问题似乎也影响了通过 websockets 接收数据的浏览器,原因类似,websockets API 没有提供一种机制来告诉浏览器减慢它从套接字的读取速度。
对于 Node(以及使用 websockets 的浏览器)来说,解决这个问题的唯一方法是在应用程序级别实现手动流量控制机制,以明确告诉发送进程放慢速度吗?
最佳答案
为了回答您的第一个问题,我认为您的理解并不准确——至少在流之间传输数据时不准确。事实上,如果您阅读了 pipe() function 的文档,您会看到它明确表示它会自动管理流,因此“目标不会被快速可读的流淹没。”
pipe() 的底层实现为您处理所有繁重的工作。输入流(Readable 流)将继续发出 data事件,直到输出流(Writable 流)已满。顺便说一句,如果我没记错的话,当您尝试写入当前无法处理的数据时,流将返回 false。此时,管道将pause()可读流,这将阻止它发出进一步的数据事件。因此,事件循环不会填满和耗尽您的内存,也不会发出简单丢失的事件。相反,Readable 将保持暂停,直到 Writable 流发出 drain事件。此时,管道将resume()可读流。
秘诀在于将一条流引入另一条流,它会自动为您管理背压。这有望回答您的第二个问题,即 Node 可以并且确实通过简单的管道流自动管理此问题。
最后,实际上没有必要手动实现它(除非您从头开始编写新的流),因为它已经为您提供了。 :)
处理这一切并不容易,正如宣布 streams2 的 Node 博客文章所承认的那样。 Node 中的 API。这是一个很好的资源,当然比我在这里提供的信息要多得多。然而,您应该知道的一个不完全明显的小问题,来自文档 here并且出于向后兼容性的原因:
If you attach a data event listener, then it will switch the stream into flowing mode, and data will be passed to your handler as soon as it is available.
因此请注意,附加数据事件监听器以尝试观察流中的某些内容将从根本上将流更改为旧的做事方式。问我how I know .
关于基于 TCP 的 Node.JS 无界并发/流背压,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25237013/
我正在尝试在多线程环境中实现某种累积逻辑;我想知道没有 lock 和 synchronized 关键字是否有更好/更快的方法来做到这一点?以下是我当前的代码: public class Concurr
我需要帮助构建一个实现信号量的监视器,简单的 C 示例就可以。 这是为了证明可以在任何可以使用信号量的地方使用监视器。 最佳答案 如果您说允许使用互斥锁/condvars,请检查: #include
我已经构建了一些返回部分产品目录的 ajax,并且我正在尝试将 xml 输出到文档中,到目前为止,这是我所拥有的: $("#catalog").append("Item NamePriceDe
很抱歉,如果我的问题之前已经被问过,或者它太明显了,但我真的需要澄清这一点。感谢您的帮助。 在多用户界面中,如果来自不同用户的相同事务同时到达服务器,会发生什么? 我有下一张表: create tab
这可能是一个愚蠢的问题,但是这个程序的输出(它的方式)可以为零吗? public class Test2{ int a = 0; AtomicInteger b = new Atomi
假设我本地主机上的一个网站处理每个请求大约需要 3 秒。这很好,正如预期的那样(因为它在幕后进行了一些奇特的网络)。 但是,如果我在选项卡(在 firefox 中)中打开相同的 url,然后同时重新加
我对 MongoDB 的读锁定有点困惑。单个集合可以支持多少个并发读取操作? 最佳答案 如 tk 给出的链接中所写:http://www.mongodb.org/pages/viewpage.acti
如果有四个并发的 CUDA 应用程序在一个 GPU 中竞争资源会发生什么这样他们就可以将工作卸载到图形卡上了? Cuda Programming Guide 3.1 提到那里 某些方法是异步的: 内核
👊上次的百度面试遇到了关于spark的并发数的问题,今天我们就来将这些问题都一并解决一下,图画的的有点丑,还行大家见谅,百度实习的问题我放在了下面的链接👇: 链接: 2022百度大数据开发工程师实
我对 Groovy 线程有疑问。 我的任务是以某种方式翻译给定目录中的每个文件 并将生成的输出放在其他目录中的文件中。 我编写了以下代码,该代码有效: static def translateDir(
Java中的同步和锁定有什么区别? 最佳答案 synchronized是语言关键字;锁是对象。 当一个方法或代码块被标记为同步时,您是说该方法或代码块必须先获得某个锁对象(可以在同步的语法中指定)才能
我需要创建一个能够同时处理来自客户端的多个请求的并发 RPC 服务器。 使用 rpcgen linux编译器(基于sun RPC),不支持-A为并发服务器创建 stub 的选项。 (-A 选项在 so
System.out.println("Enter the number of what you would like to do"); System.out.println("1 = Manuall
我正在将我的应用程序移植到 iOS 8.0 并注意到 UIAlertView 已被弃用。 所以我改变了使用 UIAlertController 的方法。这在大多数情况下都有效。 除了,当我的应用程序打
我正在逐行同时读取两个文本文件。 我特别想做的是当lineCount在每个线程上都是相同的我想看看扫描仪当前正在读取的字符串。 我环顾四周寻找可以实现的某些模式,例如 Compare and Swap
我正在阅读 Java Concurrency in Practice .在章节中断政策部分 取消和关闭 它提到 A task should not assume anything about the
我正在尝试学习线程,互斥等的基础知识。遵循here的文档和示例。在下面的代码中,我得到预期的输出。问题: 想确认我是否有任何陷阱?我们如何改善下面的代码? 我的线程在哪一行尝试获取互斥锁或正在等待互斥
并发是指两个任务在不同的线程上并行运行。但是,异步方法并行运行,但在同一个线程上。这是如何实现的?另外,并行性怎么样? 这三个概念有什么区别? 最佳答案 并发和并行实际上与您正确推测的原理相同,两者都
以此ConcurrentDouble类定义为例: public class ConcurrentDouble { public double num = 0; public void subt
在得知并发确实增加了许多人的吞吐量后,我一直计划在项目中使用并发。现在我在多线程或并发方面还没有做太多工作,因此决定在实际项目中使用它之前学习并进行简单的概念验证。 以下是我尝试过的两个示例: 1.
我是一名优秀的程序员,十分优秀!