消息体编码选择指南

轻量消息队列(原 MNS)客户端内置了Base64编码与不使用Base64编码两种选项,本文介绍在不同的生产消费场景中是否需要使用Base64编码。

背景知识

Base64编码是一种用于将二进制数据转换为ASCII字符串的编码方案,广泛应用于需要通过文本处理的环境中传输数据。

使用Base64编码的优点

  • 兼容性:Base64编码的字符串由可打印的ASCII字符组成,适合在电子邮件、JSON、XML等文本格式中传输,避免了二进制数据导致的乱码问题。

  • 安全性:虽然Base64并非加密手段,但它可以防止一些纯文本格式中对原始二进制数据的直接查看,增加了一定程度的安全性。

  • 简单性:编码和解码过程相对简单,许多编程语言和库都提供了对Base64编码的内置支持。

使用Base64编码的缺点

  • 数据膨胀:Base64编码会使数据体积膨胀约33%。这意味着如果您对大型二进制文件进行编码,最终得到的字符串会比原始文件大。

  • 效率降低:在解码时需要额外的计算资源,尤其是在处理大量数据时,性能开销可能比较显著。

  • 可读性低:消息体内容被编码后无法直接阅读查看。

使用建议

队列模型

当消息体无特殊字符时,建议您不使用Base64编码。

  • 发送消息时使用message.setMessageBodyAsRawString方法设置消息体。

  • 接收消息时使用meesage.getMessageBodyAsRawString方法获取消息体。

主题模型(队列/HTTP订阅方式

在主题模型中,消息格式指订阅的NotifyContentFormat属性,指推送给用户的消息格式,可选择SIMPLIFIED、JSON或XML三种格式,更多信息,请参见订阅格式

  • 订阅格式为SIMPLIFIED:消息体无特殊字符的情况下,建议不使用Base64编码。

    • 向主题发送消息时使用RawTopicMessage初始化消息对象。

    • 从队列消费消息时使用message.getMessageBodyAsRawString()获取消息体。

  • 订阅格式为JSON或XML:Base64编码的字符串适合在JSON、XML等文本格式中传输,建议使用Base64编码。

    • 向主题发送消息时使用TopicMessage初始化消息对象,此时消息体会被Base64编码后放在Message字段中传输。

    • 从队列消费消息时使用message.getMessageBodyAsRawString();获取Message字段值后使用Base64解码。

      JSONObject object = new JSONObject(message.getMessageBodyAsRawString());
      String jsonMessageData = String.valueOf(object.get("Message"));
      String messageBody = new String(Base64.decodeBase64(jsonMessageData));

主题模型(邮件订阅方式)

当消息体无特殊字符时,建议您不使用Base64编码。

  • 发送消息时使用message.setMessageBodyAsRawString方法设置消息体。

  • 接收消息时使用meesage.getMessageBodyAsRawString方法获取消息体。

主题模型(短信订阅方式)

当消息体无特殊字符时,建议您不使用Base64编码。

  • 发送消息时使用message.setMessageBodyAsRawString方法设置消息体。

  • 接收消息时使用meesage.getMessageBodyAsRawString方法获取消息体。

主题模型(移动推送订阅方式)

当消息体无特殊字符时,建议您不使用Base64编码。

  • 发送消息时使用message.setMessageBodyAsRawString方法设置消息体。

  • 接收消息时使用meesage.getMessageBodyAsRawString方法获取消息体。