120
阿里云
超大消息传输__最佳实践_消息服务-阿里云
问题背景
阿里云消息服务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-阿里云