КрасДайджест.ру: Обновление новостных лент

Механизм обновления данных прошел уже четыре ревизии. Три из них было связано с растущим объемом данных.

Самый первый вариант — однопоточный, с использованием только стандартных полей rss/atom. Никаких тебе ‘yandex:full-text’. Но работало с разными кодировками и «из коробки». Когда начали попадаться сайты-слоупоки с медленной отдачей, не успевало отработать за 10 минут. Начал думать.

Придумал запускать в несколько потоков. Экспериментально установил, что хватает 5 потоков. Некоторые забиваются слоупоками и теми rss-лентами, у которых не прямые ссылки на материалы (например у feedburner’a). Мне-то нужны чистые ссылочки с привязкой к регионам (об этом, пожалуй, я напишу как-нибудь отдельно). И все было бы хорошо, но часто в description пишут совсем мало, а многое остается в необрабатываемом ‘yandex:full-text’. Начал думать.

Нашел gem, который позволяет добавлять произвольные теги у rss-лент, но он плохо работал с кодировками, отличными от utf-8. Пришлось приводить ленту принудительно в юникод, а после скармливать библиотеке. Накладных расходов стало больше, но заработало. Когда количество источников начало приближаться к 350, то и этот вариант начал захлебываться. К этому времени я переехал на виртуальный сервер, предоставленный NeoCommunications по программе поддержки стартапов — он пошустрей, чем домашний комп, на котором все это работало. Начал думать.

И вернулся к первому варианту — однопоточный, но с возможностью параллельного запуска на разных машинах. Для этого добавил таблицу статусов обновления, а за работой парсеров можно понаблюдать на странице статуса обновления. Как только промежуток между обновлениями приблизится к 10 минутам, можно будет добавить еще один сервер (сейчас их три).

Кроме парсера самих новостных лент, есть еще сервис сбора скриншотов страниц и, собственно, сервис обновления счетчиков из соцсетей (для новостей разной свежести запускаются с разными интервалами). Они как-то сразу устоялись и работают в однопоточном режиме, запускаясь по cron’у.

Автор: Евгений Лисовский

Блогер, сисадмин, исследователь.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *