0

我知道 Tibco EMS 在服务器端的热备份配置中提供容错功能,详见用户指南此答案此处

但在客户端,Tibco EMS 是否为容错客户端提供开箱即用的解决方案?一个例子:在主题上,Sports.F1.PitStop两个客户端(server1,server2)注册为发布者。这个想法是,如果 server1 上出现问题(即 server1 上的发布者出现故障),server2 将无缝地继续发布该主题。那么问题来了,Tibco EMS 是否提供这种客户端容错能力?

4

3 回答 3

0

不。

EMS(或 JMS)不支持客户端容错功能。原因很简单:通常,发布者进程彼此不认识。

详细说明:

主题通常接受许多发布者(两个以上)。在 pub/sub 场景中,发布者不知道订阅者,并且在某种程度上他们通常不知道其他发布者。

您的解决方案:

关于您的解决方案,我的第一个问题是:为什么两台服务器不能同时发布消息?

我假设您有充分的理由(例如来自 server1 和 server2 的消息是多余的)。在这种情况下,您将不得不在“主动”和“被动”服务器之间进行某种通信。

可能性一:Server2 连接到一个简单的 service/rmi/other 心跳机制,并且可以判断 Server1 是否/何时停止发布。

可能性 2:Server2 本身订阅了该主题,并且可以判断消息何时停止。

最后一点: 如果您的意思是共享“订阅”(例如,在两台服务器之间共享一个持久订阅):新的 JMS 2.0 API 支持此功能。EMS 8 是唯一支持 JMS 2.0 的 EMS 版本。

于 2014-05-22T03:18:36.340 回答
0

我不确定我是否完全理解你的问题。EMS 是消息代理。它代理消息。这就是它所做的一切。如果您有多个服务器发布到同一个主题,那么这对于 EMS 来说很好。如果您的发布者自己处于故障转移配置中,因此只有一个正在主动发送,而另一个在第一个失败时接管,那么 EMS 不在乎。

管理从一个发布者到另一个发布者的故障转移机制,这是您必须自己开发的东西。EMS 不提供任何支持。您需要某种机制让 server2 知道 server1 何时关闭。有几种方法可以做到这一点:

  • 使用心跳机制,主动服务器定期发送心跳消息(也可能通过 EMS),被动服务器监听它们,当它们停止时,假设 server1 已关闭。
  • 在 server1 和 server2 之间使用活动的开放连接(例如打开一个简单的 tcp 端口,并通过定期发送虚拟消息来阻止它自动关闭),并在该端口上进行开放读取。当 server1 出现故障时,您将收到连接错误,您不必等待心跳超时。
  • 使用第三方监控工具,如 openview、tivoli 或 nagios 检测 server1 已关闭并通知 server2。
  • 您可以使用 EMS 上的一项功能。EMS 具有您可以订阅的系统管理主题,并且基本上可以记录内部发生的任何事情。您可以订阅连接和断开事件,以监控任何连接到 EMS 或从 EMS 断开连接的组件。如果 server1 失败,这将显示为断开连接事件。
于 2014-05-26T09:05:02.357 回答
0

心跳机制:

https://support.tibco.com/s/article/Tibco-KnowledgeArticle-Article-33918

例如:

client_heartbeat_server=10
client_timeout_server_connection=35
server_heartbeat_client=10
server_timeout_client_connection=35
于 2020-03-04T16:05:45.057 回答