1

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

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

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

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

我已经尝试过使用其他应用程序(不是 Service Broker 应用程序)的第二个选项,但效果不佳。

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

在我开始编码之前,我想我会问我是否错过了这里的大局。其他应用程序如何使用 SQL Server Service Broker 执行此操作?

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

4

3 回答 3

3

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

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

于 2013-09-02T06:23:41.477 回答
1

我很好奇——是什么让你决定离开 NServiceBus?

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

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

于 2013-08-31T06:37:47.150 回答
1

Service Broker 外部激活器怎么样?如果您想尝试一下,那么方法将是...,

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

它将如何工作......?

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

注意:您必须小心设置外部激活 Windows 服务的配置。

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

于 2013-09-03T04:53:10.960 回答