SlideShare a Scribd company logo
Comet-сервер
своими руками


           Макс Лапшин
        Дмитрий Демещук
Эволюция веба
Никакого real-time
Немного real-time
Сплошной real-time
После загрузки,
современная страница
    продолжает
жить своей жизнью.
Возможные варианты
• Периодические запросы на сервер
• Comet:
 • Long polling
 • Websockets
 • Server Sent Events
Периодические запросы


• Много запросов впустую

• Постоянная загрузка

• Задержки
Long-polling
• Не требует немедленного ответа
• Совместим с keepalive
• Моментальное обновление




    • Много одновременных подключений
    • Требуется переподключение
• Постоянное соединение
• Намного быстрее, чем HTTP
• Не везде поддерживаются
• Еще не устоялись как стандарт
Выбор очевиден:*




* часто в сочетании с таймером
• Ruby EventMachine
• Python Twisted
• Node.JS
• Erlang
“Стойте, я же могу просто
сделать это на чистом PHP!”
Практическая реализация распределенного отказоустойчивого Comet сервера на Erlang (Максим Лапшин, Дмитрий Демещук)
Лимит одновременных
   подключений
 • CGI - ~1000-2000
 • Apache - 1000-5000
 • Node.JS - 1000000 (?)
 • Erlang - 2277845
Практическая реализация распределенного отказоустойчивого Comet сервера на Erlang (Максим Лапшин, Дмитрий Демещук)
Хранение
    внутреннего состояния
• MySQL — надежно и очень медленно
• Redis/memcached — ненадежно и медленно
• Внутри VM — быстро и опасно
• Репликация
Внутреннее состояние хочется
       реплицировать
Почти всегда нужна
доставка сообщений
А еще, очень хочется failover
Нет решений для
распределенного комета
      из коробки
 • Redis - master-slave репликация
 • RabbitMQ - нет истории
 • Memcached - нет сообщений
Все приходится делать самим
Нельзя просто так взять




и написать распределенный
       comet-сервер
Почему Erlang
• Феноменальная для веба производительность
• Феноменальная для веба многоядерность
• Распределенность из коробки
• Отказоустойчивость
• Изоляция данных
DPS - distributed pub/sub




 https://github.com/doubleyou/dps
Основные проблемы
Разные профили нагрузки: есть большие
каналы и много маленьких.

Лаг между HTTP-ответом и коннектом к
комету: нужна история.

Нет времени на сохранение в SQL БД.
Хроника событий
1. Реализация pub/sub-механизма
2. Написание тестов
3. Прикручивание веб-сервера
4. Доработка напильником
5. Бенчмарки
6. ...
7. PROFIT!
Первый рабочий pub/sub
   • Распределенный
   • Автоматический failover
   • Написан за 2.5 часа
   • Меньше 300 строк кода
   • Один race condition
   • Один баг-опечатка
dps:subscribe("Channel").

dps:publish("Channel", “Message”).
Тесты
• Выявили race condition
• Очень помогли в дальнейшей разработке
• Отняли несколько часов
• Покрыли примерно 80% кода pub/sub-части
• По размеру сравнимы с кодом
Comet добавляется за час
Прикрутили чатик на JS.

Попутно оказалось, что
кроссдоменный long-poll
  не работает в Safari.
Все круто,
все работает.
Спасибо за внимание
И тут пришли они
Попытка №0:
   подозрительно
хорошие результаты
Мы просто слали сообщения
     и измеряли rps.

     (Redis проиграл
    уже на этом этапе)
Вывод:
бенчмарки должны
 соответствовать
    продакшну
Попытка №1

• Amazon EC2 large instances
• 1000 клиентских подключений
• 1 rps с каждого клиента
На этот раз,
  бенчмарк-процессы
работают приближенно
  к живым клиентам
• 20-140% CPU на одной машине
• Репликация все убила
Структура на одной ноде
Репликация между нодами
Асинхронный publish
   на соседние ноды
 облегчил ситуацию,
но не решил проблему.
Все дело в очередях
Низкое время ответа
может быть вредно
Выходы*
       • Таймаут на клиенте
       • Таймаут на сервере
       • Пользовательские сессии



* лучше - в комбинации
Сессии - почти те же каналы
Производительность
• В памяти хранить минимум истории
• Полную историю хранить на диске, если нужно
• Гарантированное время ответа
Long polling рассчитан
на редкие ответы с сервера.
Как правило, лучше отправить
 один большой HTTP-ответ,
    чем много маленьких.
Попытка №2:
 сервер тянет
    2000 rps,
хоть и с трудом.
Перевели каналы
целиком на ETS.
Попытка №3:
  4000 rps!
Итого
Сервер написан
      и протестирован
за несколько человеко-дней
Неплохая производительность:
  WhatsApp - ~11500 rps
  DPS - ~4000 rps

  Функциональность и железо разные,
  но порядок цифр похожий.
Важные моменты
• Не следует хранить всю историю в памяти
• Следите, какие процессы перегружаются
• Избегайте избыточных сообщений
• Не делайте запросы слишком часто
• Используйте пользовательские сессии
• Старайтесь не гонять лишние данные
Erlang - не серебряная пуля,
но позволяет фокусироваться
           на более
  высокоуровневых задачах
Технические компромиссы
 могут заметно ускорить
     работу сервера.
Тесты и бенчмарки
с лихвой окупили себя.
Вопросы?

Дмитрий Демещук           Макс Лапшин
demeshchuk@gmail.com   max@maxidoors.ru

More Related Content

PDF
Repeatability on DevOps-40 meetup Apr 2014
PDF
Optimization of a big PostgreSQL database
PPTX
Использование асинхронной очереди сообщений в высоконагруженном проекте / Анд...
PDF
Salt and Ansible - Python-based CM systems
PDF
РИФ 2016, Tarantool – кейсы использования
PPTX
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
PDF
2021.09.04 PHP FWDays. Our experience of transferring Laravel microservices t...
PDF
Near-realtime аналитика событий в высоконагруженном проекте
Repeatability on DevOps-40 meetup Apr 2014
Optimization of a big PostgreSQL database
Использование асинхронной очереди сообщений в высоконагруженном проекте / Анд...
Salt and Ansible - Python-based CM systems
РИФ 2016, Tarantool – кейсы использования
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
2021.09.04 PHP FWDays. Our experience of transferring Laravel microservices t...
Near-realtime аналитика событий в высоконагруженном проекте

What's hot (20)

PDF
Twisted Framework - сетевые приложения в Python
PDF
Continuousdelivery
PDF
Высоконагруженная отправка push-уведомлений / Алексей Акулович
PPTX
Организация надежного резервного копирования веб-проекта. Практика и подводны...
PPT
Использование AMQP в основе архитектуры бэкенда для мобильного приложения
PDF
Юрий Насретдинов, Badoo
PDF
ekbpy'2012 - Данила Штань - Распределенное хранилище
PPT
Макс Лапшин - "EventMachine и evented архитектура"
PPTX
101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...
PDF
AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)
PDF
Кэширование данных в web приложениях. Использование memcached / Юрий Красноще...
PDF
Роман Иманкулов-«Быстрые и масштабируемые приложения с Sync API»
PDF
Кругом обман или использование стандартных протоколов для нестандартных вещей
PDF
My talk on administering PostgreSQL
PDF
Golang в avito
PDF
Оптимизация сервера потокового видеовещания (Дмитрий Шатров)
PDF
RootConf 2015
PDF
My talk on LeoFS, Highload++ 2014
PDF
Ровная балансировка нагрузки на фронтенд-кластере
PPTX
Жизнь проекта на production
Twisted Framework - сетевые приложения в Python
Continuousdelivery
Высоконагруженная отправка push-уведомлений / Алексей Акулович
Организация надежного резервного копирования веб-проекта. Практика и подводны...
Использование AMQP в основе архитектуры бэкенда для мобильного приложения
Юрий Насретдинов, Badoo
ekbpy'2012 - Данила Штань - Распределенное хранилище
Макс Лапшин - "EventMachine и evented архитектура"
101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...
AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)
Кэширование данных в web приложениях. Использование memcached / Юрий Красноще...
Роман Иманкулов-«Быстрые и масштабируемые приложения с Sync API»
Кругом обман или использование стандартных протоколов для нестандартных вещей
My talk on administering PostgreSQL
Golang в avito
Оптимизация сервера потокового видеовещания (Дмитрий Шатров)
RootConf 2015
My talk on LeoFS, Highload++ 2014
Ровная балансировка нагрузки на фронтенд-кластере
Жизнь проекта на production
Ad

Similar to Практическая реализация распределенного отказоустойчивого Comet сервера на Erlang (Максим Лапшин, Дмитрий Демещук) (20)

KEY
Erlang&rails
PDF
17 - Web-технологии. Real Time сообщения
PDF
Доставка данных в реальном времени.
PDF
Максим Лапшин. Erlang production
PDF
PDF
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
PPTX
Web осень 2013 лекция 9
PDF
Там, где Rails не справляются
ODP
Smirnov twisted-python
PPTX
Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...
PDF
Рост с нуля до 15000 сообщений в секунду. Мучительный и поучительный / Юрий К...
PDF
YuryByyanov (e-legion) @ CodeCamp2011
PDF
Юрий Буянов «Архитектура Goozy»
PPTX
Отказоустойчивость и производительность
PDF
«Сетевые протоколы для веб разработчика — выжимаем максимум»
ODP
Приёмы разработки высоконагруженных приложений на Twisted (Андрей Смирнов)
PDF
Механика DDoS (Александр Крижановский)
PDF
Реклама со скоростью света (DMP-платформа), Сергей Жемжицкий (Clever Data)
PDF
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
PDF
Реклама со скоростью света. Презентация Сергея Жемжицкого на High Load++ 2014
Erlang&rails
17 - Web-технологии. Real Time сообщения
Доставка данных в реальном времени.
Максим Лапшин. Erlang production
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
Web осень 2013 лекция 9
Там, где Rails не справляются
Smirnov twisted-python
Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...
Рост с нуля до 15000 сообщений в секунду. Мучительный и поучительный / Юрий К...
YuryByyanov (e-legion) @ CodeCamp2011
Юрий Буянов «Архитектура Goozy»
Отказоустойчивость и производительность
«Сетевые протоколы для веб разработчика — выжимаем максимум»
Приёмы разработки высоконагруженных приложений на Twisted (Андрей Смирнов)
Механика DDoS (Александр Крижановский)
Реклама со скоростью света (DMP-платформа), Сергей Жемжицкий (Clever Data)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Реклама со скоростью света. Презентация Сергея Жемжицкого на High Load++ 2014
Ad

More from Ontico (20)

PDF
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
PDF
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
PPTX
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
PDF
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
PDF
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
PDF
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PDF
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
PDF
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
PPTX
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
PPTX
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
PDF
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
PPTX
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
PPTX
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
PDF
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
PPT
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
PPTX
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
PPTX
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
PPTX
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
PDF
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
PDF
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)

Практическая реализация распределенного отказоустойчивого Comet сервера на Erlang (Максим Лапшин, Дмитрий Демещук)