提交到 SQS 时有关将消息自动编码为 base64 的规则

Rules regarding auto encoding of messages into base64 while submitting to SQS

我正在开发一个应用程序,其中客户端(用多种语言编写 - Go、C++、Python、C#、Java、Perl 以及将来可能更多)提交 protobuf(并在在某些情况下,JSON) 向 SQS 发送消息。在另一端,消息由 Python 和 Go 客户端读取和解码 - 取决于消息类型。 Boto 似乎会自动将消息编码为 base64,但其他语言库似乎不会这样做。或者也许还有一些其他规则?

Boto 确实有提交原始消息的选项。

这里的预期行为是什么?我是否应该自己将消息编码为 base64 - 这使 boto 成为一个奇怪的情况 - 还是我遗漏了什么?

这在我的应用程序中引起了一些细微的错误,因为有一层额外的 base64 编码或解码。据我所知,没有惯用的方法来检测消息是否经过 base64 编码。最好的选择是尝试解码并查看它是否抛出异常 - 这是我不太喜欢的。

我试图寻找一些文档,但没有找到任何具有明确指南的内容。可能我看错地方了?

提前感谢您的指点。

您可能希望将您的消息编码为 something,因为 SQS 不接受 API 处消息负载中所有可能的字节组合。仅支持有效的 UTF-8、制表符、换行符和回车符 return。

Important

The following list shows the characters (in Unicode) allowed in your message, according to the W3C XML specification. For more information, go to http://www.w3.org/TR/REC-xml/#charsets If you send any characters not included in the list, your request will be rejected.

#x9 | #xA | #xD | [#x20 to #xD7FF] | [#xE000 to #xFFFD] | [#x10000 to #x10FFFF]

http://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html

base64 字母表明显落在这个范围内,使得使用 base64 编码的消息不可能被视为无效而被拒绝。当然,它也会使您的负载膨胀,因为 base64 将原始消息的每 3 个字节扩展为 4 个字节的输出(64 个符号限制每个输出字节携带 6 位可用信息,3 x 8 → 4 x 6)。

据推测,boto 会自动为您进行 base64 编码和解码消息,以便 "helpful."

但是根本没有必要使用base64的理由。

想到一个例子...有效 JSON 也符合 SQS 有效负载支持的受限字符范围。 (理论上,我想,JSON 可以说不是 "encoding,",但这有点迂腐)。

除了您提出的粗略方法之外,没有明确的方法来确定一条消息是否需要多次解码,但是如果您处于需要解码的情况下,则可以提出这样的论点模棱两可的,那就应该消除。

如果没有记录 boto 的行为并且没有办法让它表现得不一样,我会说这是错误的行为。但是,事实上,我不得不宽容一点,说这很不寻常。