Продолжаю читать просто отличные статьи о высоких нагрузках в журнале Хакер и сегодня прочитал про принцип очередей для отложенной обработки данных. Все написанное в статье абсолютно верно. Я уже говорил, что сайт моего клиента очень большой и сложный, поэтому конечно же мы сталкиваемся с необходимостью отложенной обработки и сегодня я хочу показать, как можно делать очереди.
Допустим, что нужно отправить пользователю письмо, но крупные сайты создают тысячи писем в час и отсылать их на каждый запрос будет убийством сервера и времени. Пользователь не хочет ждать, когда мы реально соединимся с SMTP сервером и отправим ему или кому-то еще письмо, для него важнее сразу получить ответ от сервера. Вот именно это мы и делаем.
Когда нужно отправить письмо, то мы только сохраняем в базе маркер, что пользователь хочет что-то отправить и тут же отвечаем ему, что мы все поняли и все сервера Америки уже работают над доставкой сообщения.
В таблице с очередью есть две колонки: маркер процесса и время. На специальном сервере работает несколько экземпляров приложения, которые и занимаются непосредственной доставкой почты. Каждый из них работает по следующему алгоритму:
1. Сгенерировать новый уникальный идентификатор
2. Запустить запрос, который обновит поле маркера этим идентификатором у N строчек, где маркер пустой. Этим работа говорит другим, что я берусь отправить эти письма и остальные процессы, которые тоже занимаются доставкой почты не будут трогать эти записи. Так мы справляется с многопоточностью.
3. Запускается запрос на выборку этих строк и отправку.
4. Если письма ушли нормально,то строки удаляются, а точнее перемещаются в архив, а если произошла любая нештатная ситуация, то удаляется маркер и время (еще одна колонка в таблице) устанавливается на 20 минут вперед. Это время говорит серверу, когда нужно попробовать еще раз.
В двух словах все выглядит так. В реальности немного сложнее, но идея достаточно простая.
Вот так вот просто и пока надежно обрабатываются очереди в несколько потоков одновременнено. А я люблю, когда что-то реализовано просто.
Понравилось? Кликни Лайк, чтобы я знал, какой контент более интересен читателям. Заметку пока еще никто не лайкал и ты можешь быть первым
Наверное так побыстрее будет, чем i/o в бд.
http://www.vr-online.ru/blog/nodejs-redis-v-ochered-8615
Хотите найти еще что-то интересное почитать? Можно попробовать отфильтровать заметки на блоге по категориям.