SQL Server, ServicerBroker 异步执行存储过程

SQL Server, ServicerBroker for asynchronized execution of stored procedures

我遵循了这个教程:
https://gallery.technet.microsoft.com/scriptcenter/Using-Service-Broker-for-360c961a

它对我有用,
然而,
我有些不明白:
PROCEDURE proc_BrokerTargetActivProc 处,我们有无限循环:WHILE (1=1)。为什么 ?毕竟,在创建队列期间,我们使用以下过程绑定消息:PROCEDURE_NAME = proc_BrokerTargetActivProc

此外,我不确定我是否正确理解了它的工作方式:
ExecuteProcedureAsync 使用要执行的过程名称将消息推送到队列。
现在怎么办 ? BrokerTargetActivProc 将只用一条消息调用是如何工作的?

参数MAX_QUEUE_READERS = 5呢?

提前致谢,
此致

你在这里有三个问题。


问。 "Why do we have an infinite loop in the activation procedure?"

一个。这里的想法是启动程序有一些非零成本。如果队列中有一堆消息,让已经执行的过程处理它们比为每条消息执行该过程要便宜。


问。如何仅通过一条消息调用激活程序?

一个。这是 BrokerTargetActivProc 编写方式的实现细节。具体来说,RECEIVE TOP(1) 语句。在我的环境中,我一次从队列中收到多条消息(例如 RECEIVE TOP(1000))。该选择(以及该选择的含义)取决于您。


问。参数 MAX_QUEUE_READERS = 5 呢?

一个。为了充分理解这一点,阅读 this article 很有用。它概述了何时在服务代理队列上发生激活。 MAX_QUEUE_READERS 大于 1 表示您允许服务器有多个进程同时获取消息。如果您在短时间内收到大量消息,并且您希望通过激活程序的多次执行同时激活 运行 通过这些消息来提高吞吐量,这将很有用。


来自评论的后续问题:

问:谁在调用 BrokerTargetActivProc 过程?

A:当认为有必要激活时调用该过程(参见上面链接的文章)。至于执行上下文,您可以在将过程设置为队列的激活过程时进行设置。例如,如果我希望它执行为 foo_user,我会这样做:

alter queue [TASK_QUEUE] with activation (
   procedure_name = `BrokerTargetActivProc`, 
   execute as 'foo_user'
);

问:如何给激活程序传递参数?

答:你不知道。激活过程的要点是使消息出列并处理它们。因此,所有信息都应包含在消息中(这可能会引发查询等)。


问:错误处理如何?

A:这里要小心。任何导致 receive 语句回滚的事情都可能触发所谓的有害消息处理。也就是说,我所做的是将消息的接收和后续处理包装在激活存储过程的 try/catch 块中,在捕获中,我将消息放入 table 以供以后调查。但是如何处理错误以及如何处理导致错误的消息取决于您!