【问题标题】:TIBCO EMS Failover reconnect for C# (TIBCO.EMS.dll)C# (TIBCO.EMS.dll) 的 TIBCO EMS 故障转移重新连接
【发布时间】:2010-09-16 07:34:39
【问题描述】:

我们有一个 TIBCO EMS 解决方案,它在 2-4 个服务器环境中使用内置服务器故障转移。如果 TIBCO 管理员将故障转移服务从一台 EMS 服务器转移到另一台,则连接应该在 EMS 服务级别自动转移到新服务器。对于我们使用 EMS 服务的 C# 应用程序,这不会发生 - 我们的用户连接在故障转移后没有转移到新服务器,我们不确定原因。

我们的应用程序仅在启动时连接到 EMS,因此如果 TIBCO 管理员在用户启动我们的应用程序后进行故障转移,他们用户需要重新启动应用程序才能重新连接到新服务器(我们的 EMS 连接使用一个服务器字符串,包括所有 4生产 EMS 服务器 - 如果第一次尝试失败,它会移动到字符串中的下一个服务器并再次尝试)。

我正在寻找一种自动化方法,如果它检测到连接已断开,它将尝试定期重新连接到 EMS,但我不确定如何最好地做到这一点。

有什么想法吗?我们使用的是 TIBCO.EMS.dll 版本 4.4.2 和 .Net 2.x(SmartClient 应用程序)

任何帮助将不胜感激。

【问题讨论】:

  • 您目前如何实现容错?在“factories.conf”文件中的服务器上?您的“url”属性是否包含第 134 页的“tib_ems_dotnet_ref.pdf”中指定的逗号分隔的 URL 列表?
  • 是的,这就是问题所在。当 EMS 服务器发生故障转移时,连接应该从一台服务器转移到另一台服务器。当您的连接字符串中有一个 EMS 服务器的分隔列表时,这应该可以工作,但我相信 EMS.lib 中有一个错误使其无法工作
  • 监听器故障转移后是否抛出错误?生产者故障转移后(发送消息时)是否抛出错误?最有可能的是,图书馆希望您重新连接。在连接字符串中提供多个服务器只是让它在连接期间循环 - 而不是稍后......
  • 当我们不确定服务器在做什么时,我犹豫是否要深入研究客户端编程解决方案。您能否提供有关如何/何时知道故障转移不起作用的更多信息? (注意:客户端故障转移通知 - tib ems 用户指南 pg 292,tib dotnet ref pg 220)。
  • ConnectionAttempts 设置客户端重新尝试连接到服务器的次数。 ReconnectAttempts 设置客户端在网络断开后尝试重新连接的次数。他们似乎都没有按照他们所说的去做。是的,我们在 Publish 上遇到了例外情况。

标签: c# tibco tibco-ems ems


【解决方案1】:

首先,是的,我正在回答我自己的问题。然而,重要的是要注意,如果没有 ajmastrean,我将无处可去。非常感谢!

一个: ConnectionFactory.SetReconnAttemptCount、SetReconnAttemptDelay、SetReconnAttemptTimeout 应适当设置。我认为默认值重试太快(重试之间大约 1/2 秒)。由于网络存储等原因,我们的 EMS 服务器可能需要很长时间才能进行故障转移 - 因此以 1/2 秒的间隔重试 5 次还远远不够。

两个: 我相信启用客户端-服务器和服务器-客户端心跳很重要。无法验证但没有这些,客户端可能不会收到服务器离线或切换到故障转移模式的通知。当然,这是 EMS 的服务器端设置。

三个: 您可以通过设置 Tibems.SetExceptionOnFTSwitch(true); 来监视故障转移事件;然后连接一个异常事件处理程序。在单服务器环境中,您将看到“连接已终止”消息。但是,如果你在一个容错的多服务器环境中,你会看到这样的:“连接已执行容错切换到”。您不一定需要此通知,但它可能很有用(尤其是在测试中)。

四: EMS 文档中显然没有明确说明,连接重新连接在单服务器环境中不起作用。您需要处于多服务器、容错环境中。然而,有一个窍门。您可以将同一台服务器两次放在连接列表中 - 我知道这很奇怪,但它可以工作,并且它使内置的重新连接逻辑能够工作。

一些代码:

private void initEMS()
{
    Tibems.SetExceptionOnFTSwitch(true);
    _ConnectionFactory = new TIBCO.EMS.TopicConnectionFactory(<server>);
    _ConnectionFactory.SetReconnAttemptCount(30);       // 30retries
    _ConnectionFactory.SetReconnAttemptDelay(120000);   // 2minutes
    _ConnectionFactory.SetReconnAttemptTimeout(2000);   // 2seconds
_Connection = _ConnectionFactory.CreateTopicConnectionM(<username>, <password>);
    _Connection.ExceptionHandler += new EMSExceptionHandler(_Connection_ExceptionHandler);
}
private void _Connection_ExceptionHandler(object sender, EMSExceptionEventArgs args)
{
    EMSException e = args.Exception;
    // args.Exception = "Connection has been terminated" -- single server failure
    // args.Exception = "Connection has performed fault-tolerant switch to <server url>" -- fault-tolerant multi-server
    MessageBox.Show(e.ToString());
}

【讨论】:

    【解决方案2】:

    这篇文章应该总结一下我目前的 cmets 并更详细地解释我的方法......

    TIBCO 'ConnectionFactory' 和 'Connection' 类型是重量级的线程安全类型。 TIBCO 建议您保持使用一个 ConnectionFactory(每个服务器配置的工厂)和一个每个工厂的连接。

    服务器也似乎负责就地“连接”故障转移和重新连接,所以让我们确认它正在完成其工作,然后依靠该功能。

    创建客户端解决方案将比修复服务器或客户端设置问题稍微复杂一些。您从失败的连接创建的所有会话都需要重新创建(更不用说生产者、消费者和目的地)。两种类型都没有“重新连接”或“刷新”方法。会话也不维护对其父连接的引用。

    您将不得不管理连接/会话对象的查找并疯狂地重新初始化每个人!或实现某种会话失败事件处理程序,可以获取新连接并重新连接它们。

    所以,现在,让我们深入了解一下客户端是否设置为接收故障转移通知(tib ems 用户指南第 292 页)。并确保捕获引发的异常,包含故障转移 URL,并且得到正确处理。

    【讨论】:

    • 我已经设置了 Tibems.SetExceptionOnFTSwitch(true) 所以我现在看到我们的连接何时失败。我们还不能在故障转移设置中进行测试,但是当连接消失时我会遇到异常。但是,当服务器恢复时,内置重新连接不起作用。
    • 我们检查了服务器-客户端和客户端-服务器心跳。它们在测试环境中被禁用,我认为这可能是重新连接不起作用的原因。启用,设置为 10 秒,我们仍然没有尝试重新连接。
    • 我可以捕获服务器连接失败的事实是一个好兆头,但我宁愿让 EMS 库中的重新连接逻辑完成其工作,而不是手动循环重新连接尝试。
    • 我也有类似的情况。我正在重构一个旧的消息传递系统,该系统正在执行无限循环,试图重新初始化 Connection 实例......我希望能摆脱这种情况。虽然我没有太多实用知识,但我主要从 TIBCO 文档工作。
    • ajmastream 当然意味着您可以访问文档。我基本上不得不乞求获得访问权。它们被锁定在网络驱动器上,所以我什至无法阅读它们 - 自从我们开始实施以来,我一直在 EMS 中盲目飞行。
    【解决方案3】:

    客户端应用程序可以通过设置 tibco.tibjms.ft.switch.exception 系统属性来接收故障转移通知

    也许图书馆需要它来工作?

    【讨论】:

      猜你喜欢
      • 2014-11-21
      • 1970-01-01
      • 2020-08-07
      • 1970-01-01
      • 1970-01-01
      • 2016-05-22
      • 2018-10-20
      • 2010-09-19
      • 1970-01-01
      相关资源
      最近更新 更多