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 以供以后调查。但是如何处理错误以及如何处理导致错误的消息取决于您!
我遵循了这个教程:
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 以供以后调查。但是如何处理错误以及如何处理导致错误的消息取决于您!