如何设计必须每隔1分钟执行数千个HTTP请求的应用程序?

时间:2019-07-17 20:20:26

标签: networking tcp distributed-computing scalability

我遇到了一些可扩展性/设计问题,这些问题我已经解决了好几个星期,但大多数都失败了,我正在寻找可能的提示。

我想设计一个系统,该系统:

  1. 已发送大约50000-200000个发出的HTTP / s请求-计划每分钟执行一次。作业执行的时间很重要,到达目标服务器并进行报告的最大延迟必须在5到10秒左右。当然,这将考虑目标HTTP服务器快速响应的情况。对于这些HTTP请求中的每一个,TCP SYN / HTTP请求方案失败的一般全局超时为30秒。调度很关键。

这些作业将分发到不同的“工作者”服务器,我希望一台服务器至少能够处理4000个HTTP传出请求计划作业-减少服务器使用量以及与之相关的成本它。

  • 我尝试了许多不同的代码/库和方法来找出什么是“最便宜”的以非阻塞方式发送大量HTTP请求的方法,包括python异步io库(aiohttp),分散在不同的流程中由于异步处理,这些似乎是执行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个测试网站的返回码,然后突然几分钟后,它返回了基于套接字的错误。我猜这是因为大量并发传出连接。

我的问题:

  1. 如何设计该系统?在工作安排方面?

我们可以做出任何解决方案来安排如此大量的作业吗?

当前解决方案考虑通过在每个“工作”服务器上添加crontab条目,将作业拆分为一些较小的调度程序,这些调度程序与“工作”服务器在同一服务器上运行。

但是,我们希望拥有某种集中式解决方案,该解决方案能够决定应在哪个工作服务器上执行HTTP请求作业(例如,基于负载)。 也许在内存中处理20万个作业时分发听起来很困难。我们不能真正将crontab用于20万个作业,我们必须使用某种内存中的解决方案。

  1. 我如何使工作人员处理请求?

我应该使用某种集中式排队吗? 也许缺少对工人的RPC调用的集中式调度程序?

每分钟添加200k条目可能不是最佳解决方案。 有什么可以使用的解决方案吗?

  1. 如何最大程度地增加每个辅助服务器处理的HTTP请求数,以避免随机网络问题?

例如无法随机建立TCP连接-正在处理4000个请求时?如何增加可靠性?我尝试调整随机TCP参数,但是仍然存在“随机因素”-曾经完美响应http请求的服务器仍然会因套接字错误而随机失败(在执行所有这4000个作业的负载期间)。

我当然会验证每个请求以避免误报。但是,验证每个请求所花费的时间可能最多为超时值。

0 个答案:

没有答案