50
Эволюция: Rails, Eventmachine, Erlang Макс Лапшин [email protected] Sunday, December 16, 12

Rails, Eventmachine, Erlang

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Rails, Eventmachine, Erlang

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

Макс Лапшин[email protected]

Sunday, December 16, 12

Page 2: Rails, Eventmachine, Erlang

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

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

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

Sunday, December 16, 12

Page 3: Rails, Eventmachine, Erlang

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

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

Sunday, December 16, 12

Page 4: Rails, Eventmachine, Erlang

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

Sunday, December 16, 12

Page 5: Rails, Eventmachine, Erlang

PHP

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

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

Sunday, December 16, 12

Page 6: Rails, Eventmachine, Erlang

PHP

Sunday, December 16, 12

Page 7: Rails, Eventmachine, Erlang

Rails

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

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

Sunday, December 16, 12

Page 8: Rails, Eventmachine, Erlang

Rails

Sunday, December 16, 12

Page 9: Rails, Eventmachine, Erlang

Web меняется

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

Sunday, December 16, 12

Page 10: Rails, Eventmachine, Erlang

Web меняется

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

Sunday, December 16, 12

Page 11: Rails, Eventmachine, Erlang

Web меняется

Sunday, December 16, 12

Page 12: Rails, Eventmachine, Erlang

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

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

Sunday, December 16, 12

Page 13: Rails, Eventmachine, Erlang

Проблемы

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

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

Sunday, December 16, 12

Page 14: Rails, Eventmachine, Erlang

Rails

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

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

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

Sunday, December 16, 12

Page 15: Rails, Eventmachine, Erlang

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

• Rails

• Comet сервер

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

Sunday, December 16, 12

Page 16: Rails, Eventmachine, Erlang

Fail!

Sunday, December 16, 12

Page 17: Rails, Eventmachine, Erlang

Eventmachine

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

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

Sunday, December 16, 12

Page 18: Rails, Eventmachine, Erlang

Online игра наEventmachine

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

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

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

Sunday, December 16, 12

Page 19: Rails, Eventmachine, Erlang

Eventmachine

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

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

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

Sunday, December 16, 12

Page 20: Rails, Eventmachine, Erlang

Win?!

Sunday, December 16, 12

Page 21: Rails, Eventmachine, Erlang

Eventmachine

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

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

Sunday, December 16, 12

Page 22: Rails, Eventmachine, Erlang

Callbacks

Sunday, December 16, 12

Page 23: Rails, Eventmachine, Erlang

Fibers

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

Sunday, December 16, 12

Page 24: Rails, Eventmachine, Erlang

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

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

Sunday, December 16, 12

Page 25: Rails, Eventmachine, Erlang

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

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

Sunday, December 16, 12

Page 26: Rails, Eventmachine, Erlang

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

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

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

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

Sunday, December 16, 12

Page 27: Rails, Eventmachine, Erlang

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

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

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

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

Sunday, December 16, 12

Page 28: Rails, Eventmachine, Erlang

Fail!

Sunday, December 16, 12

Page 29: Rails, Eventmachine, Erlang

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

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

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

Sunday, December 16, 12

Page 30: Rails, Eventmachine, Erlang

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

Sunday, December 16, 12

Page 31: Rails, Eventmachine, Erlang

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

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

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

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

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

Sunday, December 16, 12

Page 32: Rails, Eventmachine, Erlang

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

Sunday, December 16, 12

Page 33: Rails, Eventmachine, Erlang

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

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

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

Sunday, December 16, 12

Page 34: Rails, Eventmachine, Erlang

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

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

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

Sunday, December 16, 12

Page 35: Rails, Eventmachine, Erlang

Fail!

Sunday, December 16, 12

Page 36: Rails, Eventmachine, Erlang

Erlang

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

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

Sunday, December 16, 12

Page 37: Rails, Eventmachine, Erlang

Процессы в Erlang

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

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

Sunday, December 16, 12

Page 38: Rails, Eventmachine, Erlang

Процессы в Erlang

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

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

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

Sunday, December 16, 12

Page 39: Rails, Eventmachine, Erlang

Ошибки

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

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

Sunday, December 16, 12

Page 40: Rails, Eventmachine, Erlang

Ресурсы

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

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

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

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

Sunday, December 16, 12

Page 41: Rails, Eventmachine, Erlang

Ресурсы

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

Sunday, December 16, 12

Page 42: Rails, Eventmachine, Erlang

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

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

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

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

Sunday, December 16, 12

Page 43: Rails, Eventmachine, Erlang

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

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

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

Sunday, December 16, 12

Page 44: Rails, Eventmachine, Erlang

Win!

Sunday, December 16, 12

Page 45: Rails, Eventmachine, Erlang

Win?

Sunday, December 16, 12

Page 46: Rails, Eventmachine, Erlang

Проблемы Erlang

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

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

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

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

Sunday, December 16, 12

Page 47: Rails, Eventmachine, Erlang

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

• “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

Page 48: Rails, Eventmachine, Erlang

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

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

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

Sunday, December 16, 12

Page 49: Rails, Eventmachine, Erlang

Итого

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

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

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

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

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

Sunday, December 16, 12

Page 50: Rails, Eventmachine, Erlang

Вопросы?

Макс Лапшин

[email protected]

http://levgem.livejournal.com

Sunday, December 16, 12