2

私はプログラミングの問題に取り組もうと考えていますが、そのためには高度なプログラミングの概念をたくさん知る必要があると思います。いくつかの理由で、Java でコーディングすることにしました。したがって、提案、ガイダンス、リソースへのポインタ、本、チュートリアル、または関連すると思われる一般的なアドバイスを提供してください.

私の問題の基本的な性質は次のとおりです。

  1. クライアント サーバー アーキテクチャを作成する必要があります。サーバーは複数の同時クライアントをサポートします。クライアントは単純な指示を送信し (サーバーはある種の API を公開し、特定のポートでリスナーを実行する場合があります)、サーバーは指示を実行し、結果をクライアントに送り返します。

  2. サーバーの主な仕事は、与えられた指示に基づいて大量のデータ処理を行うことです。バックエンド データベース/ファイル システムからデータを取得します。データ量は、最大 200GB ~ 700GBまで簡単に急増する可能性があります。通常、データはそこにストリーミングされますが、処理中に大量のデータをメモリ キャッシュに保持する必要がある場合があります (RAM が十分でない場合は、ディスクにページングします)。計算は一般的に本質的に数値集約的です (行列の逆数を取るとしましょう)

  3. サーバーはマルチスレッドを実行できる必要があります(この用語が Java で何を意味するのかわかりませんが、私が望むのは、サーバーがジョブを複数の並列サブプロセスに分散できる必要があるということです)。

  4. サーバー自体は非常に軽量でなければなりません。GUIインターフェイスは必要ありません

  5. 後でHadoopなどの HPC フレームワークと統合できるように設計できれば素晴らしいと思います。

もし私がこれをしなければならないとしたら、どのようなプログラミングを学ばなければならないのでしょうか? ところで、私は OOP について十分に理解しています。データ構造とアルゴリズムにある程度精通しており、基本的な Java を知っています (これまで Java でネットワークまたはマルチスレッド プログラミングを行ったことはありませんが、典型的な OOP の概念、ジェネリック、同等のインターフェイスなどを使用したことがあります。 )。私は基本的にデータベース プログラミングの仕事をしていますが、過去に C、C++、C#、Python もたくさんやったことがあります。

要件と私の経歴を考慮して、提案してください。

  1. このプロジェクトの作業をどのように開始すればよいですか? プロジェクトを設計する方法は何ですか?
  2. 最初にいくつかの基本的な API 定義を作成してから、詳細に取り掛かる必要がありますか?
  3. 特定の設計パターンに従う必要がありますか? それらをどこから学べますか?
  4. Java で学ぶ必要があることは何ですか? どこから学べますか?
  5. メモリ内の巨大なデータを読み取る最良の方法は何ですか? Java nio は良い解決策ですか?
  6. 大量のデータを持つクラスをインスタンス化すると、うまくいきますか? (たとえば、数百万の要素を持つ行列を表す Vector クラスがあり、クラスのコンストラクターがメモリ内の膨大なデータセットを読み取るとします)。それを処理する最良の方法は何ですか?
4

2 に答える 2

1

最初に言いたいのは、あなたの説明によると、サーバー側の言語としてJavaを使用するのはかなり良い状態にあるようです。

選択するクライアントサーバーアーキテクチャの種類は、実際にサービスを提供しているクライアントの種類によって異なります。それらは、典型的なGUIまたはCUIベースのデスクトップクライアントまたはWebクライアントでしょうか。

後者の場合、通常の方法でSpring Frameworkを使用でき、前者の場合は、RestfulWebサービスに対するSpringのサポートをさらに詳しく調べることができます。ソケットまたはTCPベースのネットワークソリューションを使用したり、Javaネットワークを使用したりしないことをお勧めします。

Spring'sRESTful APIは、デスクトップベースのクライアントであっても、ネットワーキングやマルチスレッドなどの非常に優れた抽象化を提供します。デスクトップクライアントの場合、応答としてJSON / XMLを使用できHttpClient、サーバーへの呼び出しにライブラリを使用できます。これは、基盤となるネットワーク関連の非常に優れた抽象化です。

さらに上にあるSpringのデザインパターンは、非常に多くlinearのデータの流れに従います。基本的な設計上の考慮事項の多くは、Spring自体が使用するものDependency InjectionInversion of Controlあり、組み込むのは非常に簡単です。

特定の要件に関連するデザインパターンの詳細な分析についてはJava Design Patterns: A TutorialAddison Wesley出版物と呼ばれる本を読むことをお勧めします。著者はJames W. Cooperです。

API設計についてもう1つ。最初にAPI仕様を作成してから、さらに実装することをお勧めします。

于 2012-10-10T09:56:43.190 に答える
1

クライアントとサーバーが相互に通信する方法を定義する必要があります。最も簡単な方法は、クライアントが多くのコーディングなしで呼び出すことができるRESTサービスを作成することにより、HTTPなどの確立されたプロトコルを使用することです。

HTTPをサポートするほとんどのフレームワークは、異なるスレッドで実行されるいくつかのリスナーを作成します。これにより、箱から出してマルチスレッドを実行できます。

私はSpringControllersを好むかどうかを調べることをお勧めします。春はかなり軽量です。

これらのフレームワークを使用する場合は、それらをすばやく見つけて、コンパイルとパッケージ化のためにアプリケーションに組み込む必要があります。

これについては、Mavenを調べることをお勧めします。それは大きな時間の節約になります。特に、アーキタイプを使用してプロジェクトのフォルダー構造を作成し、依存関係とその依存関係を自動ダウンロードします。

最後に私の知恵の言葉。サービスがシングルトンステートレスサービスであることを確認してください。これは、オブジェクトを1回だけ作成し、各スレッドが同じオブジェクトを使用することを意味します。発生するガベージコレクションははるかに少なくなります。これは、大量のリクエストを処理するときに大きな違いをもたらします。

これらのサービスでは、状態を保持するためにクラスレベルの変数を使用しないように注意してください。これを行うと、異なるスレッドが相互にデータを上書きします。

于 2012-10-10T08:47:49.300 に答える