2008-09-09 7 views
8

Solaris上にJavaとC++が混在したアプリケーションがあります。コードのJavaの側面はWeb UIを実行し、話しているデバイスの状態を確立し、C++コードはデバイスから戻ってくるデータのリアルタイムの処理を行います。共有メモリは、デバイス状態およびコンテキスト情報をJavaコードからC++コードに渡すために使用されます。 JavaコードはPostgreSQLデータベースを使用して状態を保持します。Solaris上のJava/C++用高可用性とスケーラブルなプラットフォーム

私たちはいくつかの非常に厳しいパフォーマンスのボトルネックに遭遇しています。今では、メモリとCPU数を増やすことができます。私たちは共用メモリ設計のために1つの物理的なボックスについています。


ここでは本当に大きな打撃がC++コードによって取られています。 Webインターフェイスは、デバイスを構成するためにかなり軽く使用されます。私たちが本当に苦労しているのは、デバイスが構成された後に提供するデータ量を処理することです。

デバイスから返ってくるデータはすべて、デバイスコンテキストを指す識別子が含まれており、そのデータを参照する必要があります。現在、Java/UIコードによって維持され、C++コードで参照される一連の共有メモリオブジェクトがあり、それがボトルネックです。このアーキテクチャのおかげで、C++のデータ処理を別のマシンに移すことはできません。私たちは、さまざまなデバイスのサブセットを異なるマシンで処理できるようにスケールアウトできる必要がありますが、そのコンテキストルックアップを行う能力を失います。これが私が解決しようとしている問題です。つまり、他のボックスにリアルタイムのデータ処理を提供しながら、デバイスコンテキストを依然として参照することができます。

私たちは、デバイス自体で使用されているプロトコルを制御できないため、状況が変わる可能性はありません。


我々はクラスタに複数のマシンを追加することにより、スケールアウトできるようにするには、このから離れて移動する必要が知っている、と私たちはこれをやる正確にどのようにワークアウトの初期段階にいますよ。

現在、私はJavaコードをスケールアウトする方法としてTerracottaを検討していますが、C++をスケールアウトしてマッチさせる方法はありません。

パフォーマンスのスケーリングだけでなく、高可用性も考慮する必要があります。アプリケーションはほぼ100%ではなくコスト効率の良いものである必要がありますが、マシンの停止から生き残るためには合理的な作業が必要です。

私が与えられた仕事を引き受けなければならない場合、あなたは何をしますか?

EDIT:@johnのチャンネルで提供されているデータに基づいて、私はGigaSpacesとGemstoneの両方を見ています。 Oracle CoherenceとIBM ObjectGridはJavaのみのようです。

答えて

5

私が最初にやることは、データフローをマッピングし、ボトルネックがどこにあるかを正確に理解しようとするシステムのモデルを構築することです。あなたのシステムをpipelineとしてモデル化することができれば、絶えずパフォーマンスを向上させ、ボトルネックを解消するために、制約理論を使用することができます(ほとんどの文献はビジネスプロセスを最適化することです)。

次は、システムのパフォーマンスを正確に表すハードな経験的データを収集します。測定できないものを管理することができないというのはまったく陳腐なものですが、私は多くの人々が愚痴に基づいてソフトウェアシステムを最適化しようとしており、悲惨に失敗するのを見ました。

次に、私はPareto Principle (80/20 rule)を使用して、最大の利益を生む少数のものを選択し、それらにのみ集中します。

Javaアプリケーションを水平方向に拡大するには、Oracle Coherenceを広く使用しました。一部のユーザーは非常に高価なdistributed hashtableと却下しますが、機能はそれよりも豊富であり、たとえば、キャッシュ内のデータに直接アクセスすることができます(C++ code)。

Javaコードを水平方向に拡大縮小する他の方法は、Giga Spaces,IBM Object GridまたはGemstone Gemfireです。

あなたのC++コードがステートレスであり、番号の処理に純粋に使用されている場合は、使用しているすべての言語のバインディングを持つICE Gridを使用してプロセスを配布することができます。

+0

ここには優れたリンクがいくつかあります。ありがとう。私はいくつかの読書を持っている。 – Andrew

1

横横に拡大縮小する必要があります。 message queueのようなものは、フロントエンドとクランチングの間のバックエンドになる可能性があります。

1

アンドリュー(パイプラインなどとしてモデリングすることに加えて)、測定することが重要です。あなたはコードの上でプロファイラを実行し、ほとんどの時間が費やされている場所のメトリックを得ましたか?

データベースコードの頻度はどのくらいですか?あなたは現時点でキャッシングを見ていますか?私はあなたがDbをスピードアップするためにデータ上のインデックスなどを見たとしますか?

フロントエンドにはどの程度のトラフィックがありますか?あなたはウェブページをキャッシュしていますか? (JMSタイプのAPIを使用してコンポーネント間の通信を行うことはあまり難しくありません。次に、Webページコンポーネントを1つのマシン(またはそれ以上)に配置してから、別のマシンに統合コードプロダクトには通常ネイティブなC++ APIがあります。つまり、ActiveMQが気になりますが)Web(JSP?)、C++、Database opsにどれくらいの時間があるかを知るのに本当に役立ちます。

データベースにビジネスデータが格納されているか、またはJavaとC++の間でデータをやりとりするために使用されていますか?あなたはJNIではない共有のmemを使っていると言っていますか?現在どのレベルのマルチスレッドがAPPに存在していますか?コードを本質的に非同期であると記述しますか?

Solarisコードと保守する必要のあるデバイス(つまり、すべてのデバイスをC++コードで登録するか、または指定できるか)とは物理的な関係がありますか。すなわち、フロントエンドにWebロードバランサを設置し、今日2台のマシンを置く場合は、どのデバイスをフロントボックスまたは事前に初期化されたボックスで管理するかという関係がありますか?

どのようなHA要件がありますか?すなわち、ちょうど状態情報?セッションデータをクラスタリングすることで、HAをWeb層だけで実行できますか?

DBは別のマシンで実行されていますか?

DBの大きさはどれくらいですか?あなたはあなたの質問を最適化しましたか?明示的な内部/外部結合を使用して試してみると、ネストされたサブクエリ(sometmes)と比べて時には役立ちます。 (再びSQLの統計を見る)。

関連する問題