开发者社区 问答 正文

消息服务的超大消息传输是什么?



问题背景


阿里云消息服务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方法如下:


具体使用示例代码请参考附件中Demo.java中的代码。

注意事项


1.大消息主要消息网络带宽,用该方案发送大size消息时,生产者和消费者的网络带宽可能会是瓶颈。
2.大消息网络传输时间较长,受网络波动影响的概率更大,建议在上层做必要的重试。

展开
收起
轩墨 2017-10-24 13:39:09 1785 分享 版权
阿里云 AI 助理回答

基于您提供的问题背景和解决方案,这里简要概述如何利用阿里云的Message Service (MNS)与Object Storage Service (OSS)结合来传递大于64K的消息,以及在实施这一方案时的一些关键点和注意事项。

解决方案概述

  1. 消息预处理:当生产者需要发送一个超过MNS队列允许的最大消息大小(64KB)的消息时,首先将这个大消息的数据上传至OSS。OSS作为阿里云的海量、安全、低成本、高可靠的云存储服务,非常适合存储大型数据对象。

  2. 发送元数据消息:上传完成后,生产者仅将该OSS对象的元数据(如Object URL或唯一标识符)封装成一个小于64KB的消息,并通过MNS队列发送出去。这样,实际的消息内容并未直接通过MNS传输,而是以引用的形式间接传递。

  3. 消费者处理:消费者从MNS队列中拉取消息,如果发现消息体是OSS对象的元数据,则根据这些信息去OSS下载完整的原始消息内容。对于小于64KB的常规消息,消费者则直接处理消息内容。

程序实现要点

  • BigMessageSizeQueue类:自定义的BigMessageSizeQueue类封装了上述逻辑,提供了接口方便生产者上传大消息到OSS并发送元数据到MNS,同时也为消费者提供方法来识别并从OSS下载大消息内容。

  • Demo.java示例:附件中的Demo.java代码示例展示了如何使用BigMessageSizeQueue类进行大消息的发送和接收,包括初始化配置、消息的发送流程、以及消费者端的消息处理逻辑。

注意事项

  1. 网络带宽考量:由于大消息的实际数据需通过OSS传输,这可能对生产者和消费者的网络带宽提出更高要求。确保网络环境能够支持快速的数据上传和下载,避免成为瓶颈。

  2. 重试机制:鉴于大消息网络传输时间较长且更易受网络波动影响,建议在应用层实现重试逻辑,以应对可能的传输失败情况,提高消息传递的可靠性。

  3. 成本与效率权衡:虽然此方案解决了大消息传输的问题,但增加了额外的OSS存储和数据传输费用,同时引入了更多的处理步骤,可能会略微降低系统响应速度。因此,在选择此方案前,应综合考虑业务需求、成本预算及性能要求。

综上所述,通过结合使用MNS和OSS,可以有效地解决大消息传输的限制,但实施过程中需注意优化网络配置、设计健壮的错误处理机制,并合理评估成本效益。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答