这是我的第一个 SO 问题,所以请耐心等待我 :)
我正在尝试创建一个服务:
- 接收包含要查询的 URL 的 HTTP GET 请求
- 对于单个 GET 请求,服务会提取 URL
- 查询有关 URL 的本地数据库
- 如果在数据库中找到结果,它将返回给客户端,如果没有,则需要查询一些外部服务(这可能需要相对较长的时间来响应)
- 将 URL 的结果返回给客户端
我在虚拟机和 Tomcat7 上使用 spring 运行它。我会提前道歉并提到我对Tomcat很陌生
无论如何,我期待这个服务有很多并发的 GET 请求(数十万个同时请求)我基本上想要实现的是让这个服务尽可能地可扩展(如果这不可能,那么至少一个可以同时处理数十万个请求的服务)
我一直在阅读很多关于服务中的异步请求处理的内容,尤其是在 Tomcat 中,但我有一些我仍然不清楚的事情:
- 从官方 tomcat 网站看来,Tomcat 包含接受线程的数量和工作线程的数量。如果是这样,我为什么要使用 AsyncContext?释放 Tomcat 的工作线程并在我的应用程序中占用不同的线程来执行完全相同的操作有什么好处?(系统中还有 1 个活动线程)
- 有点类似于第一个问题,但是创建 AsyncContext 并将其与不同的线程一起使用有什么好处吗?(我的应用程序中创建的线程池中的一个线程)
- 关于同样的问题,我在这里看到我也可以返回 Callable 或 DeferredResult 并使用 Tomcat 的线程之一或我自己的线程处理它。与仅处理来自请求的 AsyncContext 相比,返回 Callable 或使用 DeferredResult 有什么好处吗?
- 另外,如果我决定返回一个可调用对象,Tomcat 会从哪个线程池获取线程来处理我的可调用对象?这里使用的线程是否与我之前提到的来自 Tomcat 的工作线程相同?如果是这样,我从发布一个 Tomcat 工作线程并改用另一个工作线程可以获得什么好处?
- 我从 Oracle 的文档中看到,我可以向 AsyncContext 传递一个将同时处理的 Runnable 对象,用于执行此 Runnable 的线程从何而来?我有控制权吗?此外,将 AsyncContext 传递给 Runnable 比仅将 AsyncContext 传递给我的线程有什么好处?
我很抱歉就同样的事情问了这么多问题,但我和我的同事们为这些事情争论了一个多星期,没有任何具体的答案。
我有 1 个更普遍的问题:您认为使我描述的服务可扩展的最佳方式是什么?(暂时不考虑添加更多机器),您能否发布任何示例或参考以用于特定的解决方案?
我会发布更多我一直在查看的链接链接,但我目前的声誉不允许这样做。对于任何可以理解的参考资料或具体示例,我将不胜感激,我显然很乐意澄清任何相关问题
干杯!