4、最后一个对象是路由,但它是可选的。路由只有在数据库服务器之间发送消息时才是必须的。路由与接收消息服务的本地副本器密不可分。如果服务器接收的消息是另外一个使用数据库镜像的服务器的镜像,那么就必须使用一个MIRROR_ADDRESS参数。
如果想让路由自动删除,那么可以设置LIFETIME标志。 CREATE ROUTE [tcp://SearchSQLServer/SampleRoute] AUTHORIZATION dbo WITH SERVICE_NAME = ‘[tcp://SearchSQLServer/……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
4、最后一个对象是路由,但它是可选的。路由只有在数据库服务器之间发送消息时才是必须的。路由与接收消息服务的本地副本器密不可分。如果服务器接收的消息是另外一个使用数据库镜像的服务器的镜像,那么就必须使用一个MIRROR_ADDRESS参数。如果想让路由自动删除,那么可以设置LIFETIME标志。
CREATE ROUTE [tcp://SearchSQLServer/SampleRoute] AUTHORIZATION dbo WITH SERVICE_NAME = '[tcp://SearchSQLServer/SampleService]', BROKER_INSTANCE = 'AB2F3EB9-6662-4AAF-8682-A9A48C3BDD3B', ADDRESS = 'TCP://RemoteServer:8888', MIRROR_ADDRESS = 'TCP://MirrorServer:8888' |
BROKER_INSTANCE参数是service_broker_guid字段的值,它来自远程服务器上的数据库的sys.databases视图。
为了实现队列之间的消息发送,必须使用两个命令。第一个是BEGIN DIALOG命令,然后是SEND命令。使用BEGIN DIALOG命令在发送和接收服务器之间来创建一个会话。如果使用一个已有的会话,那么就不需要使用BEGIN DIALOG命令。在使用BEGIN DIALOG命令创建了新的会话之后,就可以用SEND命令在会话上发送消息,其中消息的发送是通过BEGIN DIALOG命令返回的句柄实现。
DECLARE/font> @dialog_handle UNIQUEIDENTIFIER, @XMLData XML ; SET @XMLData = (SELECT * FROM sys.tables FOR XML AUTO) BEGIN DIALOG @dialog_handle FROM SERVICE [tcp://SearchSQLServer/SampleService] TO SERVICE 'tcp://SearchSQLServer/SampleService' ON CONTRACT [tcp://SearchSQLServer/SampleContract]; SEND ON CONVERSATION @dialog_handle MESSAGE TYPE [tcp://SearchSQLServer/SampleMessageType] (@XMLData); |
RECEIVE命令是用来查看和处理消息。RECEIVE命令与SELECT非常相似,都会返回数据。但是,当使用RECEIVE命令时,消息只能接收一次。在消息接收之后,如果它是会话中最后的消息——很多人都只在会话中输入一个消息,那么就使用END CONVERSATION命令来关闭它。RECEIVE命令可以与WAITFOR 命令一起使用,而WHILE循环用来处理程序的一次运行中的队列上的所有消息。
DECLARE @dialog_handle UNIQUEIDENTIFIER, @XMLData XML ; RECEIVE TOP (1) @dialog_handle = conversation_handle, @XMLData = CAST(message_body AS XML) FROM [tcp://SearchSQLServer/SampleQueue] END CONVERSATION @dialog_handle SELECT @XMLData |
结束会话时,事实接收队列会发送一个消息到发送队列,以此来通知发送队列、服务和SQL Server,会话结束了。这个结束会话消息必须由发送队列处理以便将数据从队列中删除。建议在发送队列上使用基本程序来自动清除这些消息。
CREATE PROCEDURE usp_ProcessAck AS DECLARE @xml AS XML DECLARE @dialog_handle as uniqueidentifier WHILE 1=1 SET @dialog_handle = NULL WAITFOR ( RECEIVE TOP (1) @dialog_handle = conversation_handle, @xml = cast(message_body as xml) FROM [tcp://SearchSQLServer/SampleQueue]), TIMEOUT 1000 IF @dialog_handle IS NULL break END CONVERSATION @dialog_handle END GO |
完成这个程序之后,当消息到达时,可以通过QUEUE的ACTIVATION命令来使用ALTER QUEUE命令设置一个队列自动地运行该程序。你可以设置程序的并行执行数目,将MAX_QUEUE_READERS设置为大于1。在高负荷的系统中,或当处理花费一定时间时,附加队列读取器可以通过并行方式加速数据处理。
ALTER QUEUE [tcp://SearchSQLServer/SampleQueue] WITH ACTIVATION (STATUS=ON, PROCEDURE_NAME = dbo.usp_ProcessAck, MAX_QUEUE_READERS = 2, EXECUTE AS SELF) |
SQL Server Service Broker的安装可能有点复杂,并且在因特网上相关的文档也不是很多。但是,一旦安装并正确运行了服务代理,它可以提供一个坚如磐石的内部或外部数据库通信平台,实现系统之间数据的快速一致发送。
作者
翻译
TechTarget中国特约技术编辑,某高校计算机科学专业教师和网络实验室负责人,曾任职某网络国际厂商,关注数据中心、开发运维、数据库及软件开发技术。有多本关于思科数据中心和虚拟化技术的译著,如《思科绿色数据中心建设与管理》和《基于IP的能源管理》等。
相关推荐
-
云端SQL Server高可用性最佳做法
与内部部署相比,在云端运行SQL Server可为数据库软件用户提供更多的灵活性和可扩展性,也可能更省钱。但云 […]
-
绘制数据关系图的利器:SQL Server 图像数据库工具
SQL Server 2017新增了图形数据库功能,你可以使用图结构来表示不同数据元素之间的关系。
-
如何在Azure部署时选择合适的SQL Server?
想要在Azure上运行SQL Server,企业一般会面临两种选择:在Azure虚拟机上安装SQL Server或使用Azure SQL Database。
-
Linux支持的引入 推动了SQL Server 2016集成服务的发展
随着SQL Server的不断发展,集成服务也在发生相应的变化。在最新的SSIS更新中,增加Linux支持和SQL Server 2016升级向导。