Разработка API для большого, нагруженного сервиса
-
Upload
itcrowd-almaty -
Category
Internet
-
view
351 -
download
1
Transcript of Разработка API для большого, нагруженного сервиса
Кто здесь и зачем?
● Никита, один из ведущих разработчиков в «Колёсах» ● В данный момент отвечаю за разработку market.kz, API ипо чуть-чуть за kolesa.kz и krisha.kz
● Знаю много страшных слов и программирую на кучке разных языков программирования
Расскажу: ● Что было в 2010-2011 ● Что есть сейчас ● Что будет завтра
Окружение 2010-2012
● PHP 5.2 ● MySQL 4.x ● GlusterFS ● 100500 XML-файлов на сетевой файловой системе ● И еще больше фотографий там же ● Поиск через sphinxsearch исключительно в live
Технологии
Разработка 2010-2012
● Пилим фичу для колес ● Если все получилось, Ctrl+C / Ctrl+V на крышу с
«небольшими» изменениями ● Вечерами плачем из-за медленной сетевой FS ● Круглые сутки ревем навзрыд из-за отсутствия надежности ● Из-за угла маячат мобильные приложения
Технологии
Придумываем API
● API един для всех сайтов ● HTTP — это доступно, просто и легко, даже Tcl из «коробки» умеет делать HTTP-запросы
● Отдавать все будем в JSON ● Не RESTFul! ● Весь функционал сайта повторять не нужно ● «Драйверы» для хранилищ
API
Драйвер? О чем ты?
● Реализует единые интерфейсы для всех сайтов ● Знает, что такое категории, параметры, пользователи и объявления
● Умеет со всем этим работать (CRUD) ● Реализует специфичные для каждого сайта штуки ● Можно наследовать от других драйверов
API. Драйверы
Тот самый первый драйвер
● Пишет и читает данные объявлений из XML-файлов на GlusterFS
● Сохраняет фотографии в GlusterFS ● Знает что и где лежит в MySQL (комментарии, пользователи, антиспам, etc)
● Есть «печенька» — поиск по всем объявлениям через Solr
API. Драйверы
Сначала фотографии
● Жесткие диски сыпятся ● Писать свое надежное и реплицируемое файловое хранилище в blob'ах — затратно (мы пока еще не facebook)
API. Надежность
У нас есть механизм драйверов и мы можем прозрачно для клиентов делать, что хотим.
И где хранить эту кучу файлов?
OpenStack Swift
● Не сетевая ФС ● Хранилище объектов ● Каждый объект реплицируется минимум на 3 ноды в двух разных датацентрах
● Медленный :( ● Но у нас есть прокси и куча кэшей! :)
API. Надежность
А дальше по накатанной:
● Пишем новый драйвер и прозрачно уносим объявления из XML в MongoDB
● Отдаем API партнерам (Smart TV, виджеты на других сайтах) ● Запускаем мобильные приложения ● Пишем драйвер, который все так же прозрачно
«объединяет» личные кабинеты пользователей на сайтах ● Запускаем market.kz ● Переезжаем на elasticsearch
API. Надежность
Софт
● Для кода — PHP 5.4 ● Для мета-информации — Percona Server 5.5 ● Для объявлений — MongoDB 2.4 ● Для фотографий — OpenStack Swift ● Для поиска — Elasticsearch 1.3 и немножко Solr ● Для логов — Graylog2 ● Для очередей — beanstalkd ● Для кешей — Redis ● Для анализа производительности — BTP (и клиент к нему)
API. Сегодня
Грабли MongoDB
● Работаете из PHP? Сразу запускайте mongos ● Впрочем, когда не из PHP, тоже запускайте ● Не используйте точки в именах полей, иначе можно попрощаться с версией 2.6
● Не используйте map/reduce или aggregation framework на серверах в продакшене
● Стабильная работа replicaSet'а в двух датацентрах — миф, %username%
● Типы данных — это важно
API. Сегодня
Грабли OpenStack Swift
● Репликация медленная ● Запись тоже не блещет скоростью, так что проксируем все через брокер очередей и быстрое хранилище (у нас beanstalkd+redis)
● Чем меньше нод, тем ниже производительность
API. Сегодня
Цифры
● 3 MongoDB и 26M объектов объявлений в них ● 330М объектов фотографий, занимающих 25TB в OSS (75TB с учетом реплик)
● 85-195 запросов в секунду от мобильных приложений ● 550-1000 запросов в секунду от сайтов ● 82/164 Мбит/сек трафика ● 8 нод эластика на колесах и 1 на маркете, на крыше все еще
Solr ● 20 серверов redis'а для разных кэшей
API. Сегодня
Что будет завтра?
На самом деле, никто не знает, но попробуем погадать: ● Повышение надежности (может быть и отказ от MongoDB) ● Гео-рапределенность ● Ускорение кода, переезд на HHVM ● Разработка новых интересных фич
API. Завтра
Вопросы?
Никита Вершинин Ведущий разработчик ТОО «Колёса» Email: [email protected] Skype: endeveit
Конец