9

異なるプロセス間の通信を必要とする Java アプリケーションがあります。プロセスは同じ JVM または別の JVM で実行できますが、同じマシンで実行されます。

私のアプリケーションは別のプロセス (同じまたは異なる JVM) に「メッセージ」を送信する必要があり、それを忘れていました。IBM "MQ" のようなメッセージング キューに似ていますが、シンプルで、メモリのみを使用し、パフォーマンス向上のためにハード ディスクへの IO を使用しません。

Performance prescriptive からの最良のアプローチが何であるかはわかりません。

  • RMI はパフォーマンスの点で効率的かどうか、オーバーヘッドが必要だと思います。
  • ローカル ホストを使用する TCP/IP ソケットはどうですか?

他の考えはありますか?

4

2 に答える 2

18

RMI はパフォーマンスの点で効率的かどうか、オーバーヘッドが必要だと思います。

RMI は、その機能に対して効率的です。ほとんどの人が必要とするよりもはるかに多くのことを行いますが、通常は十分に高速です。約 1 ミリ秒の待機時間で、1 秒あたり 1 ~ 3 K のオーダーのメッセージを取得できるはずです。

ローカル ホストを使用する TCP/IP ソケットはどうですか?

これは常にオプションですが、単純な Java シリアライゼーションでは、RMI を使用するよりもはるかに高速ではありません。シリアライゼーションとデシリアライゼーションをどのように行うかは、高性能にとって重要です。


重要な注意点として、メッセージのシリアライズとデシリアライズに多くの時間が費やされますが、これはほとんどのトランスポートでは役に立ちません。そのため、最大のパフォーマンスが必要な場合は、効率的なマーシャリング戦略を検討する必要があります。ほとんどのトランスポート プロトコルは生バイトのみをベンチマークします。

皮肉なことに、ディスクを使用する場合は、TCP や UDP (ZeroMQ など) よりも高速になる可能性があり、さらに「無料」で永続性を得ることができます。

このライブラリ (私は作成者です) は、100 ナノ秒 (ZeroMQ の 350 分の 1) という低レイテンシでプロセス間で毎秒数百万のメッセージを実行できますhttps://github.com/peter-lawrey/Java-Chronicle 利点は次のとおりです。

  • 超高速のシリアライゼーションとデシリアライゼーション。多くの場合、トランスポート コストよりもはるかに長い時間がかかるため、ほとんどのトランスポート ベンチマークではこれを含めません。
  • メッセージが送信された後、いつでもキュー間で何が起こっているかを監視できるということです。
  • すべてのメッセージを再生します。
  • プロデューサーは、ディスク容量のサイズまでマイクロバーストを適切に処理するために、コンシューマーよりも前の任意の量のデータにすることができます。たとえば、消費者は TB 遅れる可能性があります。
  • TCP 経由のレプリケーションをサポートします。
  • コンシューマまたはプロデューサのいずれかの再起動は、ほとんど透過的です。
于 2013-01-29T10:20:39.533 に答える
3

サーバー アプリケーションを開発している場合は、ZeroMQ を検討してみてください。優れたパフォーマンスがあり、プロセス間通信を簡単に構築でき、非同期 API を構築できます。

ZeroMQは、InterProcess 通信で素晴らしいパフォーマンスを宣言します。TCPよりもさらに優れています。クラスタ化スキーマのこのソリューションを検討しています。

Pieter Hintjens は、異なる Message Broker 間のパフォーマンス比較について優れた回答を提供しています。

于 2013-01-29T10:15:06.700 に答える