Главное Свежее Вакансии Образование
Выбор редакции:
3 058 14 В избр. Сохранено
Авторизуйтесь
Вход с паролем

Как устроен Relap.io — сервис, который выдает 30 миллиардов рекомендаций в месяц

Relap.io крупнейшая рекомендательная платформа в Европе и Азии. В будние дни Relap.io обслуживает 15 млн уников и выдаёт 30 миллиардов рекомендаций в месяц. Рассказываем, как устроена архитектура сервиса.

b_56c8507c09280.jpg

Мы запустили рекомендательный B2B-сервис Relap.io полтора года назад. Он облегчает жизнь редакции и читателям СМИ.

b_56c72f3f8c06f.jpg

Зачем нужен Relap.io

В зависимости от поведения пользователя мы подбираем статьи, которые будут ему интересны. Выглядит это как блок «Читать также» или «Вам будет интересно»:

Сейчас сервисом пользуются РИА Новости, AdMe, COUB, TJournal, Лайфхакер и другие медиа. ВиджетыRelap.io установлены на более чем 1000 сайтов. 50 из них — миллионники (1 млн и более уникальных посетителей в сутки).

Relap.io начался с простенькой беты. Мы взяли рекомендательные алгоритмы Surfingbird и адаптировали их для сторонних площадок.

Из чего сделан Relap.io

b_56c72f3fece9f.jpg

Каждую секунду на сервера Relap.io от пользователей поступает 15 000 http-запросов. Из них:10К статика: изображения для виджетов, стили, статический js.5К динамика: сбор сигналов, формирующих обучающее множество и формирование блоков рекомендаций.

Когда мы создавали архитектуру у нас было 2 требования:

  • она должна выдерживать высокие нагрузки;
  • масштабироваться.

Бэкенд — это два сервера с большим количеством памяти и объёмными SSD в RAID1. На них стоит PostgreSQL свежей версии, на одном сервере — мастер, на втором — слейв.

Рабочие лошадки — сервера поскромнее. Они принимают запросы из внешнего мира. На двух из них стоят Nginx-ы, которые балансируются друг с другом просто по DNS. Они раскидывают запросы. Их ловят перловые FCGI-воркеры.

FCGI-приложение построено таким образом, что отказ PostgreSQL не приводит к мгновенному отказу всего сервиса, у нас есть примерно 10 минут на устранение фатальных неисправностей. Даже если автоматическое переключение на реплику не спасло ситуацию.

Эти же сервера выполняют и другие роли — на них крутится бОльшая часть очередей, выполняющих в оффлайне всё, что можно делать в оффлайне; инстансы memcached и Redis, крон-скрипты.

Особняком стоят сервера, которые формируют рекомендациями. Для всех, кроме команды математиков, это более-менее чёрная коробка. Туда FCGI и очереди кидают данные, а они в ответ вставляют в PostgreSQL свежие рекомендации, посчитанные по разным алгоритмам, для каждой активной ссылки в базе. Ключевые слова — Hadoop, Spark, Elasticsearch как сторадж, толстый слой Java.

Коду остаётся только забирать готовое, накладывать некоторое фильтрование. Его мы стараемся делать минимальным и максимум фильтровать на этапе генерации и сортировки.

Всё что можно обвешано кешами. Кеш PostgreSQL в памяти, дисковый кеш, мемкешед или redis, где он удобнее, несколько видов кеширования прямо внутри процесса.

Почему все так?

PostgreSQL — самая полнофункциональная open-source база данных. Предсказуемая, стабильная, популярная. Nginx — куда лучше выдерживает масштабирование нагрузки, чем Apache.

MySQL или Apache более популярны, но нам кажется, что выбирать их для новых проектов можно только на shared-хостинге, где больше ничего нет. Или если вы очень хорошо умеете их готовить и масштабировать.

Выбирать shared-хостинг для нового проекта можно, только если вы заранее знаете, что рост ему не грозит. Тогда технологии стоит выбирать уже по принципу «а людей с какими знаниями я найду дешевле и быстрее всего» — это, скорее всего, люди со знанием PHP, MySQL и Apache. Замкнутый мир проектов на shared-хостингах.

Hadoop взяли потому, что особого опыта ни с одним из подобных решений у команды не было. А это некий стандарт в обработке больших данных. Здесь мы просто шли за всеми.

Ещё нам было нужно отдельное хранилище данных для Hadoop-а — PostgreSQL не подходил. Для этого мы выбрали, как ни странно, Elasticsearch, получив заодно полнотекстовый поиск и возможность строить алгоритмы, его использующие. Впрочем, это оказалось неправильным решением. Он может быстро все индексировать и находить, но не отдавать большие объёмы данных.

В следующей серии расскажем, как мы решали эту проблему.

Где хостится Relap.io

С ростом нагрузки перед нами вставала проблема выбора надёжного хостинг-провайдера. Сейчас мы хостимся на Servers.com. Они достаточно мощные, чтобы выдержать нагрузку 900 000 запросов в минуту. Это не пиковые нагрузки, а нормальное состояние в будние дни.

В прошлом году мы несколько раз меняли датацентр. Сначала был ДЦ Славянский. Там до сих пор хоститсяSurfingbird.ru.

Потом в марте 2015 переехали на Hetzner. Тогда мы выдавали 2К рекомендаций в секунду. При последнем переезде на Servers.com было 6К в секунду. Сейчас 15K.

Интеграция Relap.io на сайт:

Как виджет

Коробочное решение. Пользователь ставит наш код в head страницы, на которой должен быть виджет. Выбирает тип виджета и собирает дизайн во встроенном конструкторе. Формирование рекомендаций и фронтенд полностью происходит на нашей стороне. Так к Relap.io подключено большинство площадок. Например, Лайфхакер.

Через jsonp api

Площадка получает описание нашего api. Мы отдаём большой пакет рекомендаций, а площадка фильтрует их уже на своей стороне и подставляет в дизайн. Интеграция через JSONP API позволяет использовать кастомные элементы: историческое количество просмотров, лайков и любую другую информацию о ссылке. Таким способом к Relap.io подключены, например, AdMe или COUB.

______________________

В последующих статьях мы подробно расскажем о технологиях, алгоритмах машинного обучения и инфраструктуре сервиса. Задавайте вопросы в комментариях — обязательно ответим на них в следующих публикациях.

+8
В избр. Сохранено
Авторизуйтесь
Вход с паролем
Комментарии
Евгений Копылов
"Через jsonp api" - а по какому адресу находится API?
Ответить
Leonard Bot
Виртуальный помощник в мессенджерах
Seva Zhidkov
Мне кажется, это сообщают при интеграции.
Ответить
PushAll
Платформа мгновенных уведомлений.
Олег Карнаухов
Крутой опыт. Было бы интересно почитать больше про техническую часть.
У нас например пока сервер не сильно мощный но начали встречаться проблемы например в том, что 99% времени нагрузки нет. А вот каждые несколько секунд-минут крупные каналы делают рассылку и несколько тысяч запросов на изменение статуса, на загрузку данных, на даже простые клики. Часто бывает с пуша на 1500 человек 200 кликов за первую же секунду. Что генерирует за эту же секунд 100-500 запросов к статике (часто спасает кэш на клиенте) и 800-1000 запросов к API.
Итого часто бывает что на 1000 пушей выходит где то 1500 запросов.

В общем то будем скоро расширяться т.к. нужно в итоге чтобы хотя бы держало около 10к пушей в секунду. Учитывая что не все пушат одновременно - должно хватить на много каналов.
Ответить
vlib.co
Публикация электронных книг для начинающих авторов
Philipp Tkachev
Есть такое понятие - прогрев каша. Т.е. перед отсылкой пуша, ты готовишь страничку с контентом, а потом дергаешь ее, она ложится в кэш и затем отправляешь пуши.
Можешь оптимизировать кэш в nignx https://serversforhackers.com/nginx-caching/
Еще здорово CDN в таких случаях помогает, только ее тоже надо "прогревать", тогда результат будет очень хорошим.
У нас используется Cloudflare на бесплатном тарифе, хотя такого трафика нет. Был раньше другой проект с относительно хорошим трафиком в районе ~50k визитов в сутки, тоже использовали Cloudflare на их базовом тарифе. Вполне хватало.
Ответить
PushAll
Платформа мгновенных уведомлений.
Олег Карнаухов
Это так не работает. У нас пуши по сути индивидуальны для каждого их не подкэшируешь. И статистика для каждого устройства тоже индивидуальна.

Это очень просто обычным сайтам - сгенерил json статичный и отдавай его всем одинаковый.

У нас же нужно будет еще проверять имеет ли пользователь доступ к этому уведомлению и т.д.

Но вообще все это не большая проблема - 5000 пушей в секунду можно и так тянуть. Это 18 миллионов пушей в час.
Вообще 90% нагрузки дает SSL handshake мы не знаем что с ним делать.
Ответить
vlib.co
Публикация электронных книг для начинающих авторов
Philipp Tkachev
Попробуй подключить Cloudflare, а до Cloudflare гнать трафик по http. Тогда SSL'ом будет CDN заниматься, а твой сервер генерить пуши. Немного увеличится время доступа, но зато снизишь нагрузку на сервер.
Ответить
PushAll
Платформа мгновенных уведомлений.
Олег Карнаухов
Интересный вариант. Но все таки время доступа значительно может увеличиться.
Еще мне так кажется, что CloudFlare не особо будет сам рад обрабатывать более 5000 хендшейков в секунду. Дело в том, что в данном случае 90% нагрузки ляжет на него и что то мне подсказывает, что CF с нас за это будет брать деньги.
У него вроде как есть халявные тарифы и т.д. но наверняка они ограниченны.

Например я по логам сегодня посмотрел - за сегодня если брать динамику - около 150 тысяч запросов. И это ещё нет крупных каналов.
При аудитории в 100 тысяч человек получим 0.5-1 млн запросов в сутки. Хотя учитывая виджеты на сайтах - легко под 10 миллионов будет. Собственно цифры сравнимые с теми что в статье и это при 5тикратном росте. (Что собственно реально недавно только был рост в 2 раза за месяц)
Ответить
PushAll
Платформа мгновенных уведомлений.
Олег Карнаухов
А точно. У нас есть сокетпуш где есть веб сокеты. И они поддерживаются у CF только на enterprise тарифе.
Ответить
vlib.co
Публикация электронных книг для начинающих авторов
Philipp Tkachev
В таком случае нужно просто больше фронтов и балансировку через DNS. Ну и для популярных (больше 1000 подписчиков) и часто постящих каналов вводить тарифы за сервис, чтобы было чем за сервера платить.
В принципе можешь рассчитать доставку пуша на устройство и сделать микро-биллинг.
Вроде доставка 1000 пушей стоит 10 руб.
Так делают многие SMS-рассыльщики. У тебя есть бесплатный пакет из 20-30 SMS, а остальные ты докупаешь.
Если добавить к этому всему трекинг того, что с устройств открывают ссылку, то можно динамически оптимизировать доставку пушей только активным клиентам.
Ответить
PushAll
Платформа мгновенных уведомлений.
Олег Карнаухов
Так не :) у нас одно из главных новых правил - пуши для всех безлимитны.
Дело в том что за счет платформы это даже выгоднее.
Объясняю: в среднем на 1000 новых пользователей набирается несколько каналов на платном тарифе ( на нем доп функции есть ) обычно 2-3 таких. Иногда 0 сейчас. Если точнее - сейчас на 20к пользователей есть 14 платящих каналов, при этом примерно столько же по деньгам идет плюс пожертвования. Монетизация нормально мы запустили и о ней говорили только с 15к пользователей, поэтому можно считать что где то с 5к вышло 14 каналов - это где то 6к прибыли сейчас.(3000 с каналов + где то столько же падает пожертвований) мы отправляем в сутки где то 100к пушей в среднем. За месяц 3 миллиона. - это 2 рубля за 1000 пушей :)

При этом платные тарифы берут и те кто отправляют по 50 пушей в сутки и те кто их по 1000 шлют и т.д. это не зависит.
Но вот что получается по моим расчетам: крупный ресурс если приводит 10к человек, то я должен с среднем с них получить 30-50 каналов. Если брать 40 - это 8к оплата ежемесячная + 2-7к думаю пожертвования но даже их можно не брать в расчет.
При 10к подписчиках в среднем активных из них остается 70-80%. Т.е. 7к юзеров. Если канеал шлет 1 пуш в сутки всем, то это 217к пушей в месяц. А вот это уже почти 4 копейки за пуш! 40 рублей за 1000.

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


Да маржа тут не такая крутая как у СМС. Но зато все платят столько сколько хотят по сути. Вся идея сохранена и работает. Кто то пользуется бесплатно, кто то взял премиум функции, кто то докинул еще денег т.к. сервис понравился у нас таких много и все счастливы.
Увеличить еще оборот в 20-30 раз и можно будет не искать дополнительные средства на жизнь :)
Ответить
PushAll
Платформа мгновенных уведомлений.
Олег Карнаухов
А и да - слишком хитро тут тоже не обязательно все придумывать. В текущей вариации сервак похоже способен под 2-5к пушей в секунду отправлять. Подкрутить кэши и оптимизацию и будет норм.
5к пушей в секунду это по верхнему расчету 200 рублей в секунду или 17 миллионов рублей в сутки. Даже если сумму в 1000 раз уменьшить выходит 17к в сутки - все равно много и явно хватит на то чтобы добавить на сервер 16 ядер (сейчас 2 работают)
Ответить
Heili
Система управления облачной инфраструктурой
Naor Weissmann
"крупнейшая рекомендательная платформа в Европе и Азии", она крупнее чем outbrain и taboola ?
Ответить
Victoria Filbert
а у меня не получилось подружиться с Релапом. В исходных данных тематический блог на вордпрессе. Сначала в рекомендациях вылазили статьи и рубрики. Рубрики с название "Архив-Имя рубрики", что уже по сути не круто. Подсказали запихать все рубрики в исключений. Окей, но потом в предложениях стали не только статьи, но и варианты типа блоговых "страница 5", "страница 2" и т.д.
При это могли выдаваться одинаковые картинки рядом - одна со статьи, другая со страницы, где тоже есть эта статья.
Я понимаю, частный случай) Но увы, пришлось снести его.
Ответить
Svetlana Starosvitskaya
Виктория, добрый день!

Меня зовут Света, я буду рада помочь Вам с установкой кода Relap. Прошу прощения, что установка Relap прошла чуть сложнее, чем нам хотелось бы. Напишите мне, пожалуйста, на почту свои контактные данные и название портала. Я разберусь, почему возникли сложности и помогу Вам с установкой.

Моя почта: starosvitskaya@surfingbirg.com
Светлана, менеджер по работе с клиентами Relap.io
Ответить
Выбрать файл
Блог проекта
Расскажите историю о создании или развитии проекта, поиске команды, проблемах и решениях
Написать
Личный блог
Продвигайте свои услуги или личный бренд через интересные кейсы и статьи
Написать

Spark использует cookie-файлы. С их помощью мы улучшаем работу нашего сайта и ваше взаимодействие с ним.