質問

潜在的に大きな文字列をランデブー メッセージに入れようとしているのですが、サイズの制約について興味がありました。メッセージ全体に物理的な制限 (64 MB?) があることは理解していますが、他の変数がそれにどのような影響を与えるのか興味があります。具体的には:

  • 鍵の大きさはどれくらいですか?
  • 文字列の保存方法 (1 つのフィールドと複数のフィールド)

上記のトピックのいずれか、またはその他に関連する可能性のあるものに関するアドバイスをいただければ幸いです。

注記:メッセージを(バイトコードなどではなく)生の文字列として保持したいと考えています。

役に立ちましたか?

解決

非常に大きなメッセージに関する Tibco ドキュメントから:

ランデブー・ソフトウェアは、非常に高い輸送能力を備えている。 大きなメッセージに分ける。 の上に置く。 ネットワークが可能な限り迅速に 彼らを受け入れる。状況によっては ネットワークが圧倒される キャパシティだ;アプリケーションは以下を達成できる。 大容量を分割することでスループットを向上 メッセージを小さな塊に分割し 送信レートの調整 その塊だ。を使用することができます。 チャンクを評価するパフォーマンス・ツール 最適なサイズと送信レート スループット。

この例では、1つのメッセージを送信する。 1,000万バイトからなる。ランデブー・ソフトウェアが自動的に メッセージをパケットに分割し が送ってくる。しかし、この爆発は パケットがネットワーク容量を超える可能性がある、 その結果、スループットが低下する:

sender> rvperfm -size 10000000 -messages 1   

この2番目の例では、アプリケーションは1,000万バイトをそれぞれ1万バイトの1000個の小さなメッセージに分割し、バッチサイズと間隔を自動的に決定して、最適なスループットのためにフローを調整します。

sender> rvperfm -size 10000 -messages 1000 -auto   

-messagesと-sizeパラメーターを変化させることにより、特定のネットワーク内のアプリケーションの最適なメッセージサイズを決定できます。アプリケーション開発者は、この情報を使用して、パフォーマンスを改善するために送信料金を調整できます。

実際の制限に関しては、Add string 関数は C スタイルの ansi 文字列を受け取るため、理論的には制限がありませんが、AddOpaque の署名を考慮すると、

tibrv_status tibrvMsg_AddOpaque( 
   tibrvMsg       message, 
   const char*    fieldName, 
   const void*    value, 
   tibrv_u32      size); 

これは u32 を使用しますが、制限は 64MB ではなく 4GB になる可能性が高いと言うのが賢明だと思われます。

ただし、Tib を使用してこのような大きなパケットを転送すると、この種のメッセージをすべてのコンシューマに送信しようとするときに大量のトラフィックをバッファする必要があるため、深刻なパフォーマンスのボトルネックになる可能性があります。デフォルトでは、rvd バッファは 60 秒しかないため、これが大量のトラフィックである場合、メッセージ損失が発生する可能性があります。

tibco 内のメッセージ オーバーヘッドは、次のように単純です。

  1. 各メッセージ (ヘッダー) に関連付けられた固定コスト
  2. すべてのフィールド (タイプ情報とフィールド ID)
  3. さらに、以下を含むすべての可変長側面のコストがかかります。
    1. 送信および受信のサブジェクト (事実上、それぞれ 256 バイトに制限されます)
    2. フィールド名。ドキュメント内のフィールド名の長さに制限はありませんが、フィールド名は小さいほど良いため、まったく使用せずに数値識別子を使用する方が良いでしょう。
    3. メッセージ内の配列/文字列/不透明/ユーザー定義の可変長フィールド

注記:ネストされたメッセージを使用する場合は、上記を再帰するだけです。

あなたの場合、ペイロードのオーバーヘッドは名前に比べて非常に膨大になるため(名前が合理的で単純である限り)、これらを最適化することはまったく意味がありません。

圧縮を有効にして rvrd を使用するか、または deflate のような高速で効果的なものを使用するようにプロデューサー/コンシューマーを変更することにより、文字列を圧縮形式で送信すると、有線/バッファリングでかなりの効率が得られることがわかります (またはQuickLZ、FastLZ、LZOなどの難解なものを感じています。特に固定メモリ使用量の圧縮/解凍エンジンを備えたもの)

どのプラットフォーム API (.net/java/C++/C など) をターゲットにしているのかは明記されていないため、状況が少し異なります。通信上では、デフォルトで UTF-16 を使用する java/.net に関係なく、すべての文字列データは 1 文字あたり 1 バイトになりますが、基になるバッファが再利用できないため、これらをメッセージに配置したり、メッセージから読み出したりする際に多大な変換コストが発生します。このような場合は、コピー (およびそれぞれ圧縮/拡張) を実行する必要があります。不透明なバイト シーケンスに固執する場合、マネージド ラッパー API を介して可能な素朴な実装ではコピー オーバーヘッドが依然として残りますが、データをネイティブ文字列として処理する必要がなければ、少なくともオーバーヘッドは少なくなります。

他のヒント

OPに推測されたように、

メッセージの全体の最大サイズは64メガバイトです。 "Tibcoのランデブー概念" のドキュメントから:

  

大規模なデータ・バッファを交換する能力は、ランデブーの機能ですが、   このソフトウェアは、それはメッセージが大きすぎて作ることが最善ではありません。たとえば、データを交換します   10,000バイトまで、単一のメッセージが効率的です。しかし、可能性がファイルを送信します   長さは多くのメガバイトは、我々は、おそらく1、複数の送信呼び出しを使用することをお勧めします   各レコード、ブロック、追跡のため。経験的にするための最も効率的なサイズを決定   現行のネットワーク条件。 (実際のサイズ制限はほとんどされていない64メガバイトであります   適切な大きさ。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top