【问题标题】:Rebus HTTP gateway and MSMQ health stateRebus HTTP 网关和 MSMQ 健康状态
【发布时间】:2014-09-04 15:07:59
【问题描述】:

假设我们有

  • 具有 HTTP 网关出站服务的客户端节点
  • 具有 HTTP 网关入站服务的服务器节点

我考虑了 MSMQ 本身由于某种原因在客户端节点上停止的情况。在当前实现中,Rebus HTTP 网关将捕获异常。

您如何看待MessageQueueException 异常不仅可以捕获,还可以发送到服务器节点并放入错误队列的想法? (错误队列的名称可以从标题中收集)

因此,如果没有额外的基础架构,服务器就会知道客户端有问题,因此有人可以做出反应。

更新:

我猜答案中描述的问题会被提出。我应该更深入地解释我的情况:) 抱歉。这里是:

我将以 InboundService 能够同时执行的方式修改 HTTP 网关 - 发送和接收消息。因此,OutboundService 将是唯一启动连接(定期,例如每 5 分钟一次)以便从服务器获取新消息并将其消息发送到服务器的人。这是因为客户端节点不被视为服务器,而是作为 NAT 后面的众多客户端之一。

确实,服务器本身对客户端的健康状况不感兴趣,但我认为不是在客户端创建单独的警报服务,它会使用 HTTP 网关 HTTP 网关代码,HTTP 网关 itelf 可以这样做,因为双方都在运行 HTTP 网关是很重要的事情。

如果客户端根本无法访问服务器怎么办?

由于 MSMQ 会死,我考虑过使用像 http://ayende.com/blog/4540/building-a-managed-persistent-transactional-queue 这样的进程内独立持久队列对象 (只是一个示例实现,我不确定它有什么样的许可证) 在客户端聚合异常,直到服务器可以访问。

客户端多久会通知发生错误的服务器?

我不确定那部分 - 我认为它可能与消息同步的预定时间有关,例如每 5 分钟一次,但是如果没有预定时间,就像在当前实现中一样(while(true) 循环)?也许它可以只是通过配置设置?

我喜欢在处理错误时采用一致的策略,这通常涉及普通的旧 NLog 日志记录

由于客户端节点将位于 Internet 后面,因此 NAT 标准监控技术将不起作用。我考虑过使用队列作为 NLog 传输,但由于 MSMQ 将死,它不会工作。

我也考虑过使用 HTTP 作为 NLog 传输,但在服务器端它需要队列(不是真的,但我想将它存储在队列中)所以我们回到 sbus 和 HTTP 网关......那种NLog 传输实际上是 HTTP 网关的克隆。

UPDATE2: HTTP 作为 NLog 传输(我的意思是目标传输)也需要客户端队列,就像我在“如果客户端根本无法到达服务器怎么办?”中描述的那样。部分。它将是嵌入到 NLog 中的 HTTP 网关的克隆。疯狂:)

所有的事情都是客户端不可靠,所以我想在服务器端拥有关于客户端的所有信息并在那里登录。

UPDATE3

另一种解决方案可能是创建单独的服务,但该服务将成为 HTTP 网关的一部分(例如 OutboundAlertService)。然后将实现三个目标:

  • 共享发送循环代码
  • 无需额外的服务器基础架构
  • 对 OutboundService 没有负面影响(向其中添加进程内队列没有复杂性)

它不会接受来自 OutboundService 的异常,而是会定期检查 MSMQ。


然而,其他替代解决方案将简单地使用 MSMQ 队列以外的其他队列作为 NLog 目标,但这是丑陋的矫枉过正。

【问题讨论】:

    标签: rebus


    【解决方案1】:

    关于你的场景,我最初的想法是客户端有问题永远不应该是服务器的问题,所以当客户端失败时我可能不会向服务器发送消息。

    在我看来,这种方法会有多个问题/障碍/挑战,因为,例如如果客户端根本无法访问服务器怎么办?客户端多久会通知发生错误的服务器?

    当然我不知道你的设置细节,所以很难给出具体的建议,但总的来说,我喜欢有一个一致的策略来处理错误,这通常涉及普通的旧 NLog 日志记录和配置 WARN 和 ERROR 级别转到 Windows 事件日志。

    这允许设置各种工具(例如 Service Center Operations Manager 或类似工具)来监控所有机器的事件日志,以便在出现问题时发出错误标志。

    我希望我说了一些你可以使用的东西:)

    更新

    再想一想,我想我开始理解你的问题了,我认为我更喜欢客户端让另一端的 HTTP 侦听器知道它有问题的解决方案,然后另一端的 HTTP 侦听器可以(也许?)将其记录为错误。

    另一种选择是,另一端的 HTTP 侦听器可以有一个事件,ReceivedClientError 或其他东西,一个可以附加到然后在给定情况下做任何正确的事情。

    在您的情况下,您可能会将消息放入错误队列中。我只是避免将任何内容作为一般解决方案放入错误队列中,因为我认为它混淆了错误队列的目的 - 错误队列中的“事物”不会是消息,因此它不会是可重试的等.

    【讨论】:

    • 感谢您的更新。我也想过这个问题,到本周末我会尝试以 GitHub 问题的形式总结这篇文章的信息和其他想法,并在你以 fork 的形式祝福之后:)
    • 太棒了!谢谢你的坚持:)
    猜你喜欢
    • 2022-06-13
    • 2017-02-02
    • 2019-05-27
    • 2022-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-23
    • 2018-06-05
    相关资源
    最近更新 更多