对于一个游戏项目,我正在构建一些在可扩展性方面存在一些挑战的东西,这似乎与您通常扩展 web 应用程序的方式相反。简而言之,我有一个接收请求的网络服务器,这些请求自然地由应用服务器(Jetty)的线程池并行执行。到目前为止,最容易的部分。
对于每个请求,服务器需要同时调用大量(例如 500 - 1000)参与者(运行他们自己的简单 web 应用程序),收集他们的动作并将它们组合成一个结果来回答初始传入请求。参与者是由参与游戏的不受信任的程序员编写的简单 web 应用程序。他们可能太慢或无法访问,或者积极尝试通过缓慢响应来破坏事物。
应用服务器通常设计为使用 ThreadPool 干净地处理传入请求。但是您将如何处理传出请求部分?我考虑过启动线程(或使用线程池)来调用每个参与者,然后在这些线程中使用来自 Apache httpcomponents 的 HttpClient 来设置严格的超时(例如“必须在 500 毫秒内响应”)并让主请求线程等待让他们都完成。可能使用 ConnectionManager 和 keep-alive 以确保线程尽可能快地返回(如果参与者没有停止,很可能不会这样做)
但是对于只有 20 个并发传入请求和 500 个参与者,它们将启动 10000 个线程(或者如果线程池小于这个值,则阻塞线程池),这不是一个好主意。
我一直无法找到通用的解决方案,我发现的大多数东西都是围绕扩展事物的服务器端(例如查看 Apache Mina)而写的,而在这种情况下,我基本上是作为一个非常高容量延迟敏感的客户端。
那么有没有共同的方法呢?也许(开源)程序可以做类似的事情,我可以分析?使用 NIO 处理大量传出请求的库?或者围绕这个设计的库?