1

在 Jboss 上运行的 web 应用程序上,有一个 TCP 套接字连接,我们使用它来实现会话 (rtsp) 的心跳。直到现在它正在做一个客户端套接字绑定:-

Socket client = new Socket(host,port);
PrintWriter out = new PrintWriter(sock.getOutputStream(), true);
out.write(data);
out.flush();

现在我们需要在负载均衡器后面实现热备份/集群。

所以问题是 - 当发生故障转移时,是否可以通过任何方式保持心跳而不必重新连接?

[编辑-更多细节] Container - Jboss 7.1 RTSP - PayLoad 是 RTSP 格式。[ data = "GET_PARAMETER " + m.mediaURL + " RTSP/1.0" + "\r\n" + "CSeq: " + seqNumber + "\r\n" + "Session: " + m.sessionId + "\r\n" + "Content-Length: 0\r\nContent-Type: text/parameters\r\n" + "\r\n";]

4

1 回答 1

0

如果您想要透明 TCP 连接故障转移

我不知道支持 TCP 连接的透明故障转移的 Java 库。由于 TCP 是有状态的,这并不容易。

来自透明 TCP 连接故障转移的引述

本文描述了一种系统,该系统以对客户端和服务器应用程序透明的方式启用 TCP 服务器端点的故障转移。故障转移可以在连接生命周期内的任何时间发生。故障转移是通过修改服务器的 TCP/IP 堆栈来实现的。不需要对客户端的 TCP/IP 堆栈、客户端应用程序或服务器应用程序进行修改。系统支持服务器主动或半主动复制

由于 RTSP 未绑定到 TCP,我会考虑使用 UDP。

如果心跳不是实际协议的一部分

但还有一些其他的可能

  1. 使用 UDP 作为心跳协议
  2. 始终打开/关闭您的 TCP 连接
  3. 为 TCP 编写您自己的实现,该实现在该write方法的底层重新连接。因此,您可能需要在您的协议中使用某种 ping 请求,以便能够检查连接。
  4. 用于aspectj包装write现有实现:因此您可以添加一个 before 块,它只检查连接,并在真正进入之前进行重新连接write。这可能很复杂,因为java.*javax.*涉及。

如果它必须很快,我会选择UDP。

如果您听到的节拍频率不是那么高,您可以随时打开/关闭您的 TCP 连接。

如果您对系统有足够/完全的控制权,但需要保持“开放”连接的概念,则可以使用选项 3 来模仿“开放”连接。

如果涉及不受您控制的其他系统,请使用aspectj. 这是一个 hack,因为你不能轻易地编织java.*javax.*

于 2013-07-10T08:27:23.533 回答