SQL Server服务代理指南
在Denny先生的博客中,SQL Server专家Denny Cherry讨论了SQL Server功能基础。其中一个话题主要是围绕SQL Server服务代理,和MSMQ有着相同的基础概念的消息队列(message queue)系统。无论你是一名新手还是一名专家,本篇指南都会向你提供如何建立和调整SQL Server这一新补充的相关信息。
目录:
-
>SQL Server服务代理概述
SQL Server服务代理能够保证消息发送顺序,总是对按顺序接收的消息做出相同的处理过程。消息可以按要求进行处理(你可以编写软件来按时间查询服务代理)或者自动地队列激活。
-
>SQL Server服务代理消息类型
消息类型是服务代理相关的第一个对象。消息类型定义了消息名称、以及服务代理必须在消息发送之前要做的验证。
-
>SQL Server服务代理的契约
每一个服务代理会话都需要一个契约(Contract)。这个契约定义了哪个或哪些类型的消息会被使用,以及谁(发送者和接收者)可以使用这些类型的消息。契约是在会话创建时指定的。
-
>SQL Server服务代理的队列
服务代理队列是消息被发送后存储的地方,但队列中的消息是还没有被处理的。队列有点像数据库表一样,你可以用来插入数据(发送消息)以及查看表中的数据(接收消息)。
-
>SQL Server服务代理的服务
服务是用于将契约绑定到队列上的。它们也用于数据库到数据库,或者服务器到服务器之间的消息路由(我们将在后面讨论路由)。
-
>SQL Server服务代理的路由
路由只是在从一个服务器向另一个服务器发送服务代理消息时才会用到。它们定义了发送消息所需要的SQL Server和SQL Server将要连接的TCP端口。如果你是向一个镜像数据库发送消息,你也可以像指定主数据库一样指定该镜像数据库。
-
>SQL Server服务代理的SEND命令
SEND命令是在SQL Server 2005版本引入的。它是一种类似于INSERT的命令,只是SEND只用在SQL Server服务代理中。在服务代理中,你是将数据填入一个队列,而不是数据库表中。你并不是把命令插入到队列中,而是向队列发送一个消息,这就像你向其他人发送一个电子邮件一样。
-
>SQL Server服务代理的RECEIVE命令
RECEIVE命令用于从队列中获取消息,这样你就可以对message_body字段中的数据进行处理。从本质上来说,RECEIVE命令在很多情况下与SELECT语句的使用方法很相似。
-
>SQL Server服务代理的消息已删除错误
我经常遇到有关消息删除的问题,可能其他人也会遇到同样的问题。你仍然能够在sys.conversation_endpoints DMV中看到该会话仍处于“会话中(CONVERSING)”状态,而不是“关闭(CLOSED)”状态。
-
>改进SQL Server服务代理的性能
在高负载的服务代理环境中,通过重用服务代理会话能够大大提升服务代理的性能。为每一个消息创建和关闭会话需要的开销大约是4X,而对于接收消息的性能提升大约能达到10X。Remus Rusanu在他发布在Reusing Conversations的博客上,谈到这个估值可能更大,并且还提出了一种重用会话的解决方案。
-
>监控SQL Server服务代理的运行状况
在处理SQL Server服务代理问题时,我需要一个快速简单的方式来查看服务代理的积压事务。所以我选择使用下面的这样一个小查询,它非常有效……