5

我正在使用 Python、Celery 和 RabbitMQ 从松散耦合的系统中生成消息。但是,我担心互操作性。

当直接从 celery 生成的 RabbitMQ 检查消息有效负载时,我得到以下二进制格式:

芹菜输出的二进制版本

我强烈怀疑这是一种二进制泡菜格式。但是,我一般很难找到有关二进制泡菜格式的信息。

所以,我真的有几个问题:

  1. 这是二进制泡菜格式吗?
  2. 有哪些资源可用于映射二进制格式?
  3. 鉴于 celery 实际上会产生腌制数据,如果我想使用来自非 python 消费者(例如 c++ 或 php)的这些消息,我可以使用哪些选项?
  4. 您是否有使用 Celery、RabbitMQ 以及与其他非 python 消费者进行互操作的经验。你对这个主题有什么建议吗?

提前致谢...

更新:

根据 Brendan 的建议,我已将其切换为 JSON 序列化程序:

add.apply_async(args=[10, 10], serializer="json")

作为未来搜索者的参考,在这种特定的空情况下,JSON 格式似乎大了大约 15%(或 28 个字节):

来自 celery 的 JSON 序列化版本

此外,对于可能有兴趣从 C++ 中读取 pickle 格式的人,我发现这个问题很有帮助: 如何从 C 中读取 python pickle 数据库/文件?

更新 2:

根据 Asksol 的建议,我尝试了 zlib 压缩:

async_result = add.apply_async( (x, y), compression='zlib' )

我认为有一些有趣的结果,所以他们在这里:

格式对照表

正如您在此示例中看到的,Pickle 格式小于 JSON。但是,当将压缩添加到组合中时,压缩后的 JSON 实际上比任何一个版本的 Pickle 都要小。我也很好奇这两种格式的解析时间。虽然 JSON 旨在提高解析器的性能,但 Pickle 是基于偏移量的,这意味着它不必被迭代。我想知道是否有人对这两种格式进行了任何性能基准测试,包括压缩和不压缩,并考虑了解析 CPU 时间。

4

3 回答 3

5

根据文档,您可以让 Celery 改用 JSON。我建议这样做,因为它非常标准,无论您使用哪种语言。如果您使用大量二进制数据,则可能会增加消息的大小。

客户端和工作人员之间传输的数据需要序列化。默认序列化程序是 pickle,但您可以全局更改它或为每个单独的任务更改它。内置对 pickle、JSON、YAML 和 msgpack 的支持,您还可以通过将自定义序列化程序注册到 Kombu 序列化程序注册表中来添加自己的自定义序列化程序(请参阅 Kombu:数据序列化)。

于 2012-08-29T18:47:03.093 回答
2
  1. pickletools模块的示例中,我推断这确实是一个泡菜流。
  2. 格式没有准确记录。其实有好几个版本。但是您可以使用 pickletools 脚本(见上文)来分析 pickle 文件。
  3. 您不能使用其他语言的 pickle 数据。该格式是高度特定于 Python 的,实际上执行 Python 代码(至少是对象构造)。
  4. 我没有。Brendan Long 似乎找到了解决方案。您仍然需要一些专用代码来解析另一端的 JSON 消息(特别是如果您需要传输任何复杂的结构),但它不应该太难(尽管可能很脆弱)。
于 2012-08-29T18:51:41.983 回答
0

默认情况下,Celery 使用 pickle 来序列化消息。

http://celery.github.com/celery/userguide/calling.html#calling-serializers

如果要使用基于文本的序列化,可以将序列化程序更改为 json 或 jaml。

于 2012-08-29T18:52:12.600 回答