让WCF服务知道SQL Server service Broker消息已到达

本文关键字:消息 Broker service Server 服务 WCF SQL | 更新日期: 2023-09-27 18:29:37

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

我缺少的一个部分是"引发事件"部分。当NServiceBus收到一条消息时,它会在我的代码中引发一个事件。这非常有效。

对于SQLServerMessageBroker,我可以想到两种方法:

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

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

我最喜欢第一个,但对我来说似乎很不传统

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

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

让WCF服务知道SQL Server service Broker消息已到达

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

但尚不清楚这一切是如何与WCF集成的。如果两个端点都是使用SQL Server Service Broker进行通信的SQL Server实例,那么WCF就没有太大的空间。

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

此外,您是否考虑过使用SQL Server传输(v4中新增)来处理此集成场景?最后,我建议从讨论组的这个帖子中寻找一些建议:

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

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

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

它将如何工作

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

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

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