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

标签 java python go base64 amazon-sqs

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

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

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

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

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

在此先感谢您的指点。

最佳答案

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

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 编码和解码消息,以便“提供帮助”。

但根本没有理由必须使用base64。

想到的一个例子......有效的 JSON 也将符合 SQS 有效负载支持的受限字符范围。 (我猜,从理论上讲,可以说 JSON 不是一种“编码”,但这有点迂腐)。

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

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

关于java - 提交到 SQS 时有关将消息自动编码为 base64 的规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33019426/

相关文章:

pointers - 如果我将成员函数指针放在指针实例范围之外,是否有任何问题

java - Android 将字符数组发送到 JNI C++

java - 当我删除数据表中的一行时,它不会消失 - primefaces - Java?

java - 从 java/Android Studio 中的 geojson 特征集合中提取坐标 lat lng

java - 在java中找到字符串中第n次出现的子字符串?

python - 如何使用子图创建 Pandas groupby 图

git - "go get"私有(private)存储库的正确方法是什么?

javascript - 将 python 函数转换为 Javascript/node.js

python - 如何在 python 中模拟用户并使用 os.system

go - 从外部命令读取错误 : fatal error all goroutines are asleep - deadlock