什么是node.js模式,用于通过工作进程返回对客户端的响应

swa*_*ang 3 http websocket node.js express

如果我想使用Web服务器,消息队列和x N工作进程处理客户端请求,通常的模式是什么?

我能想到的是:

  1. 工作人员从队列中取出作业,处理它,保存结果供客户端轮询.因此,Web服务器和工作者之间没有通信

  2. 工作人员从队列中取出作业,处理它,将其发送到结果队列,这将由Web服务器使用(如何使用express执行此操作?),然后Web服务器将其发送回客户端.同时客户端将等待(这仍称为长轮询吗?)

  3. Web服务器立即返回响应,将作业推送到工作队列.工作人员从队列中获取作业,处理它,将其发送到结果队列,该队列将由Web服务器使用,然后Web服务器通过websocket将其发送给客户端.在这种情况下,客户端不必.

以下哪些最常用?或者有更好的解决方案吗?

jfr*_*d00 5

  1. 工作人员从队列中取出作业,处理它,保存结果供客户端轮询.因此,Web服务器和工作者之间没有通信

这种情况很少见,因为客户端通常只与Web服务器通信.因此,除非您打算让easy worker成为某个附加端口上的Web服务器并启用与它们的CORS通信,否则通常不会这样做.

  1. 工作人员从队列中取出作业,处理它,将其发送到结果队列,这将由Web服务器使用(如何使用express执行此操作?),然后Web服务器将其发送回客户端.同时客户端将等待(这仍称为长轮询吗?)

如果您有计算密集型(例如CPU绑定)操作,这在node.js中相对常见,因为这是允许node.js在计算密集型操作时更好地扩展的一种方法.使用集群模块可能更常见,只需启动N个相同的node.js进程并在它们之间共享负载,因为这可能比将结果传回Web服务器的单独工作进程更容易实现.

  1. Web服务器立即返回响应,将作业推送到工作队列.工作人员从队列中获取作业,处理它,将其发送到结果队列,该队列将由Web服务器使用,然后Web服务器通过websocket将其发送给客户端.在这种情况下,客户端不必.

是否通过长时间运行的HTTP连接或通过webSocket与客户端进行通信取决于一系列因素.如果计算时间很长(例如,多分钟,则可能会遇到浏览器超时问题,因此在几分钟内让客户端轮询或使用webSocket可能更简单).如果这是唯一被用于它的东西,我倾向于不使用webSocket.但是,如果有其他原因让webSocket用于将通知从服务器推送到客户端,我绝对会将其用于此目的.

以下哪些最常用?或者有更好的解决方案吗?

聚类(与您的选项都不匹配)可能是最常用的.但是,如果您有大量计算密集型操作,那么拥有一组服务于请求队列的工作进程是node.js中的常见设计模式.

请记住,如果操作长时间运行只是因为多个数据库操作需要一段时间才能完成,但这些操作大多是异步操作,那么您根本不需要工作人员.如果每个连接只执行一系列异步操作,node.js可以很好地扩展到大量的并发连接.因此,当您有CPU密集型事情时(通常会阻止node.js线程在其运行时能够执行任何其他操作),您通常只需要进入群集或工作进程.一系列20个异步数据库操作可能需要几分钟才能完成,不需要集群主节点.js进程或工作程序以便在node.js中进行扩展.事实上,它可能需要扩展您的数据库服务器,而不是其他任何东西.

所以,按照有多常见的顺序,我会说你会看到这个:

  1. 使用异步I/O的代码,您可以通过单个node.js进程获得大量同时请求的良好可伸缩性.

  2. 使用node.js群集为每个CPU添加群集.这样可以至少最大限度地提高CPU对CPU操作的绑定部分的利用率.显然,您应该使用异步I/O进行编码以最大限度地提高可伸缩性.

  3. 如果您具有已在外部进程中实现或受CPU限制的特定操作,则可以使用队列和工作器体系结构.如果事情是CPU限制的并且您正在使用异步I/O,那么在没有多台服务器的情况下,拥有更多的工作人员比拥有CPU更多.

是否将结果作为长时间运行的HTTP响应或通过webSocket进行通信是一个完全正交的问题,更多地取决于结果需要多长时间(使用长时间运行的HTTP响应是否实际),是否还要回传沿途的进展以及您是否因其他原因已经拥有webSocket连接.问题的这一部分不应该推动关于如何实现多个流程的其他选择.