5

Python、Celery、RabbitMQを使用して、疎結合システムからメッセージを生成しています。ただし、相互運用性が心配です。

セロリによって生成されたRabbitMQから直接メッセージペイロードを検査すると、次のバイナリ形式が得られます。

セロリ出力のバイナリバージョン

これはバイナリピクルスフォーマットだと強く思います。しかし、一般的にバイナリピクルス形式に関する情報を見つけるのに苦労しています。

だから、私は本当にいくつかの質問があります:

  1. これはバイナリピクルスフォーマットですか?
  2. バイナリ形式を計画するために利用できるリソースは何ですか?
  3. セロリが実際にピクルス化されたデータを生成することを考えると、Python以外のコンシューマー(c ++やphpなど)からのメッセージを消費したい場合、どのようなオプションを利用できますか?
  4. Celery、RabbitMQを使用したり、Python以外の他のコンシューマーと相互運用したりした経験はありますか。そのテーマについて何かアドバイスはありますか?

前もって感謝します...

アップデート:

Brendanの推奨に基づいて、これを次のJSONシリアライザーに切り替えました。

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

将来の検索者のための参考のために、この特定の空の場合のJSON形式は約15%大きい(または28バイト)ようです。

セロリからのJSONシリアル化バージョン

また、c ++からピクルス形式を読み取ることに興味があるかもしれない人々のために、私はこの質問が役に立ちました: Cからpythonピクルスデータベース/ファイルを読み取るにはどうすればよいですか?

更新2:

Asksolの推奨に基づいて、次のコマンドでzlib圧縮を試しました。

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

興味深い結果がいくつかあると思ったので、ここにそれらがあります:

フォーマット比較表

この例でわかるように、Pickle形式はJSONよりも小さいです。ただし、圧縮がミックスに追加されると、圧縮されたJSONは実際にはどちらのバージョンのPickleよりも小さくなります。また、どちらの形式の解析時間についても興味があります。JSONはパフォーマンスをパーサーするように設計されていますが、Pickleはオフセットに基づいているため、繰り返す必要はありません。圧縮の有無にかかわらず、CPU時間の解析を考慮に入れて、2つの形式でパフォーマンスベンチマークを実行した人はいないでしょうか。

4

3 に答える 3

5

documentation によると、代わりにCeleryにJSONを使用させることができます。使用する言語に関係なく、かなり標準的なので、そうすることをお勧めします。ただし、大量のバイナリ データを使用すると、メッセージのサイズが大きくなる可能性があります。

クライアントとワーカーの間で転送されるデータはシリアル化する必要があります。デフォルトのシリアライザーは pickle ですが、これはグローバルに、または個々のタスクごとに変更できます。pickle、JSON、YAML、および msgpack の組み込みサポートがあり、Kombu シリアライザー レジストリに登録することで独自のカスタム シリアライザーを追加することもできます (Kombu: Serialization of Data を参照)。

于 2012-08-29T18:47:03.093 に答える
2
  1. モジュールの例から、pickletoolsこれは確かに pickle ストリームであると推測できます。
  2. 形式は正確に文書化されていません。実はいくつかのバージョンがあります。ただし、pickletools スクリプト (上記参照) を使用して pickle ファイルを分析することはできます。
  3. 他の言語から pickle 化されたデータを使用することはできません。この形式は Python 固有のものであり、実際に Python コードを実行します (少なくとも、オブジェクトの構築)。
  4. していません。ブレンダン・ロングが解決策を見つけたようです。相手側で 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 に答える