java - EJB 和热备份

标签 java ejb virtual-machine

我正在尝试实现一种热备方法来提高可用性,我的想法如下:

  1. 客户端发送 3 个相同的请求,每个服务器一个(我们有 3 个,实际上是虚拟机)
  2. 每个服务器接收请求并处理它
  3. 服务器完成后,它会 ping 其他服务器(如果它们已完成)。
  4. 如果他是第一个完成的,他就会回复,其他人不会。

所以我在同时发出 3 个请求时遇到了麻烦。这就是我通常从 servlet 调用远程接口(interface)的做法

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 运行在不同的机器上?

最佳答案

将请求放入队列中,让 3 台机器监听队列,然后等待结果。如果其中任何一个在处理过程中失败,请求将返回队列并由另外两个之一处理。让 3 个系统针对同一个请求同时运行,并“竞相”成功,听起来充满了危险和疯狂。

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

所以,我会选择 JMS 队列。

附录:

队列由集群管理,然后EJB可以部署在它们自己的集群中(或者只是独立的 worker ,它们甚至不必是EJB,它们可以是任何东西)。所有 EJB 都订阅同一个队列。每个 Bean 从队列中取出一条消息并与其一起运行。消息的获取是事务性的。如果 EJB 由于某种原因失败,消息将再次在队列中可用,准备好供另一个 EJB 接收。

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

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

如果您对这种安排不满意,那么您可以切换到 Web 服务,而不是使用远程 EJB 调用,并在服务处理程序服务器(即 EJB 服务器)前面使用(集群)负载平衡器来分配流量。

这些都不能解决在状态共享、竞争条件、 session 关联性等方面采用单个堆栈进程冗余时出现的所有问题。

没有“简单”的注释可以做到这一点。使用特定于您的容器的开箱即用的集群可能是您将获得的最接近的结果。

关于java - EJB 和热备份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8040372/

相关文章:

java - 使用jpa进行数据库搜索

jakarta-ee - Java EE 企业 JavaBeans 开发人员

c - Makefile:每次我使用命令make时,文件都会重新编译

cloud - 嵌套虚拟化的实际应用

java - Eclipse Helios 给出错误 Java 已启动但返回退出代码 -805306369

java - 正则表达式 : Parsing a Large string

java - 类型 Class_name 未定义方法 method_name(FileInputStream, FileOutputStream)

java - 在全局事务中运行的本地事务的正确含义是什么?

Java EE 7 - 如何从容器内部启动事务?

azure - 访问代理/防火墙后面的 Azure 虚拟机