【问题标题】:How to apply clustering/spawing child process techniques for Node.js application having bouth IO bound and CPU bound tasks?如何为具有 IO 绑定和 CPU 绑定任务的 Node.js 应用程序应用集群/生成子进程技术?
【发布时间】:2016-12-28 08:57:06
【问题描述】:
我正在开发一个 IOT 项目,其中 Node.js 应用程序执行以下任务:
1.使用异步消息库(IO绑定)读取消息流
2. 根据 Node.js 应用程序发送的消息将消息发送到发生机器学习的 Web 服务(IO 绑定,因为仅涉及 API 调用)
3. 从 Web 服务接收机器学习生成的模式(使用 REST API)
4. 将模式与实时流式消息进行比较(CPU 密集型,因为模式匹配涉及复杂的算法)。
5. 记录堆栈跟踪(IO 绑定)
将开发一个 node.js 应用程序,将这些功能作为单独的任务在默认情况下在单线程下运行。事实上,生成子进程仅对 CPU 密集型任务有用,如何为 node.js 进程进行集群,同时执行 IO 和 CPU 绑定任务?我们是否需要在这个 node.js 应用程序上部分执行集群?
谁能推荐这个node.js应用的有效架构?
【问题讨论】:
标签:
node.js
performance
architecture
child-process
spawning
【解决方案1】:
如果您有任何 CPU 密集型任务,则对所有请求使用集群。
集群进程也在执行一些 I/O 密集型工作这一事实不会对您造成伤害,但您会希望集群进程用于 CPU 密集型工作。因此,只需将您的服务器集群化,并让每个集群处理请求的全部负载(I/O 和 CPU 负载)。
简而言之,CPU 密集型的东西是集群的主要驱动力。如果集群进程也在执行非阻塞 I/O,这不会造成任何损害。事实上,集群达到可用 CPU 的数量甚至可以在高负载情况下帮助一些 I/O 密集型进程(尽管没有 CPU 密集型进程的帮助那么多)。
一种替代方法,虽然它可能是一个更复杂的实现,是使用子进程或新的工作线程仅用于请求处理的 CPU 密集型部分。在这种情况下,您将创建某种工作队列和一组子进程或工作线程以在队列中执行操作,并且您的主进程会将任务分配给队列中的每个子进程。使用这种方案,您可以准确地决定哪些代码通过工作队列执行,哪些代码留在主进程中,尽管您现在必须使用某种进程间通信在两者之间进行协调。