閱讀120 返回首頁    go 阿裏雲 go 技術社區[雲棲]


超大消息傳輸__最佳實踐_消息服務-阿裏雲

問題背景

阿裏雲消息服務MNS的隊列的消息大小最大限製是64K,這個限製基本能夠滿足在正常情況下消息作為控製流信息交換通道的需求。但是,在某些特殊場景下,消息數據比較大時,就隻能采用消息分片的方式。

那麼如何能夠基於MNS,又不做消息切片,傳遞大於64K的消息呢?解法是有的。

解決方案

1.生產者在往MNS 發送消息前,如果發現消息體大於64K,則先將消息體數據上傳到OSS上;

2.然後,生產者把數據對應的Objcet信息作為消息發送到MNS上;

3.消費者從MNS隊列裏讀取消息,判斷消息內容是否為OSS的Object信息;

4.如果消息內容是OSS的Object信息,則從OSS下載對應的object內容,並作為消息體返回給上層程序;

5.對於大小小於64K的消息,仍然直接走MNS。

具體過程如下圖所示:

大消息

程序實現

大消息示例代碼提供了上述方案的一個Java語言版實現。主要功能都封裝成類:BigMessageSizeQueue

BigMessageSizeQueue提供的public方法如下:

  1. public BigMessageSizeQueue(CloudQueue cq, OSSClient ossClient, String ossBucketName)
  2. //構造函數,cq為普通的mnsqueue對象,ossClient和ossBucketName包含了大消息中轉的oss region和bucket
  3. public Message putMessage(Message message) // 發送消息
  4. public Message popMessage(int waitSeconds) // 接收消息
  5. public void deleteMessage(String receiptHandle) //刪除消息
  6. public void setBigMessageSize(long bigMessageSize) //設置大消息的閾值(大於這個值的消息會走OSS),默認64K;
  7. public void setNeedDeleteMessageObjectOnOSSFlag(boolean flag) // 設置是否需要刪除OSS上的消息,默認yes;

具體使用示例代碼請參考附件中Demo.java中的代碼。

注意事項

1.大消息主要消息網絡帶寬,用該方案發送大size消息時,生產者和消費者的網絡帶寬可能會是瓶頸。

2.大消息網絡傳輸時間較長,受網絡波動影響的概率更大,建議在上層做必要的重試。

最後更新:2016-11-23 17:16:08

  上一篇:go 嚴格保序隊列__最佳實踐_消息服務-阿裏雲
  下一篇:go 事務消息__最佳實踐_消息服務-阿裏雲