AWS SAA系列
AWS 訊息傳遞
AWS SNS、SQS、Kinesis 與MQ比較
Nov 10, 2021
Amazon MQ
是AWS上託管的 Apache ActiveMQ 和 RabbitMQ,如果原本的程式架構中有用到,上雲的過程中就可以無痛換到Amazon MQ,無須修改程式。
Amazon Simple Queue Service(SQS)
SQS提供全託管的非同步佇列(Queue),網路服務總是會有一些耗效能的情況,在傳統的架構下會讓使用者卡住等待回應,讓使用者體驗不好,此時就能透過SQS解耦,將任務放到SQS中,再由後續服務自行去SQS中把任務拿出來處理,使用者在任務放到SQS後就會收到回應,體驗較佳。類似於軟體開發中的RabbitMQ,是Queueing的服務,非即時傳遞,而是靠背後服務主動抓取(pull)。
Features
- pull based not push base
- message Size max 256KB:大型訊息建議放到S3,用SQS傳遞S3檔案位址。
- 訊息保留天數:預設四天,可以手動調整。
- Standard Queues:無特定排序,一秒內幾乎是可以接收無上限的訊息,有可能有重複的message。
- FIFO Queues:先進先出,相對一秒內只能接收300則訊息,一次只會有一個訊息。
- 訊息能見度:訊息如果有服務領取,會暫時將訊息隱藏,避免被重複取用,若是取用後在特定時間內沒有被刪除,則會重新可見,有可能導致同一個訊息被領取兩次。
- Long polling & Short polling(default):Polling代表後端服務從Queues中把messages拿出來,大部分的情況下建議使用Long polling,因為可以避免沒有訊息的時候空耗資源的情況發生,降低成本,除非需求上需要馬上處理message。
- Amazon SQS Temporary Queue Client:關鍵字 request-response Pattern,可使用Temporary Queue來提高high-throughput,並減少成本。
Amazon Simple Notification Service (Amazon SNS)
SNS是一個全託管的pub/sub服務,提供發佈者(pbulisher)到訂閱者(subscriber)之間的消息傳遞,相對於SQS是pull based,SNS為push based,更可以串接AWS SQS、AWS Lambda、Https、AWS Kinesis、SMS(簡訊)、Email等服務。
Features
- pub/sub ,push based
- 不支援排序且不會儲存message
- 支援AWS SQS、AWS Lambda、Https、AWS Kinesis、SMS(簡訊)、Email、Mobile push。
- Topic:像是發佈者的頻道,等待訂閱者來訂閱。
- Subscription:訂閱topic,當topic收到訊息會馬上推送給訂閱者。
Amazon Kinesis
Kinese是一個全託管的串流服務,適用於收集、處理、分析大量串流資料,同一個串流可以被多個應用程式處理,可以參考這個影片把情境形象化。
- Record有時限,過後會消失
- 有順序
- 可透過shards增減來達到擴展或縮小Kinesis的目的。
- 有別於SQS是定期去抓取,Kinesis是
real-time
。 - 適合串接其他資料庫像是RDS、DynamoDB、Redshift。
- Amazon Kinesis Data Streams:類似於Kafka, 是一種可大規模擴展且耐久的即時資料串流服務,使用情境像是資料庫事件、金融股票交易、社交軟體、遊戲資料、地址位置追蹤。
- Amazon Kinesis Video Streams:影像串流服務。
- Amazon Kinesis Data Firehose:將串流資料導引到目標服務,像是AWS S3、AWS Redshift或是第三方的服務串接,可以將資料轉換成其他格式,資料被取走後就會從串流消失。
- Amazon Kinesis Data Analytics:使用SQL來分析串流資料。
總結
MQ支援標準API協定,關鍵字是無須修改程式碼,擴展性不如SQS、SNS。
SQS 是非同步佇列,pull based、not real-time。
SNS是pub/sub服務,push based、real-time。
Kinese是串流服務,real-time。
詳細比較可參考AWS FAQs