Ahm*_*ıcı 3 multithreading backend node.js express node-worker-threads
我有一个 Express 后端应用程序,它侦听来自 Web 应用程序的 http 请求。该后端应用程序在 AWS ECS Fargate 上运行。
所以我的问题是,在这个后端应用程序中使用 Node.js 中的多线程、工作线程是否有意义?端点中既有 CPU 密集型功能,也有非密集型功能。例如,无论调用强度如何,我是否应该立即将任何传入请求分发到其他线程,以便主线程永远不会被阻塞?或者我应该只在密集型作业等上使用多线程。
非常感谢有关此主题的任何建议、优点和缺点。
像这样的问题最终只有通过在代表性负载下分析系统才能真正得到答案。这是因为我们对 CPU 占用情况和占用量的估计很少非常好 - 必须对这些东西进行测量才能真正了解。
也就是说,您可以考虑一些通用设计指南:
如果您事先认为特定请求可能会占用 CPU 资源,那么您可能需要考虑将这些请求放入由线程池提供服务的队列中。
如果您有特定的请求,并且您事先认为这些请求实际上只是执行非阻塞 I/O,那么这些请求根本不需要通过线程变得复杂。主线程可能可以很好地处理这些问题。
如果您的请求中只有相对较小的一部分是 CPU 密集型的,那么最简单的设计可能是使用 Nodejs 集群模块,让它在 CPU 之间分散您的请求,计算出它本身(没有任何其他重大设计更改)将得到任何CPU 密集型请求脱离主循环。如果您的请求中有很大一部分是受 CPU 限制的,并且您希望优先考虑非 CPU 请求,以便它们总是很快,那么您可能会更好地使用线程池,将 CPU 密集型请求传递给线程池,以便非 CPU 请求能够被处理。 -CPU 繁重的请求不会被它们阻止。
所以我的问题是,在这个后端应用程序中使用 Node.js 中的多线程、工作线程是否有意义?
是的,在某些情况下。但是,何时添加这一额外的复杂层实际上取决于请求中 CPU 使用情况的具体指标。
例如,无论调用强度如何,我是否应该立即将任何传入请求分发到其他线程,以便主线程永远不会被阻塞?或者我应该只在密集型作业等上使用多线程。
这取决于您希望如何对不同请求进行优先级排序。如果您希望请求按 FIFO 顺序排列优先级,其中每个请求都根据其到达时间按顺序启动,无论请求类型如何,那么您可以将所有请求分发到线程。事实上,为此使用集群模块可能更容易,因为这就是它的作用。另一方面,如果您希望非 CPU 密集型请求始终快速运行,而不必在 CPU 密集型请求后面等待,那么您可能只想将 CPU 密集型请求推送到由 CPU 处理的队列中。线程池。这样,主线程就可以立即处理非 CPU 密集型请求,无论线程池中当前有多少 CPU 密集型请求正在处理。
归档时间: |
|
查看次数: |
3161 次 |
最近记录: |