Solaris で Java と C++ を組み合わせたアプリケーションを使用しています。コードの Java の側面は、Web UI を実行し、通信しているデバイスの状態を確立します。C++ コードは、デバイスから返されるデータをリアルタイムで処理します。共有メモリは、デバイスの状態とコンテキスト情報を Java コードから C++ コードに渡すために使用されます。Java コードは、PostgreSQL データベースを使用してその状態を保持します。
かなり深刻なパフォーマンスのボトルネックに直面しており、現時点でスケーリングできる唯一の方法は、メモリと CPU の数を増やすことです。共有メモリの設計により、1 つの物理ボックスにこだわっています。
ここで本当に大きな打撃を受けたのは、C++ コードです。Web インターフェイスは、デバイスの設定にほとんど使用されていません。私たちが本当に苦労しているのは、一度構成されたデバイスが配信するデータ ボリュームを処理することです。
デバイスから返されるすべてのデータには、デバイス コンテキストを指す識別子が含まれているため、それを調べる必要があります。現在、Java/UI コードによって維持され、C++ コードによって参照される一連の共有メモリ オブジェクトがあり、それがボトルネックになっています。そのアーキテクチャのため、C++ データ処理を別のマシンに移すことはできません。デバイスのさまざまなサブセットをさまざまなマシンで処理できるようにスケールアウトできるようにする必要がありますが、その場合、そのコンテキスト ルックアップを実行する機能が失われます。これが私が解決しようとしている問題です。デバイスコンテキストを参照しながら、他のボックスへの時間データ処理。
デバイス自体が使用するプロトコルを制御することはできず、状況が変わる可能性はありません。
クラスターにマシンを追加してスケールアウトできるようにするには、これを回避する必要があることを認識しており、私はこれをどのように行うかを正確に検討している初期段階にあります。
現在、Java コードをスケールアウトする方法として Terracotta を検討していますが、それに合わせて C++ をスケールアウトする方法についてはまだ考えていません。
パフォーマンスのスケーリングだけでなく、高可用性も考慮する必要があります。アプリケーションはほぼ常に利用可能である必要があります。絶対に 100% ではなく、費用対効果が高くありませんが、マシンの停止を乗り切るための合理的な仕事を行う必要があります。
私に与えられた仕事を引き受けなければならないとしたら、あなたは何をしますか?
編集: @john channing から提供されたデータに基づいて、GigaSpaces と Gemstone の両方を調べています。Oracle Coherence と IBM ObjectGrid は Java のみのようです。