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

Hom*_*er6 5 python pickle rabbitmq celery

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

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

二进制版芹菜输出

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

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

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

提前致谢...

更新:

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

add.apply_async(args=[10, 10], serializer="json")
Run Code Online (Sandbox Code Playgroud)

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

来自芹菜的JSON序列化版本

另外,对于那些可能有兴趣从c ++阅读pickle格式的人,我发现这个问题很有用: 如何从C读取python pickle数据库/文件?

更新2:

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

async_result = add.apply_async( (x, y), compression='zlib' )
Run Code Online (Sandbox Code Playgroud)

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

格式比较表

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

Rei*_*ica 5

根据文档,您可以使Celery使用JSON.我推荐这样做,因为它非常标准,无论你使用什么语言.如果使用大量二进制数据,则可能会增加消息的大小.

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

  • 您还可以启用压缩:http://docs.celeryproject.org/en/latest/userguide/calling.html#calling-compression (2认同)