當消息內容大于64 KB以至于無法直接存入MNS隊列時,不做消息切片,使用消息服務MNS和對象存儲OSS來傳遞大于64 KB的消息。
背景信息
消息服務MNS的隊列的消息大小最大限制是64 KB,這個限制基本能夠滿足在正常情況下消息作為控制流信息交換通道的需求。但是,在某些特殊場景下,消息數據比較大時,就只能采用消息切片的方式。
下面是不做消息切片,通過OSS來實現傳遞大于64 KB的消息的解決方案。
解決方案
生產者在向消息服務MNS發送消息前,如果發現消息體大于64 KB,則先將消息體數據上傳到OSS。
生產者把數據對應的Object信息發送到消息服務MNS。
消費者從消息服務MNS隊列里讀取消息,判斷消息內容是否為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。
注意事項
大消息主要消費網絡帶寬,用該方案發送大消息時,生產者和消費者的網絡帶寬可能會是瓶頸。
大消息網絡傳輸時間較長,受網絡波動影響的概率更大,建議在上層做必要的重試。
文檔內容是否對您有幫助?