EJB和Hot Sparing

时间:2011-11-07 17:42:49

标签: java ejb virtual-machine

我试图实现热备用方法的可用性,我记得如下:

  1. 客户端发送3个相同的请求,每个服务器一个(我们有3个,实际上是虚拟机)
  2. 每个服务器都会收到请求并对其进行处理
  3. 服务器完成后,如果已完成,则会ping其他服务器。
  4. 如果他是第一个完成的人,他会回复而其他人不会。
  5. 所以我在同时发出3个请求时遇到了麻烦。这是我通常从servlet调用远程接口

    class Servlet_JSP_or_Something extends HttpServlet
    {
         doGet(HttpReq...)
         {
              @EJB
              RemoteInterfaceEJB ejbclass;
              ejbclass.doSomething()
         }
    }
    

    但是,现在我想我必须做这样的事情

    class Servlet_JSP_or_Something extends HttpServlet
    {
         doGet(HttpReq...)
         {
              @EJB(name="Server1")
              RemoteInterfaceEJB ejbclass;
              ejbclass.doSomething()
    
              @EJB(name="server2")
              RemoteInterfaceEJB ejbclass;
              ejbclass.doSomething()
    
              @EJB(name="server3")
              RemoteInterfaceEJB ejbclass;
              ejbclass.doSomething()
         }
    }
    

    但如果能起作用我就不那么害羞了。我甚至不知道@EJB(name =“...”)是否足够 或者如何为不同的虚拟机上运行的每个不同的ejb设置名称。

    所以问题是: ¿如何从同一个servlet / jsp中同时调用3个相同的EJB,这些EJB是在不同的机器上运行的?

1 个答案:

答案 0 :(得分:1)

将请求粘贴到队列上,让3台计算机侦听队列,然后等待结果。如果它们中的任何一个在处理期间失败,则请求将返回队列并由另外两个中的一个处理。在同一个请求上同时运行3个系统,并且“竞速”成功听起来非常充满危险和疯狂。

我的意思是,对于拥有投票系统的航空电子设备来说,确保喷气客机不会自发地投入大海是有道理的,但大多数系统并没有真正承担可靠性的负担。他们也往往拥有非常大的工程预算。

所以,我会选择JMS队列。

附录:

队列由集群管理,然后EJB可以部署在他们自己的集群中(或者只是独立的工作者,他们甚至不必是EJB,它们可以是任何东西)。 EJB都订阅了相同的队列。每个bean从队列中取出一条消息并随之运行。获取消息是事务性的。如果EJB由于某种原因而失败,则消息在队列中再次可用,准备好让另一个EJB接受它。

JMS队列和EJB服务器都是冗余的,因此两者都不是单点故障。

今天的许多EJB服务器都可以集群化,因此只需将服务器配置到集群中并调用它即可。您的客户端代码不会更改。

如果您对此安排不满意,那么您可以切换到Web服务,而不是使用远程EJB调用,并使用(集群)负载均衡器将服务处理程序服务器(即EJB服务器)置于前面分发流量。

这些都没有解决在单个堆栈过程中在状态共享,竞争条件,会话亲和力等方面冗余时出现的所有问题等。

没有“简单”的注释来做到这一点。使用特定于容器的开箱即用集群可能就像您将要获得的那样接近。