Шрифт
Разработка API для большого, нагруженного сервиса
Play

Разработка API для большого, нагруженного сервиса

Рассказ о том, что творилось с проектами kolesa.kz и krisha.kz в 2011-2012 годах и что происходит сейчас, как мы создавали с нуля API и впоследствии переезжали на него, как на лету меняли хранилища данных, как боролись с нагрузками и воевали за надежность, расскажу о граблях на которые наступили и как их можно было бы избежать.

Recommended

Recommended

More Related Content

You Might Also Like Related Books Free with a 30 day trial from Scribd Related Audiobooks Free with a 30 day trial from Scribd Разработка API для большого, нагруженного сервиса
  1. 1. Как делать classified'ы? Легко! * *Если у вас есть API ;)
  2. 2. Кто здесь и зачем? ● Никита, один из ведущих разработчиков в «Колёсах» ● В данный момент отвечаю за разработку market.kz, API и по чуть-чуть за kolesa.kz и krisha.kz ● Знаю много страшных слов и программирую на кучке разных языков программирования Расскажу: ● Что было в 2010-2011 ● Что есть сейчас ● Что будет завтра
  3. 3. Экскурс в историю Колёса 2010
  4. 4. Экскурс в историю Крыша 2010
  5. 5. Технологии А что под капотом?
  6. 6. А что под капотом? Технологии
  7. 7. Окружение 2010-2012 ● PHP 5.2 ● MySQL 4.x ● GlusterFS ● 100500 XML-файлов на сетевой файловой системе ● И еще больше фотографий там же ● Поиск через sphinxsearch исключительно в live Технологии
  8. 8. Разработка 2010-2012 ● Пилим фичу для колес ● Если все получилось, Ctrl+C / Ctrl+V на крышу с «небольшими» изменениями ● Вечерами плачем из-за медленной сетевой FS ● Круглые сутки ревем навзрыд из-за отсутствия надежности ● Из-за угла маячат мобильные приложения Технологии
  9. 9. Так жить нельзя! Viva la revolución
  10. 10. Придумываем API ● API един для всех сайтов ● HTTP — это доступно, просто и легко, даже Tcl из «коробки» умеет делать HTTP-запросы ● Отдавать все будем в JSON ● Не RESTFul! ● Весь функционал сайта повторять не нужно ● «Драйверы» для хранилищ API
  11. 11. Драйвер? О чем ты? ● Реализует единые интерфейсы для всех сайтов ● Знает, что такое категории, параметры, пользователи и объявления ● Умеет со всем этим работать (CRUD) ● Реализует специфичные для каждого сайта штуки ● Можно наследовать от других драйверов API. Драйверы
  12. 12. Тот самый первый драйвер ● Пишет и читает данные объявлений из XML-файлов на GlusterFS ● Сохраняет фотографии в GlusterFS ● Знает что и где лежит в MySQL (комментарии, пользователи, антиспам, etc) ● Есть «печенька» — поиск по всем объявлениям через Solr API. Драйверы
  13. 13. Прекращаем писать данные объявлений напрямую в XML API. Переезд
  14. 14. Перестаем дергать GlusterFS при загрузке фотографий API. Переезд
  15. 15. Учим сайт искать объявления не в sphinx'е, а через API API. Переезд
  16. 16. Сначала фотографии ● Жесткие диски сыпятся ● Писать свое надежное и реплицируемое файловое хранилище в blob'ах — затратно (мы пока еще не facebook) API. Надежность У нас есть механизм драйверов и мы можем прозрачно для клиентов делать, что хотим. И где хранить эту кучу файлов?
  17. 17. API. Надежность
  18. 18. OpenStack Swift ● Не сетевая ФС ● Хранилище объектов ● Каждый объект реплицируется минимум на 3 ноды в двух разных датацентрах ● Медленный :( ● Но у нас есть прокси и куча кэшей! :) API. Надежность
  19. 19. А дальше по накатанной: ● Пишем новый драйвер и прозрачно уносим объявления из XML в MongoDB ● Отдаем API партнерам (Smart TV, виджеты на других сайтах) ● Запускаем мобильные приложения ● Пишем драйвер, который все так же прозрачно «объединяет» личные кабинеты пользователей на сайтах ● Запускаем market.kz ● Переезжаем на elasticsearch API. Надежность
  20. 20. Софт ● Для кода — PHP 5.4 ● Для мета-информации — Percona Server 5.5 ● Для объявлений — MongoDB 2.4 ● Для фотографий — OpenStack Swift ● Для поиска — Elasticsearch 1.3 и немножко Solr ● Для логов — Graylog2 ● Для очередей — beanstalkd ● Для кешей — Redis ● Для анализа производительности — BTP (и клиент к нему) API. Сегодня
  21. 21. BTP daemon API. Сегодня
  22. 22. BTP daemon API. Сегодня
  23. 23. Грабли MongoDB ● Работаете из PHP? Сразу запускайте mongos ● Впрочем, когда не из PHP, тоже запускайте ● Не используйте точки в именах полей, иначе можно попрощаться с версией 2.6 ● Не используйте map/reduce или aggregation framework на серверах в продакшене ● Стабильная работа replicaSet'а в двух датацентрах — миф, %username% ● Типы данных — это важно API. Сегодня
  24. 24. Грабли OpenStack Swift ● Репликация медленная ● Запись тоже не блещет скоростью, так что проксируем все через брокер очередей и быстрое хранилище (у нас beanstalkd+redis) ● Чем меньше нод, тем ниже производительность API. Сегодня
  25. 25. Цифры ● 3 MongoDB и 26M объектов объявлений в них ● 330М объектов фотографий, занимающих 25TB в OSS (75TB с учетом реплик) ● 85-195 запросов в секунду от мобильных приложений ● 550-1000 запросов в секунду от сайтов ● 82/164 Мбит/сек трафика ● 8 нод эластика на колесах и 1 на маркете, на крыше все еще Solr ● 20 серверов redis'а для разных кэшей API. Сегодня
  26. 26. Что будет завтра? На самом деле, никто не знает, но попробуем погадать: ● Повышение надежности (может быть и отказ от MongoDB) ● Гео-рапределенность ● Ускорение кода, переезд на HHVM ● Разработка новых интересных фич API. Завтра
  27. 27. Вопросы? Никита Вершинин Ведущий разработчик ТОО «Колёса» Email: endeveit@gmail.com Skype: endeveit Конец
  28. 28. Спасибо!
3 likes Views
  • English
  • Español
  • Português
  • Français
  • Deutsch
Share Clipboard
  • Facebook
  • Twitter
  • LinkedIn
Public clipboards featuring this slide Select another clipboard

Looks like you’ve clipped this slide to already.

You just clipped your first slide!

Wait! Exclusive 60 day trial to the world's largest digital library.

The SlideShare family just got bigger. You now have unlimited* access to books, audiobooks, magazines, and more from Scribd.

📎📎📎📎📎📎📎📎📎📎