用于设计可伸缩Web服务的模式

时间:2010-01-27 04:34:45

标签: java web-services multithreading concurrency latency

我正在用Java编写一个需要处理大量请求/秒的Web服务。一般流程将是:

  • Web服务收到客户端的请求
  • 返回对客户
  • 的“保持轮询我”回复
  • 调用另一个Web服务(或 服务),并等待他们 回复(暂停)
  • 客户端轮询我们的网络服务,直到 它收到一个回复​​(用 超时)

在互联网上进行研究,我发现了两种编写Web服务的通用方法:

  • 为每个请求生成一个帖子
  • 使用Reactor模式(中央调度程序线程响应IO事件)

您是否建议哪种方法通常更好,每种方法的优缺点是什么?我也很感激指向示例。

3 个答案:

答案 0 :(得分:2)

不要以为多线程。异步思考。我碰巧编写了一个异步处理程序,在IIS中运行了大约2000个RPS和<10个线程。不知道java是如何工作的,因为我是一个.net人,但我相信他们有类似的BeginXXX / EndXXX方法。如果您生成一个线程,那么您不会考虑代码可以阻止的所有位置:数据库IO,文件I / O,Web服务等。这些是您的性能将导致您的站点变慢的地方。

异步,异步,异步。

吟唱并重复。

答案 1 :(得分:0)

除了“No Refunds No Returns”回复之外,我会说“异步思考”,因为您应该允许容器管理其部署的Web服务的多线程/可伸缩性和高可用性问题,这允许您使用应用程序容器设置诸如聚类之类的东西。

编辑:总而言之,没有这样的模式,也许您应该探索应用程序容器的可伸缩性/可用性功能......

答案 2 :(得分:0)

Asynchronism确实是正确的方法,但不要自己管理,使用支持异步Web服务调用的东西,如JAX-WS 2.0(使用Future接口和/或Executor框架来自java.util.concurrent)。请参阅Asynchronous Web Service Invocation with JAX-WS 2.0