最佳实践:如何基于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。
具体过程如下图所示:
240_1365541074971606_f2e768e7bdd446b.png




程序实现
附件(zip.gif 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.大消息网络传输时间较长,受网络波动影响的概率更大,建议在上层做必要的重试。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值