消息由以下四個部分組成。
(1)消息ID (Message ID):由系統返回給用戶,用來標識隊列中的不同消息。
(2)接收句柄(Receipt Handle):當從隊列中接受消息時就會從消息那里得到一個接收句柄,這個句柄可以用來對消息進行刪除等操作。
(3)消息體(Body):消息的正文部分,需要注意的是消息存放的是文本數據并且不能是URL編碼方式。
(4)息體MD5摘要(MD5ofBody):消息體字符串的MD5校驗和。
2.消息取樣
隊列中的消息是被冗余存儲的,同一個消息會存放在系統的多個服務器托管上。這樣做的目的是為了保證系統的高可用性,但是這給用戶査詢隊列中的消息帶來了一定的麻煩。SQS使用的是基于加權隨機分布(Based on a Weighted Random Distribution)的消息取樣,當用戶發出査詢隊列中消息的命令后,系統在所有的服務器上使用基于加權隨機分布算法隨機地選出部分服務器,然后返回這些服務器上保存的所査詢的隊列消息副本。雖然用戶只要一直查詢下去總會查詢到所有的消息,但是當用戶査詢隊列中消息數目相對較少的話,在某次査詢時系統可能不會返回任何結果。圖3-19是這種取樣方式的示意圖。

可以看出,在圖3-19中就出現了返回結果不準確的現象,這是因為消息數較少且服務器的選擇具有隨機性。
3.消息的可見性超時值及生命周期
在SQS中,消息是否被接受是由用戶自己確認的。當用戶執行刪除操作后,系統就會認為用戶已經準確地接收到消息,將隊列中的消息徹底刪除。如果用戶未接收到數據或接收到數據并沒有執行刪除操作,SQS將在隊列中保留該消息。為了保證其他組件不會看見用戶的消息,SQS會將該消息阻塞,也就相當于給消息加了一把鎖。但是這把鎖并不會一直鎖住消息,因為系統保留消息的目的是為了給用戶重傳數據。為此SQS引入十一個可見性超時值(Visibility Timeout)。可見性表明該消息可以被所有的組件査看,可見性超時值相當于一個計時器,在設定好的時間內,發給用戶的消息對于其他所有的組件是不可見的。如果在計時器到時之前用戶一直未執行刪除操作,則SQS會將該消息的狀態 變成可見并給用戶重傳這個消息。可見性超時值可以由用戶自行設置,用戶可以根據自己 操作的需要改變這個值,經驗表明太長或太短的超時值都是不合適的。除了在計時器開始計時前改變設置,在計時器計時的過程中還可以對計時器進行兩種操作:擴展(Extend) 和終止(Terminate)。擴展操作就是將計時器按照新設定的值重新計時,終止就是將當前的計時過程終止,直接將消息由不可見變為可見。這兩個操作的設置都只是臨時性設置,不會被系統保存。消息從產生并發送至隊列一直到其從隊列中被刪除的全過程稱為消息的生命周期(Life Cycle)。如果消息在隊列中存放的時間超過4天,SQS也會自動將其刪除。圖3-20是消息的可見性超時值和生命周期的示意圖。
