Обработка очередей


1 0

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

Допустим, что нужно отправить пользователю письмо, но крупные сайты создают тысячи писем в час и отсылать их на каждый запрос будет убийством сервера и времени. Пользователь не хочет ждать, когда мы реально соединимся с SMTP сервером и отправим ему или кому-то еще письмо, для него важнее сразу получить ответ от сервера. Вот именно это мы и делаем.  

Когда нужно отправить письмо, то мы только сохраняем в базе маркер, что пользователь хочет что-то отправить и тут же отвечаем ему, что мы все поняли и все сервера Америки уже работают над доставкой сообщения.

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

1. Сгенерировать новый уникальный идентификатор 

2. Запустить запрос, который обновит поле маркера этим идентификатором у N строчек, где маркер пустой. Этим работа говорит другим, что я берусь отправить эти письма и остальные процессы, которые тоже занимаются доставкой почты не будут трогать эти записи. Так мы справляется с многопоточностью. 

3. Запускается запрос на выборку этих строк и отправку.  

4. Если письма ушли нормально,то строки удаляются, а точнее перемещаются в архив, а если произошла любая нештатная ситуация, то удаляется маркер и время (еще одна колонка в таблице) устанавливается на 20 минут вперед. Это время говорит серверу, когда нужно попробовать еще раз.  

В двух словах все выглядит так. В реальности немного сложнее, но идея достаточно простая. 

Вот так вот просто и пока надежно обрабатываются очереди в несколько потоков одновременнено. А я люблю, когда что-то реализовано просто. 


Понравилось? Кликни Лайк, чтобы я знал, какой контент более интересен читателям. Заметку пока еще никто не лайкал и ты можешь быть первым


Комментарии

Анатолий

11 Июля 2013

Наверное так побыстрее будет, чем i/o в бд.
http://www.vr-online.ru/blog/nodejs-redis-v-ochered-8615


Добавить Комментарий

Еще что-нибудь

Хотите найти еще что-то интересное почитать? Можно попробовать отфильтровать заметки на блоге по категориям.

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне