设计可扩展Web服务的模式

3
我正在使用Java编写一个网络服务,需要处理大量的请求/秒。一般流程如下:
  • 网络服务接收来自客户端的请求
  • 向客户端返回“请继续轮询我”的响应
  • 调用另一个网络服务(或服务),并等待它们响应(带有超时)
  • 客户端轮询我们的网络服务,直到收到响应(带有超时)
通过在互联网上进行研究,我发现了两种编写网络服务的一般方法:
  • 为每个请求生成线程
  • 使用反应器模式(中央分派线程响应IO事件)
您是否推荐哪种方法通常更好,并且每种方法的优缺点是什么?我也会感激指向示例的指针。
3个回答

2
不要考虑多线程,而是考虑异步。我刚好编写了一个异步处理程序,在IIS中以每秒2000个请求的速度运行,使用少于10个线程。不确定Java的工作原理,因为我是.net开发人员,但我相信他们有类似的BeginXXX/EndXXX方法。如果您曾经启动了一个线程,那么您没有考虑您的代码可能阻塞的所有位置:数据库IO、文件IO、Web服务等。这些都是会导致您的站点变慢的地方。异步,异步,一再重复。

哈利路亚,兄弟 :) 你所说的“async”,是指非阻塞异步IO吗(https://dev59.com/_nRB5IYBdhLWcg3wiHv7)?更详细的解释将不胜感激! - Bilal and Olga
这看起来像是 .net 的 begin* 和 end* 的良好 Java 并行实现:http://www.javalobby.org/java/forums/t16252.html - Bilal and Olga

0
除了“不予退款或退货”的回复之外,我想说的是,“异步思维”也很重要,因为你应该让容器来管理已部署的 Web 服务的多线程/可扩展性和高可用性问题,这样就可以使用应用程序容器设置诸如群集等内容。
编辑:所以总结一下,并没有特定的模式,也许你应该探索一下应用程序容器的可扩展性/可用性功能...

0

异步确实是正确的方法,但不要自己管理它,使用支持异步 Web 服务调用的工具,如 JAX-WS 2.0(它使用 Future 接口和/或来自 java.util.concurrentExecutor 框架)。请参见 使用 JAX-WS 2.0 进行异步 Web 服务调用


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接