我正在使用Python,Celery和RabbitMQ从松散耦合的系统中生成消息。但是,我担心互操作性。
当直接从RabbitMQ检查消息有效负载时,由celery生成,我得到以下二进制格式:
我强烈怀疑这是一种二元泡菜格式。但是,我很难找到关于二元泡菜格式的信息。
所以,我真的有几个问题:
提前致谢...
更新
根据Brendan的建议,我已将其转换为JSON序列化程序:
add.apply_async(args=[10, 10], serializer="json")
对于未来的搜索者来说,似乎JSON格式在这个特定的空案例中大约增加了15%(或28个字节):
另外,对于那些可能有兴趣从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' )
我认为有一些有趣的结果,所以这里是:
正如您在此示例中所看到的,Pickle格式小于JSON。但是,当压缩添加到混合中时,压缩的JSON实际上小于任何版本的Pickle。我也很好奇这两种格式的解析时间。虽然JSON旨在解析性能,但Pickle基于偏移,这意味着它不必迭代。我想知道是否有人在两种格式上做过任何性能基准测试,包括压缩和不压缩,并考虑解析CPU时间。
答案 0 :(得分:5)
According to the documentation,你可以让Celery使用JSON代替。我推荐这样做,因为它非常标准,无论你使用什么语言。如果您使用大量二进制数据,则可能会增加消息的大小。
客户和员工之间传输的数据需要序列化。默认的序列化程序是pickle,但您可以在全局或每个单独的任务中更改它。有对pickle,JSON,YAML和msgpack的内置支持,你也可以通过将它们注册到Kombu序列化程序注册表中来添加你自己的自定义序列化程序(参见Kombu:数据序列化)。
答案 1 :(得分:2)
pickletools
模块的示例中,我推断这确实是一个泡菜流。答案 2 :(得分:0)
默认情况下,Celery使用pickle来序列化消息。
http://celery.github.com/celery/userguide/calling.html#calling-serializers
如果要使用基于文本的序列化,可以将序列化程序更改为json或jaml。