将 Node.js 用于任务队列工作程序而不是任何其他语言(如 PHP/Python/Ruby),我会有什么优势吗?
我想为简单的任务队列任务学习 Redis,例如发送大量电子邮件,并且不想让用户等待建立连接等。
所以问题是:node.js 的异步特性在这种情况下有帮助还是没用?
PS我知道由于高效的V8引擎,节点在内存消耗和计算方面比任何一种语言都快,也许有可能在这个领域获胜?
这实际上取决于您熟悉什么,以及哪种语言为您尝试执行的工作提供支持。例如,如果您正在渲染 PDF 文件,您熟悉哪种语言,哪个 PDF 库最好?
由于工作分散到多个工作人员的方式,工作人员具有能够运行同步的阻塞代码的优势。拥有异步工作者只是意味着每个工作者进程理论上可以比单线程阻塞等效项做更多的工作。
但是,在支持线程的语言中,这种优势是微乎其微的。Python 和 Ruby 都支持线程,这是一种并行运行多个同步代码块的方式。
在为大容量电子邮件应用程序构建分布式工作队列时,我使用EventMachine库在异步非阻塞 Ruby 中实现了其中的大部分。Redis 用作后备存储以确保幂等性。
编写适当的异步事件驱动代码一直具有挑战性,因为您需要确保所有库都是非阻塞的,否则可能会导致工作进程阻塞。这与在执行线程时查找线程安全的库没有什么不同。
Node 可以很好地完成很多事情,但线程不是其中之一。好消息是大多数 Node 库默认情况下都是非阻塞的,因此兼容性问题不大。对于大多数 Python 和 Ruby 库来说,情况并非如此,但其中大多数至少是线程安全的。
最后,这取决于您最满意的是什么。分布式工作系统可能涉及多种不同的语言,因此您不一定会被锁定在任何特定的语言中。
我已经将 Node.js 用于任务工作者,用于调用用 PHP 编写的可运行网页或在某些主机上运行命令的作业。在这两种情况下,Node 只是初始化(触发)作业,等待然后评估结果。繁重的/CPU密集型工作由另一个系统/程序完成。
希望这可以帮助!