2015-08-11 3 views
2

Я играл с rethinkdb в последнее время и пытался реализовать очередь заданий. Я просто задаюсь вопросом, какова лучшая техника для одновременного захвата рабочих мест из таблицы?Одновременно захватывать задания из rethinkdb

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

Так что мне интересно, как это сделать в rethinkdb? Мой текущий подход - это немного взлома, когда второй процесс перезаписывает первый рабочий процесс и перезагружает его, если он замечает, что old_val не был нулевым. Я бы предпочел, чтобы второй процесс просто терпел неудачу ... или какое-то другое решение, которое заставляет rethinkdb обрабатывать это (если возможно, только с rethinkdb, а не с MQ).

ответ

2

Вы можете атомно обновлять и извлекать документ в одном запросе. Например, в JavaScript:

r.table('foo').filter({status: 'pending'}).limit(1).update(
    r.branch(r.row('status').eq('pending'), {status: 'in progress'}, {}), 
    {returnChanges: true}) 

Этот запрос находит документ, который имеет статус 'pending', изменяет статус 'in progress' и возвращает документ.

+0

Ah r.branch. Отлично. Попробуй это. ти! – noreflow

Смежные вопросы