NServiceBus阻止消息被两个消费者处理?

时间:2015-11-04 11:38:49

标签: nservicebus nservicebus-distributor

NServiceBus文档列出了SQL传输的优点:

  

队列支持竞争的消费者(多个相同的实例)   端点馈送相同的队列)所以没有必要   经销商以扩大处理范围

http://docs.particular.net/nservicebus/sqlserver/design

如果多个消费者订阅了同一个队列,NServiceBus会阻止多个消费者处理消息?

在处理邮件之前,NServiceBus会锁定整个表吗?或者是标记为“正在处理”的消息??

1 个答案:

答案 0 :(得分:6)

SQL Transport使用非常特定的锁定提示来锁定行并导致其他竞争线程忽略当前锁定的任何行。

NServiceBus.SqlServer 2.2.0(我写这篇文章时的当前版本)使用的SQL,但我重新格式化的是:

WITH message AS 
(
    SELECT TOP(1) * 
    FROM [{Schema}].[{Queue}] WITH (UPDLOCK, READPAST, ROWLOCK) 
    ORDER BY [RowVersion] ASC
) 
DELETE FROM message 
OUTPUT deleted.Id, deleted.CorrelationId, deleted.ReplyToAddress, 
       deleted.Recoverable, deleted.Expires, deleted.Headers, deleted.Body;

它使用Common Table Expression将源数据限制为要返回的一行,然后使用以下锁定提示:

  • UPDLOCK - 保持数据处于锁定状态,意图更新数据。
  • READPAST - 忽略锁定的行并获取下一个未锁定的行。
  • ROWLOCK - 强制行级锁定,不要升级到页锁或表锁。

通过将整个事件作为删除执行,然后输出要删除的数据,我们可以读取数据,如果事务提交,则删除该行。否则,如果事务回滚,则锁定被释放,行等待下一个竞争消费者接收。

相关问题