サーブレット (Tomcat 7.0.X および Ubuntu Linux 内で実行) によって提供される RESTful サービスを提供しています。私はすでに 1 時間あたり約 20,000 件のクエリを取得しており、さらに増えるでしょう。サーブレットはリクエストを受け取り、レスポンスを準備し、MySQL データベース テーブルにレコードを挿入し、レスポンスを配信します。データベースのログは絶対に必須です。最近まで、これらすべてが同時に起こっていました。つまり、Tomcat スレッドが応答を配信する前に、データベース テーブルにレコードを作成する必要がありました。問題は、このログが合計時間の 90% 以上を占めていたことです。さらに悪いことに、データベースが遅くなると、サービスはわずか 20 ミリ秒ではなく、約 10 ~ 15 秒かかりました。
私は最近改善を行いました:各Tomcatスレッドは、「(新しいスレッド(新しい特定のオブジェクト)).start();」を実行する追加のスレッドを作成します これにより、SQL 挿入が非同期的に処理されるため、クライアントへの応答が速くなります。しかし、これらのスレッドは、MySQL の実行が遅くなり、スレッドが増加すると、大量の RAM を消費し、スレッドが数千になると、JVM Tomcat がメモリを使い果たします。
私が必要としているのは、可能な限り多くの HTTP リクエストを受け入れ、それらのすべてを可能な限り高速に (同期ではなく) ログに記録し、MySQL が遅くなって挿入されたときにすべてを高速化し、RAM の使用量を非常に少なくすることです。キューに入れる必要があります。http リクエストの速度がデータベース ログへの挿入速度よりも速い場合、エントリをバッファリングするためのある種のキューが必要だと思います。
私はこれらのアイデアについて考えています:
1- ある種の FIFO キューを自分で作成します。おそらく、これらの Apache コモンズ コレクションのいくつかと、コレクションをポーリングしてデータベース レコードを作成するある種のスレッドを使用します。しかし、どのコレクションを使用すればよいでしょうか? また、CPU を独占しないように、スレッドをポーリングするスレッドをどのようにプログラムすればよいでしょうか? 「Do while (true)....」は CPU サイクルを食い尽くすと思います。そして、それをスレッドセーフにすることについてですか?どうやってするの?自分でやるのは大変な労力だと思います。
2-log4J? 直接使用したことはありませんが、このフレームワークは、データベースと通信する「アペンダー」を作成するように設計されているようです。それはそれを行う方法でしょうか?
3-これを専門とする他のフレームワークを使用していますか?
何を提案しますか?
前もって感謝します!