2015-11-04 112 views
1

的NServiceBus文檔列出SQL運輸的好處是:NServiceBus停止消息被兩個消費者處理?

隊列支持競爭消費者所以,以規模出不需要 分配器(一樣 端點餵養過同一隊列的多個實例)處理

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

誰不NServiceBus防止消息被多個消費者正在處理如果有多個消費者訂閱相同闕UE?

是否NServiceBus鎖定整個表,直到處理消息?或者是標記爲'正在處理'的訊息?

回答

6

SQL傳輸使用非常特定的鎖提示來鎖定一行並導致其他競爭線程忽略當前鎖定的任何行。

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 - 強制行級鎖定,不會升級到頁面鎖定或表鎖定。

通過執行整個東西作爲刪除,然後輸出要刪除的數據,我們可以讀取數據,如果事務提交,行被刪除。否則,如果事務回滾,則釋放該鎖並等待下一個競爭消費者獲取該行。

相關問題