私は現在、dijkstra/a-star アルゴリズムに基づく検索アルゴリズムを本番システムに移行するプロジェクトに携わっています。基本的に、アルゴリズムはリクエストを受け取り、最適なソリューションが見つかるまで検索を開始します。これには通常数秒かかります。問題は、アルゴリズムのプロトタイプ バージョンが、検索中に大量のメモリを消費するJDKプライオリティ キュー(基本的にはバイナリ ヒープ) に依存していることです。したがって、大きな問題の 1 つは、複数の要求を同時に処理する実稼働システムにアルゴリズムを配置する場合、システムのスケーラビリティをどのように処理するかということです。私たちはそれを行うための最良の選択肢を見つけようとしています。私たちの頭の中を飛んでいるアイデアは次のとおりです。
最も簡単な方法は、リクエストを受信するたびにアルゴリズムの新しいインスタンスを作成することですが、問題を解決する効率的な方法とは思えません (インスタンスごとに大量の RAM が必要になります)。
キューのサイズが大きすぎる場合は、ある種の永続的で効率的なストア/データベースを使用して、キューの要素の一部をそこに移動します。これにより、メモリの問題を軽減できますが、メモリ内キュー内の要素とストア内の要素の間の順序を維持するなど、新しい問題が発生します。
キューを処理するタスクを Hazelcast などの大きなフレームワークに委任します。アルゴリズムの各インスタンスは、hazelcast で分散キューを使用できます。問題は、Hazelcast にはソートされたキューがないため、キューの外側からキューの順序を明示的に処理する必要があることです。これは大きなパフォーマンスの問題です。
フレームワークはこの種の問題用に設計されていませんが、ActiveMQ を使用するアイデアも検討しています。ActiveMQ の優先度キューは、 9 つの異なる優先度しか管理しません。これは、フロート値 (無限の優先度) に基づいてキュー内の要素を並べ替えるため、この問題には十分ではありません。
このアーキテクチャ設計の問題で、私たちは完全に迷っています。どんなアドバイスでも大歓迎です。