1

protobuf でエンコードされたメッセージを使用して、kafka/samza ジョブのパイプラインを操作します。パイプラインは、特定のデータ セットに対して非常に長くなる可能性があるため、パイプラインの各ステージにタイムスタンプ/ID を追加して、効率とサービスの正常性を監視したいと考えています。

追加情報は、タッチポイントと呼ばれるスキーマの繰り返しフィールドに追加されます。明らかに、Java/samza でメッセージをデコードし、追加のメッセージを追加して再度シリアル化すると、メッセージのサイズに応じてオーバーヘッドが増加します (逆シリアル化時間が長くなる場合もあります)。パイプの一部は、メッセージをチェックする単なるフィルターです。キーであり、逆シリアル化する必要さえない場合があるため、これらのオーバーヘッドが少ないほど良い.

逆シリアル化せずに2番目のシリアル化されたメッセージを既存のメッセージに挿入することは可能ですか?もしそうなら、これは非常に悪い習慣であり(そうなると思います)、逆シリアル化/追加/する必要がないより良い解決策はありますか?メッセージ パス/フロー時間を監視するためのシリアル化

4

1 に答える 1

4

一般に、これは非常にトリッキーであり、次の理由により「ストリーミング」方法では実行できません。子メッセージには、可変長整数でエンコードされたサイズがプレフィックスとして付けられます。したがって、何かを挿入すると、すべての親のサイズがルートまで再帰的に調整されることになり、サイズの可変長エンコーディングのために、サイズの変更によってコンテンツが再び移動する可能性があります。

この問題を回避するためにできることの 1 つは、タイム スタンプに固定サイズのフィールドを使用し、最初の段階でプロトを構築するときに値が入力されていることを確認することです。プロト。これにより、 を使用して (理想的には一意の) タイムスタンプ フィールド ID の proto をスキャンし、 を使用しCodedInputStreamてパッチを適用したスト​​リームを書き戻すことができCodedOutputStreamます。これを正しく行うには、内部形式を理解する必要があります。最初に空のパススルー「フィルター」から始めて、出力が入力と一致することを確認することをお勧めします(問題が発生した場合は質問を更新してください)

于 2016-04-22T11:14:48.723 に答える