超大消息傳輸__最佳實踐_消息服務-阿裏雲
問題背景
阿裏雲消息服務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方法如下:
public BigMessageSizeQueue(CloudQueue cq, OSSClient ossClient, String ossBucketName)
//構造函數,cq為普通的mnsqueue對象,ossClient和ossBucketName包含了大消息中轉的oss region和bucket
public Message putMessage(Message message) // 發送消息
public Message popMessage(int waitSeconds) // 接收消息
public void deleteMessage(String receiptHandle) //刪除消息
public void setBigMessageSize(long bigMessageSize) //設置大消息的閾值(大於這個值的消息會走OSS),默認64K;
public void setNeedDeleteMessageObjectOnOSSFlag(boolean flag) // 設置是否需要刪除OSS上的消息,默認yes;
具體使用示例代碼請參考附件中Demo.java中的代碼。
注意事項
1.大消息主要消息網絡帶寬,用該方案發送大size消息時,生產者和消費者的網絡帶寬可能會是瓶頸。
2.大消息網絡傳輸時間較長,受網絡波動影響的概率更大,建議在上層做必要的重試。
最後更新:2016-11-23 17:16:08
上一篇:
嚴格保序隊列__最佳實踐_消息服務-阿裏雲
下一篇:
事務消息__最佳實踐_消息服務-阿裏雲
SSH 登錄時出現如下錯誤:Maximum amount of failed attempts was reached__遠程登錄 (SSH)_Linux操作運維問題_雲服務器 ECS-阿裏雲
phpSDK使用手冊__SDK使用手冊_短信服務-阿裏雲
特征工程__使用手冊(new)_機器學習-阿裏雲
縮略後填充__圖片縮放_老版圖片服務手冊_對象存儲 OSS-阿裏雲
Android 收發消息示例__Android 接入示例_MQTT 接入(物聯)_消息隊列 MQ-阿裏雲
SetCACertificateName__ServerCertificate相關API_API 參考_負載均衡-阿裏雲
雲虛擬主機使用 360 網站安全檢測不成功的原因___安全問題_技術分享_雲虛機主機-阿裏雲
阿裏雲異構計算產品家族亮相,覆蓋AI全場景和高性能計算需求
登錄 OSS 管理控製台__控製台用戶指南_對象存儲 OSS-阿裏雲
.hk 域名持有者變更(過戶)操作說明__域名持有者信息修改_管理操作_域名-阿裏雲
相關內容
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲