私は、ネットワークを介して約1000台の測定デバイスからデータを収集し、そのデータをデータベースに保持するスタンドアロンのJavaアプリケーションを開発しています。デバイスの出力やネットワーク速度が遅いため、データ収集にはデバイスごとに数分かかる場合があります。データ収集は特定の時間枠で行われる必要があるため、並行して作業する必要があります。
私のアプローチは、測定デバイスごとに1つのスレッドを作成し、データをキューに入れ、キューのもう一方の端に1つ以上の他のスレッドを変換して、データを永続化することです。
これは実行可能なアプローチですか?最新のマシンは、その数のスレッドとネットワーク接続を処理できますか?これはどの程度スケーラブルですか。どの時点で複数のマシンで作業する必要がありますか?
また、推奨する並行クラスに関するポインタを教えていただければ幸いです(つまり、どのような種類のキュー、ThreadPoolExecutorなど-私はまだjava.util.concurrentを使用していませんが、本はメールにあります)。
より良いアプローチはありますか?
アップデート:
これまでの回答に感謝します。ここにあなたの何人かによって要求されたより多くの情報があります。
デバイスから受信するデータは、1kb未満のファイルの形式です。通常ははるかに少ないですが、1回の転送で25.000ファイルのようなものを取得する可能性があります。
データ変換はCPUを集中的に使用するものではなく、基本的にファイルを解析してJavaデータ型(ファイルにはunsigned charやunixタイムスタンプなどのcデータ型が含まれます)に変換し、さらにCRC計算を行います。JPAを使用してデータベースに永続化する1つのファイルのコンテンツを含むオブジェクトを作成します(この場合はプレーンJDBCも使用できると思います)。測定ファイルにはデバイスのs/nとタイムスタンプが含まれているため、順序はありません。
後で、特定の基準が満たされたときに何らかのアラートを追加する必要がありますが、これもCPUを集中的に使用するべきではありません。
これまでの回答から、ネットワーク接続を収集し、スレッドの数は問題にならないはずです。
私が疑問に思っているのは、キューを使ったアプローチだけです。別の方法は、データ収集スレッドがDAOメソッドを呼び出してファイルを永続化できるようにすることです。とにかくDAOをスレッドセーフにする必要があると思いますが、時間の大部分がネットワークデータの転送に費やされるため、いくつかのスレッドでも同じように機能すると思います。
また、非同期I/Oとそれを提供するいくつかのフレームワークについても調べます。
もう一度ありがとう、私は少し後で答えを選びます、多分私はもう少し入力を得るでしょう:)