我遇到了一些可扩展性/设计问题,这些问题我已经解决了好几个星期,但大多数都失败了,我正在寻找可能的提示。
我想设计一个系统,该系统:
这些作业将分发到不同的“工作者”服务器,我希望一台服务器至少能够处理4000个HTTP传出请求计划作业-减少服务器使用量以及与之相关的成本它。
例如,我运行了一个测试服务器,该服务器计划每1分钟处理4000个作业,并且大多数作业已完成。在crontab中看起来几乎是这样:
* * * * * /usr/bin/node script.js 800 results_proc1_txt.txt
* * * * * /usr/bin/node script.js 800 results_proc2_txt.txt
* * * * * /usr/bin/node script.js 800 results_proc3_txt.txt
* * * * * /usr/bin/node script.js 800 results_proc4_txt.txt
* * * * * /usr/bin/node script.js 800 results_proc5_txt.txt
但是,由于网络问题-这些作业中的一些随机失败,无法建立与目标服务器的连接。一会儿,它在行中为6个请求返回了200个测试网站的返回码,然后突然几分钟后,它返回了基于套接字的错误。我猜这是因为大量并发传出连接。
我的问题:
我们可以做出任何解决方案来安排如此大量的作业吗?
当前解决方案考虑通过在每个“工作”服务器上添加crontab条目,将作业拆分为一些较小的调度程序,这些调度程序与“工作”服务器在同一服务器上运行。
但是,我们希望拥有某种集中式解决方案,该解决方案能够决定应在哪个工作服务器上执行HTTP请求作业(例如,基于负载)。 也许在内存中处理20万个作业时分发听起来很困难。我们不能真正将crontab用于20万个作业,我们必须使用某种内存中的解决方案。
我应该使用某种集中式排队吗? 也许缺少对工人的RPC调用的集中式调度程序?
每分钟添加200k条目可能不是最佳解决方案。 有什么可以使用的解决方案吗?
例如无法随机建立TCP连接-正在处理4000个请求时?如何增加可靠性?我尝试调整随机TCP参数,但是仍然存在“随机因素”-曾经完美响应http请求的服务器仍然会因套接字错误而随机失败(在执行所有这4000个作业的负载期间)。
我当然会验证每个请求以避免误报。但是,验证每个请求所花费的时间可能最多为超时值。