Разработка api для большого, нагруженного сервиса
TRANSCRIPT
![Page 1: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/1.jpg)
Как делать classified'ы?Легко! *
*Если у вас есть API ;)
![Page 2: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/2.jpg)
Кто здесь и зачем?
● Никита, один из ведущих разработчиков в «Колёсах» ● В данный момент отвечаю за разработку market.kz, API ипо чуть-чуть за kolesa.kz и krisha.kz
● Знаю много страшных слов и программирую на кучке разных языков программирования
Расскажу: ● Что было в 2010-2011 ● Что есть сейчас ● Что будет завтра
![Page 3: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/3.jpg)
Экскурс в историю
Колёса 2010
![Page 4: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/4.jpg)
Экскурс в историю
Крыша 2010
![Page 5: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/5.jpg)
Технологии
А что под капотом?
![Page 6: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/6.jpg)
А что под капотом?
Технологии
![Page 7: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/7.jpg)
Окружение 2010-2012
● PHP 5.2 ● MySQL 4.x ● GlusterFS ● 100500 XML-файлов на сетевой файловой системе ● И еще больше фотографий там же ● Поиск через sphinxsearch исключительно в live
Технологии
![Page 8: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/8.jpg)
Разработка 2010-2012
● Пилим фичу для колес ● Если все получилось, Ctrl+C / Ctrl+V на крышу с
«небольшими» изменениями ● Вечерами плачем из-за медленной сетевой FS ● Круглые сутки ревем навзрыд из-за отсутствия надежности ● Из-за угла маячат мобильные приложения
Технологии
![Page 9: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/9.jpg)
![Page 10: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/10.jpg)
Так жить нельзя!
Viva la revolución
![Page 11: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/11.jpg)
Придумываем API
● API един для всех сайтов ● HTTP — это доступно, просто и легко, даже Tcl из «коробки» умеет делать HTTP-запросы
● Отдавать все будем в JSON ● Не RESTFul! ● Весь функционал сайта повторять не нужно ● «Драйверы» для хранилищ
API
![Page 12: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/12.jpg)
Драйвер? О чем ты?
● Реализует единые интерфейсы для всех сайтов ● Знает, что такое категории, параметры, пользователи и объявления
● Умеет со всем этим работать (CRUD) ● Реализует специфичные для каждого сайта штуки ● Можно наследовать от других драйверов
API. Драйверы
![Page 13: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/13.jpg)
Тот самый первый драйвер
● Пишет и читает данные объявлений из XML-файлов на GlusterFS
● Сохраняет фотографии в GlusterFS ● Знает что и где лежит в MySQL (комментарии, пользователи, антиспам, etc)
● Есть «печенька» — поиск по всем объявлениям через Solr
API. Драйверы
![Page 14: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/14.jpg)
Прекращаем писать данные объявлений напрямую в XML
API. Переезд
![Page 15: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/15.jpg)
Перестаем дергать GlusterFS при загрузке фотографий
API. Переезд
![Page 16: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/16.jpg)
Учим сайт искать объявления не в sphinx'е, а через API
API. Переезд
![Page 17: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/17.jpg)
![Page 18: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/18.jpg)
Сначала фотографии
● Жесткие диски сыпятся ● Писать свое надежное и реплицируемое файловое хранилище в blob'ах — затратно (мы пока еще не facebook)
API. Надежность
У нас есть механизм драйверов и мы можем прозрачно для клиентов делать, что хотим.
И где хранить эту кучу файлов?
![Page 19: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/19.jpg)
API. Надежность
![Page 20: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/20.jpg)
OpenStack Swift
● Не сетевая ФС ● Хранилище объектов ● Каждый объект реплицируется минимум на 3 ноды в двух разных датацентрах
● Медленный :( ● Но у нас есть прокси и куча кэшей! :)
API. Надежность
![Page 21: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/21.jpg)
А дальше по накатанной:
● Пишем новый драйвер и прозрачно уносим объявления из XML в MongoDB
● Отдаем API партнерам (Smart TV, виджеты на других сайтах) ● Запускаем мобильные приложения ● Пишем драйвер, который все так же прозрачно
«объединяет» личные кабинеты пользователей на сайтах ● Запускаем market.kz ● Переезжаем на elasticsearch
API. Надежность
![Page 22: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/22.jpg)
Софт
● Для кода — PHP 5.4 ● Для мета-информации — Percona Server 5.5 ● Для объявлений — MongoDB 2.4 ● Для фотографий — OpenStack Swift ● Для поиска — Elasticsearch 1.3 и немножко Solr ● Для логов — Graylog2 ● Для очередей — beanstalkd ● Для кешей — Redis ● Для анализа производительности — BTP (и клиент к нему)
API. Сегодня
![Page 23: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/23.jpg)
BTP daemon
API. Сегодня
![Page 24: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/24.jpg)
BTP daemon
API. Сегодня
![Page 25: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/25.jpg)
Грабли MongoDB
● Работаете из PHP? Сразу запускайте mongos ● Впрочем, когда не из PHP, тоже запускайте ● Не используйте точки в именах полей, иначе можно попрощаться с версией 2.6
● Не используйте map/reduce или aggregation framework на серверах в продакшене
● Стабильная работа replicaSet'а в двух датацентрах — миф, %username%
● Типы данных — это важно
API. Сегодня
![Page 26: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/26.jpg)
Грабли OpenStack Swift
● Репликация медленная ● Запись тоже не блещет скоростью, так что проксируем все через брокер очередей и быстрое хранилище (у нас beanstalkd+redis)
● Чем меньше нод, тем ниже производительность
API. Сегодня
![Page 27: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/27.jpg)
Цифры
● 3 MongoDB и 26M объектов объявлений в них ● 330М объектов фотографий, занимающих 25TB в OSS (75TB с учетом реплик)
● 85-195 запросов в секунду от мобильных приложений ● 550-1000 запросов в секунду от сайтов ● 82/164 Мбит/сек трафика ● 8 нод эластика на колесах и 1 на маркете, на крыше все еще
Solr ● 20 серверов redis'а для разных кэшей
API. Сегодня
![Page 28: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/28.jpg)
Что будет завтра?
На самом деле, никто не знает, но попробуем погадать: ● Повышение надежности (может быть и отказ от MongoDB) ● Гео-рапределенность ● Ускорение кода, переезд на HHVM ● Разработка новых интересных фич
API. Завтра
![Page 29: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/29.jpg)
Вопросы?
Никита Вершинин Ведущий разработчик ТОО «Колёса» Email: [email protected] Skype: endeveit
Конец
![Page 30: Разработка API для большого, нагруженного сервиса](https://reader034.vdocuments.site/reader034/viewer/2022042607/55abdace1a28ab52678b4840/html5/thumbnails/30.jpg)
Спасибо!