我可以将 SqlDependency 与多个侦听器/负载平衡一起使用吗

Can I use SqlDependency with multiple listeners / load balance

我目前正在将 SqlDependency 与 SQL Server 2012 Service Broker 一起使用,我希望能够配置两台服务器,同时侦听服务代理并拉出队列,但只能拉出消息一次总掉队。每台机器都应该尽量拉下它能拉下的东西,但如果有太多机器进来,它应该在拉下它能拉下的东西上保持平衡。现在我启动了该程序的两个实例,并且都在监听。添加新消息后,它们都会从队列中取出相同的消息并 运行 代码。

SqlDependency 不是我想做的解决方案吗?对于这样的事情,更好的解决方案是什么?

Once a new message is added they both pull off the same message off the queue and run the code

您描述的行为是 SQL依赖性设计的工作方式。如果有多个侦听器,则通知所有侦听器。例如,您可以在 SignalR SQL Backplane documentation

中看到此描述

注意所有 VM 如何从 SQL 服务器接收通知,包括启动更新的 VM。

如果您想在工作虚拟机池中分发 SQL 通知,您需要一种共享状态的方法。请注意,SQL 通知仅表示 发生了某些变化,并不表示 发生了什么变化。一种方法是向数据库添加一个 table 以充当作业或操作队列。订阅者可以在每个通知上查询此队列,并通过更新或删除此 table 来声明操作。 (必须在 table 上配置适当的锁)

或者,您可以使用其他共享状态工具来执行此操作,例如消息队列(例如 RabbitMQ)或分布式缓存(例如 Redis)

您不需要 SQL 通知或 SQL 依赖项。每个实例可以执行:

WAITFOR(
    RECEIVE TOP(1) * FROM {NameOfQueue}
), TIMEOUT @timeoutvalue;

此命令将等待,使连接保持打开状态,直到有消息可用或发生超时。超时时您没有收到消息,因此只需连接并重试。

每条消息只能由一个进程接收。 Server Broker 队列中的行在内部被锁定,其他读者将 READPAST 锁定行。

因为 SQL 可能有点棘手,所以我写了一些我认为有用的东西 wrapper class that you are free to use