

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# FIFO 主題的 Amazon SNS 訊息排序詳細資訊
<a name="fifo-topic-message-ordering"></a>

Amazon SNS FIFO 主題一律會依訊息發布到主題的確切順序，將訊息傳送到訂閱的 Amazon SQS 佇列，並僅傳送一次。訂閱 Amazon SQS FIFO 佇列後，佇列的取用者會以訊息傳送到佇列接收訊息的確切順序，且不會重複。不過，如果訂閱了 Amazon SQS 標準佇列，佇列的取用者可能會接收非按順序排列的訊息，而且會接收不止一次。如此可進一步使發布者和訂閱用戶解耦，讓訂閱用戶在訊息消耗和成本最佳化方面具有更大的彈性，如下圖所示，根據 [Amazon SNS FIFO 主題範例使用案例](fifo-example-use-case.md)。

![\[Amazon SNS FIFO (First-In-First-Out主題中訊息傳遞系統的範例，強調訊息如何以嚴格順序持續交付至 Amazon SQS FIFO 佇列。它與 Amazon SQS 標準佇列的行為形成對比，在此佇列中，訊息可能會不按順序到達，並且超過一次。此範例展示三種不同的訂閱者類型：分析函數、批發應用程式和零售應用程式，示範每個訂閱者如何根據訂閱的佇列類型，以嚴格順序或最佳努力順序接收訊息。\]](http://docs.aws.amazon.com/zh_tw/sns/latest/dg/images/sns-fifo-ordering-1.png)


請注意，訂閱者沒有隱含的順序。此如下列範例所示：**m1** 首先交付給批發訂閱用戶，然後交付給零售訂閱用戶，接著是分析訂閱用戶。訊息 **m2** 首先傳遞給零售訂閱用戶，然後傳遞給批發訂閱用戶，最後傳遞給分析訂閱用戶。雖然這兩個訊息以不同的順序傳遞給訂閱用戶，但訊息順序會保留每個 Amazon SQS FIFO 訂閱用戶。每個訂閱者與任何其他訂閱者彼此獨立。

![\[Amazon SNS FIFO 主題和各種訂閱者類型的範例，包括 Amazon SQS FIFO 和標準佇列，如何處理訊息排序和交付。它顯示訊息已發佈至主題並交付至不同類型的佇列，以確保 FIFO 佇列的有序交付和標準佇列的盡最大努力排序。此設定支援電子商務平台中的案例，其中不同的元件需要以特定順序提供可靠的訊息，以進行準確的處理。\]](http://docs.aws.amazon.com/zh_tw/sns/latest/dg/images/sns-fifo-ordering-2.png)


如果 Amazon SQS 佇列訂閱用戶無法連線，則可能會不同步。例如，假設批發應用程式佇列擁有者錯誤地改變了[Amazon SQS 佇列政策](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-using-identity-based-policies.html)，以防止 Amazon SNS 服務主體將訊息傳遞到佇列。在這種情況下，傳遞到批發佇列的價格更新失敗，而零售和分析佇列的傳遞成功，導致訂閱用戶不同步。當批發應用程式佇列擁有者更正其佇列政策時，Amazon SNS 會繼續將訊息傳送到訂閱佇列。任何在目標佇列設定不正確時發布至主題的訊息都會被捨棄，除非對應的訂閱具有已設定的[無效字母佇列](sns-dead-letter-queues.md)。

![\[Amazon SNS FIFO 設定中訊息傳遞行為的範例，其中訊息會透過 Amazon SQS 佇列發佈至不同的訂閱者類型 （批發、零售和分析）。它強調了佇列政策設定錯誤對不同訂閱者佇列間訊息傳遞同步的影響。此範例顯示由於政策錯誤，批發訂閱者的訊息傳遞失敗，但零售和分析訂閱者會繼續成功，強調正確佇列組態的重要性，以維持同步資料傳遞。此案例強調了 FIFO 主題的功能，以確保在正常情況下和組態錯誤的後果下，有序且恰好交付一次。\]](http://docs.aws.amazon.com/zh_tw/sns/latest/dg/images/sns-fifo-ordering-3.png)


您可以讓多個應用程式 (或同一應用程式中的多個執行緒) 並行將訊息發佈至 SNS FIFO 主題。當您執行這項操作時，您可以有效率地將訊息順序委派給 Amazon SNS 服務。若要判斷已建立的訊息順序，您可以檢查序號。

序號是 Amazon SNS 指派給每封訊息之大型、不連續的數字。序號的長度是 128 位元，而且會在每個[訊息群組](fifo-message-grouping.md)繼續增加。序號會傳遞至訂閱的 Amazon SQS 佇列，做為訊息內文的一部分。但是，如果您啟用[原始訊息交付](sns-large-payload-raw-message-delivery.md)，則傳遞至 Amazon SQS 佇列的訊息不包含序號或任何其他 Amazon SNS 訊息中繼資料。

![\[多個 Lambda 函數的範例會將訊息發佈至 Amazon SNS FIFO （先進先出） 主題，然後將這些訊息交付至 Amazon SQS FIFO 佇列，以保持訊息處理的嚴格順序。此設定用於確保訊息在應用程式的不同元件之間傳送的確切順序，其中序號會指出群組中每個訊息的順序。這種類型的組態對於必須嚴格維護操作和訊息順序以確保一致性的應用程式至關重要。\]](http://docs.aws.amazon.com/zh_tw/sns/latest/dg/images/sns-fifo-ordering-4.png)


Amazon SNS FIFO 主題定義訊息群組內容中的排序。如需詳細資訊，請參閱[FIFO 主題的 Amazon SNS 訊息分組](fifo-message-grouping.md)。