Как эффективно получать данные из очереди Kestrel

По некоторым причинам мы планируем использовать очередь kestrel в нашем проекте. Мы делаем несколько демонов, основная проблема в том, как извлечь данные из очереди с низкой загрузкой процессора и эффективно. Способ, которым мы реализовали выборку, заключается в том, что если нам не удалось извлечь данные из очереди более 5 раз, мы засыпаем поток на 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());
            }

Есть ли другой хороший способ сделать это? На мой взгляд, идеальным является то, что очередь может заметить работнику, что мы получили данные и получить их.

3 ответа

См. Раздел "Блокировка выборок" по адресу http://robey.lag.net/2008/11/27/scarling-to-kestrel.html

Блокировка чтения описана здесь, в разделе "Команды Memcache": https://github.com/robey/kestrel/blob/master/docs/guide.md

Вы можете добавить флаги опций в команду get, разделив их косыми чертами, чтобы получить элемент из очереди "jobs", ожидая до одной секунды:

get jobs/t=1000

Если в течение одной секунды в очереди ничего не появится, вы получите такой же пустой ответ, всего на одну секунду позже, чем сейчас.:)

При настройке важно настроить время ожидания ответа. Если вы используете блокирующее чтение со временем ожидания, равным одной секунде, но время ожидания ответа вашей клиентской библиотеки составляет 500 миллисекунд, библиотека отключится от сервера до того, как будет завершено блокирующее чтение. Поэтому убедитесь, что время ожидания ответа превышает время ожидания, которое вы используете в запросе на чтение.

Вам нужно использовать блокировку get. Я не смог отследить документы по API, но нашел статью, в которой говорилось, что это возможно в kestrel.

Другие вопросы по тегам