簡體   English   中英

SQS 消費者能否在消息可見性超時期間收到重復的消息?

[英]Can a SQS consumer receives duplicated message during visibility timeout of message?

我正在使用 SQS 標准隊列構建一個應用程序,當隊列中有新消息可用時,它將觸發 Lambda function。 我知道我的 Lambda function 可能會收到它之前處理過的重復消息:

在極少數情況下,當您接收或刪除郵件時,其中一個存儲郵件副本的服務器可能不可用。 如果發生這種情況,郵件副本不會在該不可用的服務器上刪除,並且您可能會在收到郵件時再次獲得該郵件副本。

根據我的理解,Lambda 服務將啟動我的 Lambda function 的多個實例,並且我的 Lambda function 的不同實例可能會處理相同的消息。 但是根據開發者指南,

收到消息后,它會立即保留在隊列中。 為防止其他消費者再次處理消息,Amazon SQS 設置了可見性超時,即 Amazon SQS 阻止其他消費者接收和處理消息的時間段。

我想知道我的 Lambda function 的一個實例是否可能收到重復的消息,而我的 Lambda function 的另一個實例是否仍在處理該消息。 也就是說,我想知道一個 Lambda 實例是否有可能在消息處於可見性超時時接收消息。

先感謝您。

閱讀這些文檔

不,如果它仍在處理消息,那么它不能,但如果處理失敗,那么它可能 在我看來,這取決於消息的數量和批次。

Lambda 分批讀取消息並為每批調用一次您的 function。 當您的 function 成功處理一批時,Lambda 將從隊列中刪除其消息。

  1. 這確定了 lambda 的並發取決於批處理的事實。

當 Lambda 讀取一批時,消息保留在隊列中,但在隊列的可見性超時時間內隱藏。 如果您的 function 成功處理了該批次,則 Lambda 將從隊列中刪除消息。 默認情況下,如果您的 function 在處理批次時遇到錯誤,則該批次中的所有消息再次在隊列中可見

  1. 這確定了批處理中的所有消息都應該被處理的事實,否則它們將在隊列中可見。

對於標准隊列,Lambda 使用長輪詢來輪詢隊列,直到它變為活動隊列。 當消息可用時,Lambda 最多讀取五個批次並將它們發送到您的 function。如果消息仍然可用,Lambda 會增加讀取批次的進程數,每分鍾最多增加 60 個實例。 事件源映射可以同時處理的最大批次數為 1,000。

  1. 這表明單個 lambda 最多可以讀取 5 個批次。

結合所有3。

如果最多5個批次,單個lambda可以處理5個批次,如果超過5個批次,則調用多個lambda,此時如果之前的lambda無法處理消息,重新出現在隊列中,調用新的lambda 將能夠讀取之前無法處理的消息。

這個博客也比文檔https://data.solita.fi/lessons-learned-from-combining-sqs-and-lambda-in-a-data-project/解釋得更好

暫無
暫無

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

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