【问题标题】:Staged, Asynchronous Processing in Servlet Containers?Servlet 容器中的分阶段异步处理?
【发布时间】:2010-12-09 10:13:22
【问题描述】:

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

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

这样做的动机被描述为控制来自客户端的负载的能力 - 即它的扩展性比仅在接受它的同一线程中处理请求要好得多。一旦一个请求排队,接收该请求的线程就可以立即接受另一个请求。

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

谁能帮我解决这个问题?

【问题讨论】:

    标签: tomcat servlets asynchronous


    【解决方案1】:

    是的,您说得对,大多数现代 Servlet 容器会将请求“排队”,以将请求分派给实际执行处理的有限数量的线程,这在某种程度上类似于 SEDA。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-23
      • 1970-01-01
      相关资源
      最近更新 更多