當訊息內容大於64 KB以至於無法直接存入MNS隊列時,不做訊息切片,使用Message ServiceMNS和Object Storage Service來傳遞大於64 KB的訊息。
背景資訊
Message ServiceMNS的隊列的訊息大小最大限制是64 KB,這個限制基本能夠滿足在正常情況下訊息作為控制流程資訊交換通道的需求。但是,在某些特殊情境下,訊息資料比較大時,就只能採用訊息切片的方式。
下面是不做訊息切片,通過OSS來實現傳遞大於64 KB的訊息的解決方案。
解決方案
生產者在向Message ServiceMNS發送訊息前,如果發現訊息體大於64 KB,則先將訊息體資料上傳到OSS。
生產者把資料對應的Object資訊發送到Message ServiceMNS。
消費者從Message ServiceMNS隊列裡讀取訊息,判斷訊息內容是否為OSS的Object資訊。
判斷訊息內容是OSS的Object資訊,則從OSS下載對應的Object內容,並作為訊息體返回給上層程式。
具體過程如下圖所示。
範例程式碼
大訊息範例程式碼提供了上述方案的一個Java語言版實現。主要功能都封裝成BigMessageSizeQueue類。
BigMessageSizeQueue提供的public方法如下:
//建構函式,cq為普通的mnsqueue對象,ossClient和ossBucketName包含了大訊息中轉的oss region和bucket。
public BigMessageSizeQueue(CloudQueue cq, OSSClient ossClient, String ossBucketName)
// 發送訊息。
public Message putMessage(Message message)
// 接收訊息。
public Message popMessage(int waitSeconds)
// 刪除訊息。
public void deleteMessage(String receiptHandle)
//設定大訊息的閾值(大於這個值的訊息會走OSS),預設64 KB。
public void setBigMessageSize(long bigMessageSize)
// 設定是否需要刪除OSS上的訊息,預設yes。
public void setNeedDeleteMessageObjectOnOSSFlag(boolean flag)
具體使用範例程式碼請參見大訊息範例程式碼中的Demo.java。
注意事項
大訊息主要消費網路頻寬,用該方案發送大訊息時,生產者和消費者的網路頻寬可能會是瓶頸。
大訊息網路傳輸時間較長,受網路波動影響的機率更大,建議在上層做必要的重試。