我知道 Tibco EMS 在服务器端的热备份配置中提供容错功能,详见用户指南、此答案和此处。
但在客户端,Tibco EMS 是否为容错客户端提供开箱即用的解决方案?一个例子:在主题上,Sports.F1.PitStop
两个客户端(server1,server2)注册为发布者。这个想法是,如果 server1 上出现问题(即 server1 上的发布者出现故障),server2 将无缝地继续发布该主题。那么问题来了,Tibco EMS 是否提供这种客户端容错能力?
不。
EMS(或 JMS)不支持客户端容错功能。原因很简单:通常,发布者进程彼此不认识。
详细说明:
主题通常接受许多发布者(两个以上)。在 pub/sub 场景中,发布者不知道订阅者,并且在某种程度上他们通常不知道其他发布者。
您的解决方案:
关于您的解决方案,我的第一个问题是:为什么两台服务器不能同时发布消息?
我假设您有充分的理由(例如来自 server1 和 server2 的消息是多余的)。在这种情况下,您将不得不在“主动”和“被动”服务器之间进行某种通信。
可能性一:Server2 连接到一个简单的 service/rmi/other 心跳机制,并且可以判断 Server1 是否/何时停止发布。
可能性 2:Server2 本身订阅了该主题,并且可以判断消息何时停止。
最后一点: 如果您的意思是共享“订阅”(例如,在两台服务器之间共享一个持久订阅):新的 JMS 2.0 API 支持此功能。EMS 8 是唯一支持 JMS 2.0 的 EMS 版本。
我不确定我是否完全理解你的问题。EMS 是消息代理。它代理消息。这就是它所做的一切。如果您有多个服务器发布到同一个主题,那么这对于 EMS 来说很好。如果您的发布者自己处于故障转移配置中,因此只有一个正在主动发送,而另一个在第一个失败时接管,那么 EMS 不在乎。
管理从一个发布者到另一个发布者的故障转移机制,这是您必须自己开发的东西。EMS 不提供任何支持。您需要某种机制让 server2 知道 server1 何时关闭。有几种方法可以做到这一点:
心跳机制:
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