【问题标题】:Let a WCF service know that a SQL Server Service Broker message has arrived让 WCF 服务知道 SQL Server Service Broker 消息已到达
【发布时间】:2013-08-30 20:02:26
【问题描述】:

我正在考虑从 NServiceBus 迁移到 SQL Server Service Broker。

我缺少的一件是“筹集活动”部分。当一条消息到达 NServiceBus 时,它会在我的代码中引发一个事件。这效果很好。

对于 SQL Server Message Broker,我可以想到两种方法:

  • 创建一个 CLR 存储过程,让我的 SQL Server 调用我的 WCF 服务
  • 让我的 WCF 服务不断轮询数据库以查看是否有新消息。
    • 这可能会在 WCF 中出现超时问题。

我在其他应用程序(不是 Service Broker 应用程序)中尝试了第二个选项,但效果不佳。

我最喜欢第一个,但对我来说似乎很不合常规。

在我开始编码之前,我想我会问我是否错过了这里的大局。其他应用如何使用 SQL Server Service Broker 做到这一点?

注意:我目前使用我的 NServiceBus 解决方案每天处理大约 1/2 百万条消息。我需要我的解决方案足够强大以应对这种吞吐量。

【问题讨论】:

    标签: c# .net sql-server sql-server-2012 service-broker


    【解决方案1】:

    使用 SQL Server Service Broker,您无需轮询。 WAITFOR (RECEIVE ...) 构造是非轮询的,并且会阻塞直到有消息可用于处理(不仅仅是“到达”,它还考虑correlated locking)。 Service Broker 还使用internal activation,这完全消除了对外部服务的需求,并自动按需运行您的代码。作为记录,我知道使用 Service Broker 和激活的系统每 分钟处理 1/2 百万条消息。

    但不清楚所有这些如何与 WCF 集成。如果您的两个端点都是使用 SQL Server Service Broker 进行通信的 SQL Server 实例,则 WCF 没有太多空间。

    【讨论】:

      【解决方案2】:

      我很好奇 - 是什么让您决定离开 NServiceBus?

      另外,您是否考虑过可能使用 SQL Server 传输(v4 中的新功能)来处理这种集成方案?最后,我建议查看讨论组中的这个帖子以获得一些指示:

      http://groups.yahoo.com/neo/groups/nservicebus/conversations/topics/17931

      【讨论】:

      • 我们已经使用 NServiceBus 一年了,很喜欢。但是,我们的消息流是线性的。 (Sproc->Message DB->Pull Message Groups To Distributor Queue->Distributor Queue->Distributor->Worker Queues->Worker)我已经开始称它为我们的“圣诞灯蒸汽”,因为如果一个队列出去了,那么一切都会过去出(虽然对工人来说不是那么多)。我们发现自己检查每个队列/进程以找出进程死亡的位置。我已经考虑过了,Bus 似乎更适合队列可以关闭而系统的其余部分可以继续工作的场景。
      • 由于当一个队列出现故障时我们的整个系统都会出现故障,所以我们正处于两全其美的境地。 (我们有多个导致停机的故障点和许多需要检查才能恢复的故障点。我们想转移到代理,因为如果事情发生故障,就会有一个故障点需要修复。)有了代理,我的流就可以了像这个 Sproc->Broker Queue -> Activator->Workers。唯一真正移动数据(或存储数据)的是代理队列。此外,代理队列可以更好地支持我的消息分组。
      • (如果您好奇,可以查看此 NServiceBus 讨论组线程,了解有关我遇到的分组问题的更多信息:groups.yahoo.com/neo/groups/nservicebus/conversations/messages/…
      • 您知道,在 NServiceBus 版本 4 中,您也可以在代理架构中运行 - 无论是使用 ActiveMQ、RabbitMQ 还是 SQL Server 表。
      • 所以,当你说“不简单”时,你是认真的。 NServiceBus 很难,但 Sql Server Service Broker 更难。比较难。我涉足 ssb 让我回到了 NServiceBus。
      【解决方案3】:

      Service Broker External Activator 怎么样?如果您想尝试一下,那么方法将是...,

      1. 创建一个 EXE、我更喜欢的控制台或 Windows,但最好启用命令行。
      2. 创建实际消息队列并在外部激活队列填满消息后立即推送消息。 创建单独队列的原因是因为微软提供的解决方案无法通过命令行将消息传递给其他应用程序,如果我们从 MS 获得源代码,那么它将成为很好的增强和完整的解决方案。

      它将如何工作...?

      1. Windows 服务不断轮询外部激活 队列,收到一条消息,它将执行 EXE [在服务配置中指定]。
      2. 消息将立即从外部激活队列中清除,执行的应用程序将调用 WCF 服务。
      3. WCF 服务将读取排队的实际消息并启动其进程。
      4. 使 WCF 调用异步,以便启动器 exe 不会持续很长时间 [是否需要异步,请自行选择]

      注意:设置外部激活windows服务的configuration时要小心。

      没有服务总线,这是唯一有效的解决方案,我们确实使用了它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-20
        • 1970-01-01
        • 2017-03-31
        相关资源
        最近更新 更多