簡體   English   中英

Azure 服務總線消息鎖定和消息完成

[英]Azure service bus message lock and message completion

我正在使用 Azure 服務總線隊列,我有一個工作人員接收消息並處理它約 15 分鍾,而最大隊列消息鎖定時間為 5 分鍾。 我在日志中注意到一個進程正在接收此消息並開始處理它,大約 7 分鍾后,第二個進程正在接收相同的消息(消息鎖定持續時間結束)並開始處理它。 當第二個進程工作時,第一個進程完成並向服務總線返回 true,然后第二個進程日志消失了,就像它正在消失一樣。 在處理消息服務總線時正在選擇消息,當它結束時它會從隊列中彈出消息,我想這可能是這種奇怪行為的原因,但我在文檔中找不到任何關於它的信息。 誰能澄清這一點? 如果消息處理完成並從隊列中彈出,而另一個處理器正在處理相同的消息,會發生什么?

順便說一句,我知道有一個更新鎖的選項,但我找不到在 nodejs 上執行此操作的好方法。

你所描述的是正常的,被稱為競爭消費者。 一個或多個進程從服務總線獲取消息。 如果某個消費者收到一條消息,則該消息將僅鎖定(租用)給該消費者,直到鎖定時間結束。 該時間今天最多為 5 分鍾。 一旦時間到了,消息就會被解鎖並可供其他消費者使用。 問題是,當消費者收到消息時,他們會得到該消息的副本。 當鎖過期時,消費者仍然持有消息的副本,因為沒有什么可以撤銷它。 至少經紀人不能這樣做。 這導致了這種行為,消費者可以繼續工作,但另一個消費者(一個或多個)將獲取消息並並行運行處理。 最終,第一個消費者將嘗試完成消息,但失敗並出現MessageLockLostException 這就是擴展鎖可以提供幫助的地方,因為接收消息的消費者可以向代理發出信號,表明它還沒有處理完消息,需要將其保留給自己。

我並不精通 Azure 支持的所有 SDK,但最新的 Node.js SDK應該能夠擴展鎖。 您可能會在此處要求文檔鏈接或說明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM