Пишем высоконагруженную систему по принципам Reactive Programming Архитектуры
Тезисы
Система, на примере которой я хочу построить свой доклад, это система открутки контекстной рекламы. Она занимается ротацией объявлений рекламодателей, подсчетом показов и кликов по объявлениям. Входной поток данных - около 10 тысяч сообщений в секунду. Это клики, показы и прочие действия пользователей. На основании этого потока мы балансируем объявления рекламодателей, сообщаем об этом продуктам и считаем стоимость услуг.
Система открутки рекламы это центральная бизнес-система компании. Изначально понятно, что она будет высоконагруженной. Имея опыт реактивного программирования, я решил его использовать в этой системе.
Реактивное программирование (http://www.reactivemanifesto.org/) это:
— реакция на действия пользователей
— реакция на отказы
— реакция на нагрузку
— событийность
Мы взяли фреймворк Akka (http://akka.io/), которая реализует модель Акторов (http://en.wikipedia.org/wiki/Actor_model и привет из мира Erlang), который хорошо ложится на принципы реактивного программирования. Событийность реализуется за счёт сообщений. Акторы не знают друг о друге и могут находится на разных серверах (location transparency), это про нагрузки. У Актора есть супервизор, которые следит за актором и реагирует на его поломку.
Получается, что мы имеем распределенную систему с простым механизмом реакции на отказы подсистем и нагрузку, которая хорошо масштабируется.
Сейчас на бою система работает на следующем стеке технологий: Scala, Akka, Spray, PostgreSQL, Nginx, Hadoop, Spark и Chef.