当消息内容大于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。
注意事项
大消息主要消费网络带宽,用该方案发送大消息时,生产者和消费者的网络带宽可能会是瓶颈。
大消息网络传输时间较长,受网络波动影响的概率更大,建议在上层做必要的重试。