什麼是無效字母佇列?
無效字母佇列 (DLQ) 是一種特殊類型的訊息佇列,可暫時存放軟體系統因錯誤而無法處理的訊息。訊息佇列是支援分散式系統中非同步通訊的軟體元件。它們讓您能夠在任何磁碟區的軟體服務之間傳送訊息,並且不需要訊息接收器始終可用。無效字母佇列專門存放沒有目的地,或無法由預期接收器處理的錯誤訊息。
為什麼無效字母佇列很重要?
無效字母佇列 (DLQ) 與一般訊息佇列共同存在。它們可充當錯誤和失敗訊息的臨時存儲體。DLQ 可防止來源佇列溢出未處理的訊息。
例如,假設使用包含一般訊息佇列和 DLQ 的軟體。該軟體使用一般佇列來保存計劃傳送至目的地的訊息。如果接收者無法回應或處理傳送的訊息,軟體會將其移至無效字母佇列。
若訊息移至 DLQ 管道,有兩個可能的原因:錯誤的訊息內容和接收者系統變更。
錯誤的訊息內容
如果傳輸的訊息有誤,訊息會移至 DLQ。硬體、軟體和網路條件可能會損毀傳送的資料。例如,硬體干擾會在傳輸期間稍微變更部分資訊。非預期的資料損毀可能會導致接收者拒絕或忽略訊息。
接收者系統變更
如果接收軟體發生了寄件者不知道的變更,訊息也可能會移至 DLQ。例如,您可以傳送 CUST_ID_005 的訊息,來嘗試更新客戶的資訊。但是,接收者可能無法處理傳入的訊息,因為它已從系統的資料庫中移除客戶。
無效字母佇列有哪些優勢?
接下來,我們談論無效字母佇列 (DLQ) 的優勢。
降低通訊成本
一般或標準訊息佇列會繼續處理訊息,直至保留期到期為止。這有助於確保持續處理訊息,並將佇列遭到封鎖的機率降至最低。
不過,如果您的系統處理數千則訊息,則大量的錯誤訊息會增加通訊費用,並增加通訊系統的負擔。與其嘗試處理失敗的訊息,直至其到期,最好在幾次處理嘗試後將其移至無效字母佇列。
改善疑難排
如果您將錯誤訊息移至 DLQ,這可讓您的開發人員專注於識別錯誤的原因。他們可調查為什麼接收者無法處理訊息,套用修復程式,並執行新的嘗試來交付訊息。
例如,銀行業務軟體可能每天會向其後端系統傳送數千個信用卡應用程式以進行核准。後端系統在此接收應用程式,但由於資訊不完整,可能無法處理所有應用程式。軟體不會進行無休止的嘗試,而是將訊息移至 DLQ,直至 IT 團隊解決問題為止。這讓系統能夠處理和交付剩餘的訊息,而不會出現效能問題。
何時應使用無效字母佇列?
如果您的系統發生下列問題,可以使用無效字母佇列 (DLQ)。
無序佇列
當您的應用程式不依賴順序時,您可以充分利用 DLQ。DLQ 可協助您對不正確的訊息傳輸作業進行疑難排解,但您應繼續監控佇列並重新傳送失敗的訊息。
FIFO 佇列
訊息排序在先進先出 (FIFO) 佇列中很重要。在交付下一則訊息之前,必須先處理每則訊息。您可以將無效字母佇列與 FIFO 佇列搭配使用,但 DLQ 實作也應該是 FIFO。
何時不應使用無效字母佇列?
若您希望能夠無限期地重試訊息傳輸,不應使用含有無序佇列的無效字母佇列。例如,如果程式必須等待相依程序變為作用中或可用,請勿使用無效字母佇列。
同樣,如果您不希望破壞訊息或作業的確切順序,不應使用含有先進先出 (FIFO) 佇列的無效字母佇列。例如,請勿針對影片編輯套件,使用含有編輯決策清單 (EDL) 說明的無效字母佇列。在此執行個體中,透過變更編輯的順序,您可以變更後續編輯的相關內容。
無效字母佇列如何運作?
在大多數情況下,無效字母佇列 (DLQ) 的運作方式就像一般訊息佇列一樣。它會存放錯誤訊息,直至您處理它們以調查錯誤原因為止。
接下來,我們將討論 DLQ 的重新驅動政策,以及訊息如何移入和移出 DLQ。
建立重新驅動政策
軟體會參照重新驅動政策,將訊息移至無效字母佇列。重新驅動政策包含確定軟體何時應將訊息移入無效字母佇列的規則。重新驅動政策主要是透過定義最大重試計數,來規範來源佇列和無效字母佇列之間的互動方式。
例如,如果您的開發人員將重試計數上限設定為 1,則系統會在單次嘗試之後將所有失敗的交付移至 DLQ。某些交付失敗可能是由於臨時網路過載或軟體問題引起。這會將許多未交付的訊息傳送至 DLQ。為了取得適當的平衡,開發人員會最佳化重試計數上限,以確保軟體在將訊息移至 DLQ 之前執行足夠的重試次數。
將訊息移至無效字母佇列
寄件者與收件者之間的交付嘗試失敗可能出於以下幾個原因:
- 因為訊息不存在,接收者無法接收訊息。
- 訊息包含錯誤。
- 訊息超出佇列或訊息長度限制。例如,某些接收器無法處理超過特定大小的訊息。
- 訊息的存留時間 (TTL) 已到期。TTL 是一個值,表示特定資料封包在網路上的有效時長。
將訊息移出無效字母佇列
當訊息移入無效字母佇列時,開發人員會檢查錯誤訊息以確定原因。DLQ 中的訊息可能包含寶貴的洞察,以防止類似問題今後再次出現。在開發人員分析並修復問題之後,系統會將訊息移出 DLQ 並至來源佇列中。這可讓寄件者繼續處理訊息。
AWS 如何支援您的無效字母佇列需求?
Amazon Simple Queue Service (Amazon SQS) 提供可擴展的方法,可在分散式系統之間大規模交換訊息。開發人員使用 Amazon SQS 來建置具有全受管標準佇列和先進先出 (FIFO) 佇列的可靠 Web 應用程式。
以下是 Amazon SQS 的其他優勢:
- Amazon SQS 允許系統建立無限數量的訊息佇列
- 開發人員可批次傳輸訊息以實現成本效益
- Amazon SQS 支援訊息鎖定,防止多部電腦同時處理相同的訊息
立即建立 AWS 帳戶,開始使用 Amazon Web Services (AWS)。