Как эффективно получать данные из очереди Kestrel - PullRequest
1 голос
/ 08 июля 2011

Почему-то мы планируем использовать очередь 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 ]

3 голосов
/ 22 сентября 2011

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

2 голосов
/ 31 октября 2011

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

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

get jobs/t=1000

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

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

0 голосов
/ 27 июля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...