从非python(芹菜和rabbitmq)消费pickle二进制格式

时间:2012-08-29 18:41:10

标签: python rabbitmq celery pickle

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

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

Binary version of celery output

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

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

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

    更新

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

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

    对于未来的搜索者来说,似乎JSON格式在这个特定的空案例中大约增加了15%(或28个字节):

    JSON serialized version from celery

    另外,对于那些可能有兴趣从c ++阅读pickle格式的人,我发现这个问题很有帮助: How can I read a python pickle database/file from C?

    更新2:

    根据Asksol的建议,我尝试使用:

    进行zlib压缩
    async_result = add.apply_async( (x, y), compression='zlib' )
    

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

    Format comparison table

    正如您在此示例中所看到的,Pickle格式小于JSON。但是,当压缩添加到混合中时,压缩的JSON实际上小于任何版本的Pickle。我也很好奇这两种格式的解析时间。虽然JSON旨在解析性能,但Pickle基于偏移,这意味着它不必迭代。我想知道是否有人在两种格式上做过任何性能基准测试,包括压缩和不压缩,并考虑解析CPU时间。

3 个答案:

答案 0 :(得分:5)

According to the documentation,你可以让Celery使用JSON代替。我推荐这样做,因为它非常标准,无论你使用什么语言。如果您使用大量二进制数据,则可能会增加消息的大小。

  

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

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

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