我们目前有两个数据中心处于主动 - 主动模式,并在两个数据中心之间使用 SQL 复制(延迟较小)。我正在开发一个新流程,该流程将使用 SQL Server Broker Service(外部激活器)来处理基于时间的作业队列。
目前有 1200 个作业,每个作业应每 15 分钟安排一次,因此我决定利用BEGIN CONVERSATION TIMER
外部激活器来安排作业,并从队列中检索消息。从理论上讲(并经过一些有限的测试),一切似乎都可以正常工作。
所以我的问题与 SQL 复制有关 - 在这个场景中,
- 我们想要复制队列表吗?
- 它们可以被复制吗?
- 我怎样才能在两个数据中心之间(比较均匀地)划分作业,而又不冒两次运行同一项作业的风险?
我只是不太清楚这种情况,我们想避免运行同一项作业两次。我搜索了又搜索(主要是谷歌),但找不到任何与我的情况相关的内容。任何关于这个问题的澄清/指导都将不胜感激。
短暂性脑缺血。
答案1
复制队列是不可能的,因为它们无法复制。但我推荐一些完全不同的东西:Service Broker 负载均衡。您可以拥有一组服务(在您的例子中是两个)并声明每个服务的路由。当您使用这些服务启动对话时,Service Broker 将在这些服务之间对对话进行负载平衡(它们根据conversation_id 进行哈希处理)。因此,如果您有 1000 个作业要安排,并且有 10 个工作站可以执行这些作业,那么您可以在每个工作站上创建一个执行器服务(例如“Worker”服务,它们都具有相同的名称),然后将消息发送到“Worker”,而无需指定哪个工作者。SSB 将在所有可能的目的地之间对作业(消息)进行负载平衡,从而产生负载平衡的调度程序。优点是一切都是部署时配置。您可以添加更多工作者,而无需修改应用程序中的一行代码,只需添加新路由即可。
我建议您阅读链接的文章,因为声明到相同服务的多条路线有点棘手,因为路线中的“broker_instance”起着至关重要的作用。