Servlet容器中的分阶段,异步处理?

时间:2010-12-09 10:13:23

标签: tomcat servlets asynchronous

我一直在阅读有关Stage Event Driven Architecture(SEDA)和异步I / O概念的内容。我遇到过一些人在谈论实现SEDA来处理HTTP请求。例如:

  • Web服务器接收客户端HTTP请求。
  • 请求被放入队列
  • 有限数量的消费者中的一个从队列中接收请求
  • 可能通过典型的MVC框架(例如Spring MVC)处理请求
  • 将回复发送回客户

这种情况的动机被描述为控制来自客户端的负载的能力 - 即,它比仅在接受它的同一线程中处理请求更好地扩展。请求排队后,立即可以获取请求的线程接受另一个请求。

当然,这种类型的模型,或类似的东西,已经在诸如Tomcat,Jetty等servlet容器中实现了?我一直在做的阅读几乎意味着这样的容器没有实现这种方法,因此在高流量环境中的可扩展性方面存在问题。

有人可以为我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

是的,你是对的,大多数现代的Servlet容器都会将'队列'请求分派给实际进行处理的有限数量的线程,这与SEDA有些相似。

但是,当然,标准的HTTP请求并没有真正放在物理队列上(因为任务/请求将在SEDA中),而是在服务器准备好处理之前根本不接受用户连接(请求)。它(或直到它被拒绝),这是关键差异,因为用户必须等待接受然后处理连接 - 这一切都发生同步。 SEDA的一个关键特性是请求处理通常是异步,即您将任务分派到队列中然后忘记它,可能会在一段时间后通知它完成。

无论如何,在Tomcat中,您可以调整acceptCount and maxThreads以控制在服务器拒绝新传入连接之前“排队”的数量,以及并发处理的数量。较新的服务器将允许您异步处理请求,AJAX/Comet样式。