【问题标题】:Approaches for reporting progress for competing consumer scenario竞争消费者场景的进度报告方法
【发布时间】:2014-02-28 07:25:31
【问题描述】:

我正在处理消息传递。目前我们正在使用 Rebus 增加一些场景。我们也在考虑 NServiceBus。

我们正在尝试构建的场景是后台任务处理系统的概念验证。今天,我们有一些以不同方式托管的后端服务。 (网络、Windows 服务、控制台应用程序)我希望将它们连接到 rebus 并开始使用竞争消费者来消费消息,有些消息将有一个侦听器,有些消息将分担消息负载。优雅:)

我从另一个问题 How should I set rebus up for one producer and many consumers 得到了一个很好的开始,它在概念验证中运行良好。

现在我想开始报告进度。我最初的方法是设置 pub/sub 并启动一个服务来监听来自所有服务的进度事件。如果某项服务对未来的特定进展感兴趣,则可以轻松订阅感兴趣的消息并开始收听。

但是我应该如何设置竞争消费者和发布/订阅?它是两个独立的东西吗? (在 rebus 情况下,一个适配器使用 UseSqlServerInOneWayClientMode / UseSqlServer,另一个适配器使用我们想要的任何协议为 pub/sub 设置?)

或者有没有比这里有两个“公共汽车”更好的解决方案?

【问题讨论】:

    标签: nservicebus messaging publish-subscribe rebus


    【解决方案1】:

    我自己构建了几次类似的东西,使用 SignalR 报告这种后端工作进程的进度,我取得了很好的结果。

    我们的设置有一堆 WPF 客户端、一个 SignalR 集线器和一堆后端工作进程。然后,所有 WPF 客户端和所有后端工作人员将建立与中心的连接,允许工作人员在工作时发送进度报告。

    SignalR 有一些很好的特性,使其非常适合这种确切的问题:

    1. 已发布的消息“逃脱”了 Rebus 工作单元,允许在单个消息处理程序中多次发送进度报告消息,即使可能需要很长时间才能完成
    2. 很容易将消息一路传递给客户端,因为他们直接订阅
    3. 我们可以使用中心组功能对用户进行分组,这样我们就可以将来自后端的进度/状态消息定位到所有用户或单个用户(也可以用于部门等)

    我想,最重要的一点是,这个进度报告(至少在我们的例子中)不如我们的 Rebus 消息重要,即它不需要相同的可靠性等,我们可以将其用于我们的优势,然后选择具有其他一些很好的特性的技术,结果证明很酷。

    【讨论】:

    • 很有道理,我试试!
    • 出于兴趣,处理程序回滚期间如何处理进度报告?
    • 我不知道 ;) 在这种情况下,我们小心翼翼地捕捉用户可理解的异常(源自 DomainException 的异常)并将其作为失败的后台作业报告给用户 - 不会重试关于域例外
    • 我们没有做任何事情来处理技术异常(例如数据库并发异常),所以理论上我们可以这样报告进度:10%, 20%, 30% (woops, rollback) 10% , 20%, ... 100%
    猜你喜欢
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 2012-02-22
    相关资源
    最近更新 更多