我必须从我的nodejs app进行一百万次http调用。
除了使用异步lib进行操作外,回调还有其他方法可以并行调用这些请求以更快地处理它吗?
请建议我使用相同的
答案 0 :(得分:3)
正如您问题的标题似乎要问的那样,实际制作数百万个并行请求实在是有些愚蠢。同时在飞行中提出许多请求将无法帮助您更快地完成工作,并且可能会耗尽许多系统资源(内存,插槽,带宽等)。
相反,如果目标是尽可能快地处理数百万个请求,那么您需要执行以下操作:
启动足够的并行node.js进程,以便使用可用于处理请求响应的所有CPU。如果进程中涉及的每个服务器中有8个核心,则每个服务器启动8个node.js进程。
尽可能多地安装网络带宽功能(高吞吐量连接,多个网卡等),以便尽快进行网络连接。
对所有I / O使用异步I / O处理,以便尽可能高效地使用系统资源。请注意磁盘I / O,因为node.js中的异步磁盘I / O实际上使用了节点实现内部的有限线程池,因此您无法在同一个实际飞行中同时拥有无限数量的异步磁盘I / O请求时间。如果您尝试这样做,您将不会收到错误(多余的请求将排队),但它也无法帮助您提高性能。 node.js中的网络是真正的异步,因此没有这个问题。
每个node.js进程只打开同时多个请求,因为实际上对您有益。这个数量(可能介于2到20之间)取决于处理请求的总时间是网络与CPU的比例以及响应速度有多慢。如果所有请求都发送到同一台远程服务器,那么请求对其进行饱和可能对您没有帮助,因为您已经要求它尽可能多地执行此操作。
在多个node.js进程之间创建协调机制,以便为每个工作提供服务并可能收集结果(通常使用工作队列)。
疯狂测试并发现瓶颈所在,并研究如何调整或更改代码以减少瓶颈。
如果您的请求全部来自同一个远程服务器,那么您必须弄清楚它对多个请求的行为方式。如果您同时触发10个请求,而一次触发100个请求,则较大的服务器场可能不会有太大不同。但是,如果您同时触发100个请求,则单个较小的远程服务器实际上可能会表现得更糟。如果您的请求全部是针对不同的主机,那么您根本就没有这个问题。如果您的请求是针对不同主机和相同主机的混合,则可能需要付费将它们分散到不同的主机,以便您不会同时向同一主机发送100个。
这背后的基本思想是:
您希望最大限度地利用CPU,以便每个CPU始终尽可能多地使用。
由于您的node.js代码是单线程的,因此每个核心需要一个node.js进程,以便最大限度地利用可用的CPU周期。添加超出内核数量的其他node.js进程只会产生不必要的操作系统上下文切换成本,并且可能无法提高性能。
您只需要在飞行中同时有足够的并行请求来保持CPU的工作。飞行中有大量超额请求超出了提供CPU所需的数量,这只会增加内存使用量,超出有用的范围。如果你有足够的内存来容纳多余的请求,那么拥有更多的请求并没有害处,但它也没有帮助。因此,理想情况下,您可以设置一次飞行中的请求数量超过保持CPU忙碌所需的数量。