[我知道Tibco EMS在服务器端的热备份配置中提供了容错功能,如the User's Guide,this answer和here中所述。
但是在客户端,Tibco EMS是否为容错客户端提供了开箱即用的解决方案?一个示例:在主题Sports.F1.PitStop
上,两个客户端(server1,server2)注册为发布者。这样的想法是,如果server1上出现问题(即server1上的发布者出现故障),server2将无缝地继续在该主题上发布。所以问题是,Tibco EMS是否提供了这样的客户端容错能力?
编号
EMS(或JMS)不支持客户端容错功能。原因很简单:通常,发布者进程彼此不认识。
详细说明:
主题通常会接受许多发布者(超过两个)。在发布/订阅方案中,发布者不认识订阅者,并且在某种程度上他们通常不认识其他发布者。
您的解决方案:
关于您的解决方案的我的第一个问题:为什么两个服务器都不能同时发布消息?
我假设您有充分的理由(例如来自server1和server2的消息是多余的)。在这种情况下,那么您将必须在“主动”和“被动”服务器之间进行某种通信。
可能性1:Server2连接到简单的服务/ rmi /其他心跳机制,并且可以判断Server1是否/何时停止发布。
可能性2:Server2本身已订阅该主题,并且可以确定消息何时停止。
最后一个注释:如果您的意思是shared "subscriptions"(例如,两个服务器之间共享一个持久预订):新的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