2

功能描述

NServiceBus 网关http://docs.particular.net/nservicebus/gateway/似乎是一种使用 NServiceBus 基础设施实现内部webhook 的方法。

我们需要在这个概念上更进一步,向任何有权在我们系统中注册 webhook url 的第三方订阅者开放一些事件。

审查

我们计划创建两个初始窗口服务

1) WebHookBatchService,可以作为订阅者添加到感兴趣的特定消息。

<UnicastBusConfig>
    <MessageEndpointMappings>
           .......
        <add Messages="MyMessages.MyImportantMessage, MyMessages" Endpoint="WebHookBatchService.Queue"/>
           .......
    </MessageEndpointMappings>
</UnicastBusConfig>

2)WebHookProcessService——实际处理1条WebHookBatchService发送的消息。

一旦在 WebHookBatchService.Queue 上收到消息,我们的 WebHookBatchService 将查找特定租户 + 消息类型的所有订阅者,并为 WebHookProcessService 向 WebHookProcessService.Queue 发送单独的消息(我们可以创建一个 nservicebus 负载均衡器实例来桥接批处理和实际处理器)来实际处理可能使用http://restsharp.org/的真实消息。

问题

今天是否有任何现有的开源项目可以做到这一点?

现在,由于我们无法控制订阅者的持久性,我们应该如何管理错误?

http://wiki.shopify.com/WebHook

如果完全相同的 webhook 连续失败 19 次,则将删除一个 webhook。

它没有提到 webhook 中的任何延迟。人们对重试逻辑的标准延迟有什么体验?

以下是一些其他的想法:

提案 0:MaxRetries="1"。每晚清除 WebHookProcessService.ErrorQueue。(不重试 - 如果第一次失败,保证消息丢失)

提案 1:MaxRetries="1" on exception catch 发送电子邮件,其中包含将通过 http 传递的消息的 xml 版本。
每晚清除 WebHookProcessService.ErrorQueue。-- 我看到了潜在的垃圾邮件问题。

方案 2:nservicebus MaxRetries 立即重试,无延迟。因此,我需要创建(1 小时 - 24 小时)存储桶队列并使用 RetrySchedulerService,尽管当服务端点开始工作时,当订阅者一次以非 DateCreated 有序方式获得 25 条消息时,我认为这很难维护和混淆.

挖掘想法...

4

1 回答 1

1

网关通常用于物理站点之间通过 HTTP 的通信。由于您将端点暴露给世界以接受回调,我认为您可以只使用内置的 WCF 托管并通过防火墙将端点暴露给第三方。您的其余设置听起来适合我。

至于错误,你是对的,NSB 会立即重试,但如果你使用网络回调,这可能会让你在出现小问题的情况下度过难关。您将需要确定如何处理错误队列,我们​​只需构建一个新端点来处理错误队列,并使用逻辑来确定重试、延迟等。实现此目的的一个好方法是使用 Saga,其中包括超时管理器。这启用了一个工作流程,您可以在其中重试指定次数,尝试另一次通信,记录所有内容,并最终通知可以联系第 3 方的人,让他们知道有东西被破坏了。

于 2011-12-09T12:30:49.990 回答