1

何らかの理由で、プロジェクトで kestrel キューを使用する予定です。主な問題は、CPU 使用率が低く、効果的にキューからデータをフェッチする方法です。フェッチするために実装した方法は、キューからのデータのフェッチに 5 回以上失敗した場合、CPU 使用率を下げるためにスレッドを 100 ミリ秒スリープさせることです。

while (running) {
            try {
                LoginLogQueueEntry data = kestrelQueue.fetch();
                if (null != data && data.isLegal()) {
                    entryCacheList.add(data); //add the data to the local caceh
                    resetStatus();
                } else {
                    failedCount++;
                    //if there is no data in the kestrel and the local cache is not empty, insert the data into mysql database
                    if (failedCount == 1 && !entryCacheList.isEmpty()) {
                        resetStatus();
                        insertLogList(entryCacheList); // insert current data into database
                        entryCacheList.clear(); //empty local cache
                    }

                    if (failedCount >= 5 && entryCacheList.isEmpty()) {
                    //fail 5 times. Sleep current thread. 
                        failedCount = 0;
                        Thread.sleep((sleepTime + MIN_SLEEP_TIME) % MAX_SLEEP_TIME);
                    }
                }
                //Insert 1000 rows once
                if (entryCacheList.size() >= 1000) {
                    insertLogList(entryCacheList);
                    entryCacheList.clear();
                }
            } catch (Exception e) {
                logger.warn(e.getMessage());
            }

他に良い方法はありますか?私が考える完璧な方法は、データを取得してフェッチしたことをキューがワーカーに通知できることです。

4

3 に答える 3

2

ブロック読み取りについては、こちらの「Memcache コマンド」で説明しています: https://github.com/robey/kestrel/blob/master/docs/guide.md

オプション フラグをスラッシュで区切って get コマンドに追加すると、最大 1 秒待機して「ジョブ」キューからアイテムをフェッチできます。

get jobs/t=1000

1 秒以内にキューに何も表示されない場合は、同じ空の応答が返されますが、現在の応答よりもわずか 1 秒遅くなります。:)

これを行うときは、応答タイムアウトを調整することが重要です。タイムアウトが 1 秒のブロッキング読み取りを使用しているが、クライアント ライブラリの応答タイムアウトが 500 ミリ秒である場合、ライブラリはブロッキング読み取りが完了する前にサーバーから切断されます。そのため、応答タイムアウトが読み取り要求で使用しているタイムアウトよりも大きいことを確認してください。

于 2011-10-31T18:01:07.673 に答える
-1

ブロッキング get を使用する必要があります。API ドキュメントを追跡することはできませんでしたが、kestrel で可能であることを示唆する記事を見つけました。

于 2011-07-27T19:37:39.940 に答える