最佳实践:如何基于MNS和OSS实现无大小限制的消息传输
生活随笔
收集整理的這篇文章主要介紹了
最佳实践:如何基于MNS和OSS实现无大小限制的消息传输
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題背景
阿里云消息服務MNS的隊列的消息大小最大限制是64K,這個限制基本能夠滿足在正常情況下消息作為控制流信息交換通道的需求。但是,在某些特殊場景下,消息數據比較大時,就只能采用消息分片的方式。
那么如何能夠基于MNS,又不做消息切片,傳遞大于64K的消息呢?解法是有的。
解決方案
1.生產者在往MNS 發送消息前,如果發現消息體大于64K,則先將消息體數據上傳到OSS上;
2.然后,生產者把數據對應的Objcet信息作為消息發送到MNS上;3.消費者從MNS隊列里讀取消息,判斷消息內容是否為OSS的Object信息;
4.如果消息內容是OSS的Object信息,則從OSS下載對應的object內容,并作為消息體返回給上層程序;
5.對于大小小于64K的消息,仍然直接走MNS。
具體過程如下圖所示:
程序實現
附件(?BigMessageQueue.rar?(2976 K) )提供了上述方案的一個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 請參考附件中Demo.java中的代碼。
注意事項
1.大消息主要消息網絡帶寬,用該方案發送大size消息時,生產者和消費者的網絡帶寬可能會是瓶頸。
2.大消息網絡傳輸時間較長,受網絡波動影響的概率更大,建議在上層做必要的重試。
阿里云消息服務MNS的隊列的消息大小最大限制是64K,這個限制基本能夠滿足在正常情況下消息作為控制流信息交換通道的需求。但是,在某些特殊場景下,消息數據比較大時,就只能采用消息分片的方式。
那么如何能夠基于MNS,又不做消息切片,傳遞大于64K的消息呢?解法是有的。
解決方案
1.生產者在往MNS 發送消息前,如果發現消息體大于64K,則先將消息體數據上傳到OSS上;
2.然后,生產者把數據對應的Objcet信息作為消息發送到MNS上;3.消費者從MNS隊列里讀取消息,判斷消息內容是否為OSS的Object信息;
4.如果消息內容是OSS的Object信息,則從OSS下載對應的object內容,并作為消息體返回給上層程序;
5.對于大小小于64K的消息,仍然直接走MNS。
具體過程如下圖所示:
程序實現
附件(?BigMessageQueue.rar?(2976 K) )提供了上述方案的一個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 請參考附件中Demo.java中的代碼。
注意事項
1.大消息主要消息網絡帶寬,用該方案發送大size消息時,生產者和消費者的網絡帶寬可能會是瓶頸。
2.大消息網絡傳輸時間較長,受網絡波動影響的概率更大,建議在上層做必要的重試。
總結
以上是生活随笔為你收集整理的最佳实践:如何基于MNS和OSS实现无大小限制的消息传输的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 仅9599元!索尼发布全新G大师系列全画
- 下一篇: 小米平板5限时降价 目前1799元起 配