Rails, Eventmachine, Erlang

Preview:

DESCRIPTION

 

Citation preview

Эволюция:Rails, Eventmachine, Erlang

Макс Лапшинmax@maxidoors.ru

Sunday, December 16, 12

Программы древности

• Написаны на С

• Запутанная логика• Огромная сложность программирования

Sunday, December 16, 12

Программы древности

• Данные хранятся в памяти• Ручная сериализация на диск• Сложные протоколы IPC

Sunday, December 16, 12

Программы древности

Sunday, December 16, 12

PHP

• Запрос-ответ• Программа живет одну секунду• Share nothing

• Персистентность внешняя• Нулевой контроль за ресурсами• Естественный контроль за overload

Sunday, December 16, 12

PHP

Sunday, December 16, 12

Rails

• Идея PHP в совершенстве

• Лучший инструмент для сайтов• Лучший выбор для Web 1.5

Sunday, December 16, 12

Rails

Sunday, December 16, 12

Web меняется

• Веб становится динамичным• Хватит перезагружать страницу• Ajax в рельсах реализован прекрасно

Sunday, December 16, 12

Web меняется

• Веб становится интерактивным• Страница меняется сама!• Беда!

Sunday, December 16, 12

Web меняется

Sunday, December 16, 12

Интерактивный веб в Rails

• Меняется источник активности• Теперь опять сервер инициирует поток данных• Старые концепции опять не годятся• Comet, WebSockets, ServerSentEvents — рельсы это не могут

Sunday, December 16, 12

Проблемы

• Подключенные клиенты• Возникает стейт в памяти• Проблемы обработки ошибок

• Архитектурная непригодность для решения проблем

Sunday, December 16, 12

Rails

• Организованы жестко по принципу запрос-ответ

• Огромный расход памяти на каждого клиента• Один запрос — один инстанс

• Только для коротких запросов

Sunday, December 16, 12

Типичная архитектураonline-игры на Rails

• Rails

• Comet сервер

• СУБД• Сотни лишних запросов к БД• Постоянная (де)сериализация и синхронизация

Sunday, December 16, 12

Fail!

Sunday, December 16, 12

Eventmachine

• Решает проблемы с подключением клиентов

• Держит стейт в памяти• В сотни раз сокращает трафик к БД

Sunday, December 16, 12

Online игра наEventmachine

• Стейт игры держится в памяти

• Пользователи подключаются к одному серверу• Команды передаются внутри Ruby VM

• Запись в БД только из игры

Sunday, December 16, 12

Eventmachine

• Сохраняется вся экосистема Rails

• Можно прибить гвоздями асинхронную БД

• Расшаренный код с Rails-приложением

Sunday, December 16, 12

Win?!

Sunday, December 16, 12

Eventmachine

• Страдает реализация (нелепые баги)• Callbacks hell

• Как жить с ошибками?• Учет ресурсов• Контроль перегрузки• Репликация и failover

Sunday, December 16, 12

Callbacks

Sunday, December 16, 12

Fibers

• Спасают• Глючат• Но спасают• Ещё сложнее, чем коллбеки

Sunday, December 16, 12

Обработка ошибок

• Ошибки происходят• Баги в коде• Неожиданные входные данные• Все ошибки не убрать

Sunday, December 16, 12

Обработка ошибок

• Как обрабатывать?• Как не повалить весь сервер?• Какие данные разрушаются от одной ошибки?• Как не превратить код в сплошную обработку ошибок?

Sunday, December 16, 12

Обработка ошибок

• В Ruby ошибка привязана к потоку выполнения

• Объекты живут отдельно от потоков

• Это ключевая проблема почти для всех языков• Надо связывать объекты и ошибки руками, делая новые ошибки

Sunday, December 16, 12

Утечки памяти

• В Ruby сотни утечек

• Данные не группируются по объектам предметной области

• Утекла, так утекла. Ребутнем потом.

Sunday, December 16, 12

Fail!

Sunday, December 16, 12

Контроль за нагрузкой

• Как не дать сервису упасть под нагрузкой?• Как правильно отказать новым клиентам?

• Как не навредить старым клиентам?

Sunday, December 16, 12

Контроль за нагрузкой

Sunday, December 16, 12

Контроль за нагрузкой

• Бесконтрольно принимаем клиентов

• Начинаем тормозить всех

• Все получают таймаут от фронт-прокси, делают retry

• В системе удваивается количество работы

Sunday, December 16, 12

Контроль за нагрузкой

Sunday, December 16, 12

Контроль за нагрузкой

• Требуется backpush в каждом компоненте системы

• Важно не дать затыку пролезть вглубь системы• Для этого нужен адекватный контроль загрузки• Торможение клиента и отказ на ранней стадии• Требуется удобная сборка данных по состоянию клиентов

Sunday, December 16, 12

Репликация и failover

• У вас только один Comet-сервер?

• Как пережить его падение?• Репликация по сети — только руками.

Sunday, December 16, 12

Fail!

Sunday, December 16, 12

Erlang

• Построен вокруг изоляции ошибок• Обработка клиентов строго изолирована и группирована• Все ресурсы строго разграничены

• Обработка клиентов прогнозируема• Прозрачная сетевая кластеризация

Sunday, December 16, 12

Процессы в Erlang

• Вся логика изолирована в независимых процессах• Коммуникация только обменом сообщений

• Данные только внутри процессов• Их могут быть миллионы

Sunday, December 16, 12

Процессы в Erlang

• Процессы чертовски удобны!

• Ими проще моделировать предметную область

• Они совпадают с теми квадратиками на флипчарте• Проще проектировать в таких терминах

Sunday, December 16, 12

Ошибки

• Любая ошибка привязана к процессу• Самое частое поведение — упасть процессу по ошибке

• Не тратишь время на обработку ошибок• Система устойчива к нерегулярным сбоям

Sunday, December 16, 12

Ресурсы

• Все ресурсы строго изолированы

• Со смертью процесса всё освобождается, включая файлы и сокеты

• Консоль прям внутри работающей системы

• Элементарный поиск потребителя памяти• Утечки — вообще не проблема

Sunday, December 16, 12

Ресурсы

• Год аптайма — не проблема

Sunday, December 16, 12

Контроль нагрузки

• Синхронные call-ы сообщениями сдерживают нагрузку

• Длина очереди процесса — прекрасная метрика

• Можно интроспектить загрузки процессов• Гораздо проще вовремя отказать

Sunday, December 16, 12

Кластеризация

• Адресация процессов доступна по сети• Механизмы для глобальной адресации процессов в кластере

• Надо быть аккуратным, что бы не положить канал

Sunday, December 16, 12

Win!

Sunday, December 16, 12

Win?

Sunday, December 16, 12

Проблемы Erlang

• Говорливый синтаксис после Ruby

• Неудобная работа со строками (много текста), но есть серьезные фичи для скорости (iolists)

• Нет и не планируется удобного ORM типа ActiveRecord

• Зато можно хранить данные в памяти. Пользуйтесь этим!

Sunday, December 16, 12

С чего начать?

• “Erlang Programming” by Francesco Cesarini

• http://learnyousomeerlang.com by Fred

• http://groups.google.com/group/erlang-programming

• http://groups.google.com/group/erlang-russian

Sunday, December 16, 12

Что будет полезно?

• ChicagoBoss — веб-фреймворк а-ля Rails 0.5

• https://github.com/doubleyou/dps Распределенный Comet сервер

Sunday, December 16, 12

Итого

• Rails — чудесный инструмент для сайтов

• Rails становится непригоден для интерактивного веба

• Eventmachine хороший мостик в новый веб

• В Eventmachine есть нерешаемые проблемы

• Erlang их чудесно решает. Написали и забыли.

Sunday, December 16, 12

Вопросы?

Макс Лапшин

max@maxidoors.ru

http://levgem.livejournal.com

Sunday, December 16, 12

Recommended