同一服务代理服务在同一实例上的不同数据库上进行名称

时间:2015-04-13 05:56:17

标签: sql-server sql-server-2008 sql-server-2008-r2 sql-server-2012 service-broker

我通过服务代理创建了server1< - > server2通信。我在两台服务器上定义了路由,效果很好。当我定义路由时,我使用了以下代码:

CREATE ROUTE [SB_Cms_TimesheetRoute]
WITH SERVICE_NAME = '//DB1/DB2/UpdatedJobAssignments_TargetService',
ADDRESS = 'tcp://$(DB1_SERVER):4022';

一切正常 - 没有抱怨。我唯一无法理解的是,我可以在$(DB1_SERVER)实例上的DIFFERENT数据库上创建具有SAME名称的服务。服务经纪人将如何理解要使用的实例?

1 个答案:

答案 0 :(得分:4)

Service Broker将创建同名的多个服务理解为横向扩展方案。 CREATE ROUTE有一个可选的BROKER_INSTANCE参数,您省略了该参数,这对于处理同一服务的多个实例至关重要。 broker_instance必须与目标sys.databases中的service_broker_guid值相匹配。

假设您创建了两个名为'//UpdatedJobAssignments_TargetService'的服务(您不应该在服务名称中添加DB1DB2)。一个服务在DB1中,其中service_broker_guid值为8597e044-6057-423f-978c-096b0c4212b7,另一个服务在DB2中,其service_broker_guid值为29acd670-77bb-47da-baf9-fc74b714c8dd。您将创建两条路线,每条路线一条:

CREATE ROUTE [SB_Cms_TimesheetRoute_DB1]
WITH SERVICE_NAME = '//UpdatedJobAssignments_TargetService',
BROKER_INSTANCE = '8597e044-6057-423f-978c-096b0c4212b7',
ADDRESS = 'tcp://$(DB1_SERVER):4022';

CREATE ROUTE [SB_Cms_TimesheetRoute_DB2]
WITH SERVICE_NAME = '//UpdatedJobAssignments_TargetService',
BROKER_INSTANCE = '29acd670-77bb-47da-baf9-fc74b714c8dd',
ADDRESS = 'tcp://$(DB2_SERVER):4022';

现在,当您开始针对//UpdatedJobAssignments_TargetService服务的新对话框时,Service Broker会将您的第一条消息路由到两个可能目的地中的任何一个。在同一对话框上发送的所有后续消息将确定性地选择相同的目的地。您可以稍后动态添加更多服务实例,只需声明具有正确BROKER_INSTANCE值的相应路由。

您还可以通过在BEGIN DIALOG语句中指定所需的代理实例来明确定位您想要的服务实例:

BEGIN DIALOG CONVERSATION @h 
FROM ...
TO '//UpdatedJobAssignments_TargetService', '29acd670-77bb-47da-baf9-fc74b714c8dd'
ON CONTRACT ...
WITH ...;

此语法将使对话框确定性地定位DB2中的服务。 例如,您需要知道处理对话所需的状态是在DB2中。