我试图实现热备用方法的可用性,我记得如下:
所以我在同时发出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是在不同的机器上运行的?
答案 0 :(得分:1)
将请求粘贴到队列上,让3台计算机侦听队列,然后等待结果。如果它们中的任何一个在处理期间失败,则请求将返回队列并由另外两个中的一个处理。在同一个请求上同时运行3个系统,并且“竞速”成功听起来非常充满危险和疯狂。
我的意思是,对于拥有投票系统的航空电子设备来说,确保喷气客机不会自发地投入大海是有道理的,但大多数系统并没有真正承担可靠性的负担。他们也往往拥有非常大的工程预算。
所以,我会选择JMS队列。
附录:
队列由集群管理,然后EJB可以部署在他们自己的集群中(或者只是独立的工作者,他们甚至不必是EJB,它们可以是任何东西)。 EJB都订阅了相同的队列。每个bean从队列中取出一条消息并随之运行。获取消息是事务性的。如果EJB由于某种原因而失败,则消息在队列中再次可用,准备好让另一个EJB接受它。
JMS队列和EJB服务器都是冗余的,因此两者都不是单点故障。
今天的许多EJB服务器都可以集群化,因此只需将服务器配置到集群中并调用它即可。您的客户端代码不会更改。
如果您对此安排不满意,那么您可以切换到Web服务,而不是使用远程EJB调用,并使用(集群)负载均衡器将服务处理程序服务器(即EJB服务器)置于前面分发流量。
这些都没有解决在单个堆栈过程中在状态共享,竞争条件,会话亲和力等方面冗余时出现的所有问题等。
没有“简单”的注释来做到这一点。使用特定于容器的开箱即用集群可能就像您将要获得的那样接近。