Upload
max-lapshin
View
2.676
Download
1
Embed Size (px)
DESCRIPTION
Citation preview
Программы древности
• Написаны на С
• Запутанная логика• Огромная сложность программирования
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
Вопросы?
Макс Лапшин
http://levgem.livejournal.com
Sunday, December 16, 12