配置SQL Server Service Broker来发送存储过程数据(上)

日期: 2009-06-22 作者:Denny Cherry翻译:曾少宁 来源:TechTarget中国 英文

在SQL Server 2005中,微软引进了一个令人兴奋的新功能,即Service Broker,这对于许多管理员来说都是一个新的概念。这个概念,跨进程消息,是一个开发人员多年来一直在如Microsoft Message Queue (MSMQ)的产品中使用的应用。为了作好准备,必须运行一个SQL Server命令,并且必须对命令返回的数据进行处理。然而,它并不需要立刻进行处理,因为用户并不预期命令中有任何输出。

这就是消息队列。   正常情况下,当用户在SQL Server上启动一个存储过程时,他们必须等待存储过程来完成数据处理,然后才进行下一个动作。通过使用Service Broker,它……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

在SQL Server 2005中,微软引进了一个令人兴奋的新功能,即Service Broker,这对于许多管理员来说都是一个新的概念。这个概念,跨进程消息,是一个开发人员多年来一直在如Microsoft Message Queue (MSMQ)的产品中使用的应用。为了作好准备,必须运行一个SQL Server命令,并且必须对命令返回的数据进行处理。然而,它并不需要立刻进行处理,因为用户并不预期命令中有任何输出。这就是消息队列。

  正常情况下,当用户在SQL Server上启动一个存储过程时,他们必须等待存储过程来完成数据处理,然后才进行下一个动作。通过使用Service Broker,它们稍候可以将数据处理放到队列中留到后面执行。在这种情况下,用户将运行一个存储过程,但是,与数据处理不同,我们将输入数据打包为一个消息,并将这个消息发送到队列中。我们可以配置队列自动地读取消息并在消息中处理数据。

  消息可以在同一个数据库、同一台服务器上的数据库之间、或者服务器之间包括因特网上的服务器之间进行发送。这个过程有点类似电子邮件。当我给我的朋友发送一封电子邮件,他会接收然后读取邮件(处理消息),然后根据内容作一些回复。Service Broker就是以非常类似的方式进行工作。

  配置Service Broker发送和接收消息的4个步骤:

  我们必须配置几个Service Broker组件才能进行实际的消息发送和接收。比如,我们将把消息放到一个队列上进行自动处理。这些消息的处理可以是自动的,或者由一个Windows应用或者服务要求来从队列上读取消息。

  与其它对象相似,Service Broker名称在数据库中必须是唯一的。然而,如果我们将在服务器之间发送消息,那么我们配置Service Broker对象名称必须更加小心。一般我们建议将一些系统名称和方法名称组合起来加入到Service Broker对象名称中。这样就可以确保对象名称在我们的企业中是唯一的。这样当我们开始在内部使用了Service Broker来在系统之间发送消息,同时还想避免对象命名问题时,一切将变得很方便。尝试使用一个UNC风格的命名来确保唯一性。例如,我们将从tcp://SearchSQLServer/对象名称开始着手。

  1、我们在Service Broker首先必须配置的是消息类型(Message Type),它会告诉SQL Server关于消息内部的基本信息。Service Broker消息可以是任意类型的数据;文本、二进制、XML、数字等等。建议使用XML,因为它允许发送任何其它的数据类型。我们使用CREATE MESSAGE TYPE命令来创建消息类型。其中有4种验证可供选择。如果要加强XML模式验证,可以选择WELL_FORMED_XML或者VALID_XML WITH SCHEMA COLLECTION(使用XSD来强化XML模式)。


 CREATE MESSAGE TYPE [tcp://SearchSQLServer/SampleMessageType]AUTHORIZATION
  dbo
  VALIDATION = NONE

  2、我们需要安装的下一个对象是协定(Contract)。协定会告诉SQL Server消息类型之间的关系。就我个人而言,我喜欢让工作简单点,而喜欢在特定过程中的所有通信使用同一个消息类型。然而,Microsoft SQL Server Books OnLine例子则是对于发送系统使用一个消息类型而接收系统则使用另一个消息类型。

CREATE CONTRACT [tcp://SearchSQLServer/SampleContract] AUTHORIZATIONdbo
  (
  [tcp://SearchSQLServer/SampleMessageType] SENT BY ANY
  )

  3、现在,我们来到Service Broker的实际队列了。队列有点类似于一个表单。这就是消息在等待处理时被存储的地方。与表单不同的是,我们无法定义队列的模式。因此,建议使用XML来发送数据,因为我们可以在XML中定义模式。


 CREATE QUEUE [tcp://SearchSQLServer/SampleQueue] AUTHORIZATION dbo

  下一个配置的Service Broker对象是服务(Service)。这个服务是Service Broker在数据库中用以传输消息到正确的队列的,同时将协定捆绑在队列消息上。


 CREATE SERVICE [tcp://SearchSQLServer/SampleService] AUTHORIZATIONdbo
  ON QUEUE [tcp://SearchSQLServer/SampleQueue]
  (
  [tcp://SearchSQLServer/SampleContract]
  )

  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'
  The BROKER_INSTANCE parameter is the value of the service_broker_guid column from the sys.databases view of the database located on the remote server..

翻译

曾少宁
曾少宁

TechTarget中国特约技术编辑,某高校计算机科学专业教师和网络实验室负责人,曾任职某网络国际厂商,关注数据中心、开发运维、数据库及软件开发技术。有多本关于思科数据中心和虚拟化技术的译著,如《思科绿色数据中心建设与管理》和《基于IP的能源管理》等。

相关推荐