ワークユニットをクライアントに配布するためにデータベースを管理する Java アプリケーションが必要です。事実上、これはグリッド アプリケーションです。データベースにはクライアントの入力パラメータが入力され、そのすべてのタプルを要求したクライアントに配布する必要があります。クライアントが結果を送信した後、サーバーはそれに応じてデータベースを変更します (たとえば、タプルを計算済みとしてマークするなど)。
ここで、タプルで満たされたデータベース (SQLite または MySQL) があり、クライアントが入力タプルのグループを要求したとします。ワークユニットのグループを一意のクライアントに排他的に送信したいので、それらをマークする必要があります。 「すでに別のクライアントからリクエストされています」。最初の (たとえば 5 つの) クエリのデータベースをクエリし、その間に別のクライアントが同じ要求を行う場合 (マルチスレッド サーバー アーキテクチャで、同期なしで) 両方のクライアントが同じ作業単位を受け取る可能性があると思います.
解決策は次のようになると想像しました:
1)シングルスレッドサーバーアーキテクチャを作成します( ServerSocket.accept() は、以前のクライアントリクエストが処理された後にのみ再度呼び出されるため、サーバーは一度にクライアントのみによって効果的にアクセスされます)
2 )マルチスレッドアーキテクチャでは、クエリとタプルロック操作を同期させて、一種の原子性を取得します(データベース上で操作を効果的にシリアル化します)
3)データベースサーバー(またはファイル、 SQLite の場合)、しかし、この場合、実際にどうなるかわからないため、助けが必要です...
ただし、私の問題を理解していただければ幸いです。ワークユニットを分散する seti@home と非常に似ていますが、多数のクライアントへのすべての分散ユニットの交差は (理論的には) null です。私の非機能的なニーズは、言語が Java であり、そのデータベースが SQLite または MySQL であることです。