【问题标题】:Cluster aware servlet development集群感知 servlet 开发
【发布时间】:2010-01-19 10:01:50
【问题描述】:

如何开发可识别集群的 servlet,其设计标准是什么?

【问题讨论】:

    标签: servlets cluster-computing


    【解决方案1】:

    这不是要在代码级别解决的问题,而是要在网络服务器级别解决的问题。所以 Servlet 代码不需要知道被集群化了。

    【讨论】:

      【解决方案2】:

      代码不需要知道被集群化,但开发人员需要知道代码可能被集群化并且会话被复制。让我解释一下。

      当你在 web.xml 中标记一个 webapp 时,你是在告诉容器这个 web 应用程序可以被集群化。

      如果 webapp 部署在集群上,集群中的每台机器都会在其中运行一个 vm 和这个 webapp。就客户端而言,尽管来自客户端的每个请求都可以由集群中的不同 vm 提供服务,但它只看到一个 webapp 的请求。

      因此,如果 webapp 正在存储任何状态,则必须将其提供给运行 webapp 的 vms(在集群中)的所有实例。 如何才能做到这一点 ? 通过将您放入 httpsession 对象的内容标记为“可序列化”。您正在向容器发出信号,它应该将状态复制到其他虚拟机(如果您有设置会话复制)。它在 weblogic 中以两种方式完成。每次在 session 上使用 setAttribute() 时,都会触发 sessionreplication 事件。

      在 WL 中有两种复制内存复制和使用数据库的方法 复制。我想听听其他应用服务器是如何做到这一点的。

      【讨论】:

        【解决方案3】:

        正如@BalusC 所说,这主要是一项服务器配置任务,如何进行很大程度上取决于您使用的是哪台服务器(并且您没有提及),但这里是how to do it with Tomcat 6,例如。

        不过,在代码方面需要记住一件事,那就是您必须小心将哪些对象放入 HTTP 会话(使用 HttpSession.setAttribute()。要使会话复制工作,这些对象必须可序列化,以便通过网络传输到集群中的其他服务器。如果它们不可可序列化,则服务器可能会丢弃它们,或者可能会抛出异常。

        开发人员将 HTTP 会话用作放置大型复杂业务对象(例如,允许从 JSP 访问它们)的地方并不少见,而这些东西不太可能是可序列化的。表单绑定对象的其他示例,虽然是简单的表单数据持有者,但通常不可序列化。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-06-15
          • 1970-01-01
          • 2019-11-26
          • 1970-01-01
          • 1970-01-01
          • 2019-01-28
          • 2020-03-20
          相关资源
          最近更新 更多