beldmit: (Программизм)
Dmitry Belyavskiy ([personal profile] beldmit) wrote2009-04-28 10:14 am

Специально для [livejournal.com profile] staranchenko

Серега, тебе будет интересно - речь про обработу очереди. И Богуку покажу.

Раз: http://yakov-sirotkin.livejournal.com/103083.html

Два: http://dmih.livejournal.com/429785.html

Три (по наводке из предыдущей): http://dklab.ru/chicken/nablas/53.html

Кстати, коллеги - IT-шники, [livejournal.com profile] dmih рекомендую всячески, очень здравый подход.

[identity profile] ask-ripe.livejournal.com 2009-04-28 11:32 am (UTC)(link)
дима, а давай я как-нибудь к вам заеду и расскажу почему все трое (ок, только яков и дмих) ахтунги...
gor

[identity profile] beldmit.livejournal.com 2009-04-28 11:43 am (UTC)(link)
Ну давай...

[identity profile] staranchenko.livejournal.com 2009-04-28 03:31 pm (UTC)(link)
По поводу первого пункта. Я не очень понял автора, если честно. :-) У меня это делается так: выбираем N первых заданий, соответствующих критериям (порядок создания, приоритет, отсутствие зависимостей, задание не взято в обработку и пр.), пробегаем по ним циклом и пытаемся заблокировать одно из них, если получилось - прописываем, что взяли задание в обработку (в случае PostgreSQL это PID + дата старта backend-процесса PostgreSQL) и возвращаем заблокированное задание. Соответственно, критерий "взято в обработку" реализован как "существует процесс с таким PID и датой старта в момент выборки". При успешном выполнении задание удаляется, в случае неуспеха откладывается на какое-то время. Такой подход дает возможность брать задания в несколько потоков, исключить выполнения задания дважды и даже не иметь зависших локов при падении серверных процессов.

По поводу второго и третьего пунктов. Такой подход применим только для примитивных систем. Зависимости между заданиями, например, там невозможны.