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

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