Rails, Eventmachine, Erlang
-
Upload
max-lapshin -
Category
Technology
-
view
2.679 -
download
1
description
Transcript of Rails, Eventmachine, Erlang
![Page 2: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/2.jpg)
Программы древности
• Написаны на С
• Запутанная логика• Огромная сложность программирования
Sunday, December 16, 12
![Page 3: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/3.jpg)
Программы древности
• Данные хранятся в памяти• Ручная сериализация на диск• Сложные протоколы IPC
Sunday, December 16, 12
![Page 4: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/4.jpg)
Программы древности
Sunday, December 16, 12
![Page 5: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/5.jpg)
PHP
• Запрос-ответ• Программа живет одну секунду• Share nothing
• Персистентность внешняя• Нулевой контроль за ресурсами• Естественный контроль за overload
Sunday, December 16, 12
![Page 6: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/6.jpg)
PHP
Sunday, December 16, 12
![Page 7: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/7.jpg)
Rails
• Идея PHP в совершенстве
• Лучший инструмент для сайтов• Лучший выбор для Web 1.5
Sunday, December 16, 12
![Page 8: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/8.jpg)
Rails
Sunday, December 16, 12
![Page 9: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/9.jpg)
Web меняется
• Веб становится динамичным• Хватит перезагружать страницу• Ajax в рельсах реализован прекрасно
Sunday, December 16, 12
![Page 10: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/10.jpg)
Web меняется
• Веб становится интерактивным• Страница меняется сама!• Беда!
Sunday, December 16, 12
![Page 11: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/11.jpg)
Web меняется
Sunday, December 16, 12
![Page 12: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/12.jpg)
Интерактивный веб в Rails
• Меняется источник активности• Теперь опять сервер инициирует поток данных• Старые концепции опять не годятся• Comet, WebSockets, ServerSentEvents — рельсы это не могут
Sunday, December 16, 12
![Page 13: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/13.jpg)
Проблемы
• Подключенные клиенты• Возникает стейт в памяти• Проблемы обработки ошибок
• Архитектурная непригодность для решения проблем
Sunday, December 16, 12
![Page 14: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/14.jpg)
Rails
• Организованы жестко по принципу запрос-ответ
• Огромный расход памяти на каждого клиента• Один запрос — один инстанс
• Только для коротких запросов
Sunday, December 16, 12
![Page 15: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/15.jpg)
Типичная архитектураonline-игры на Rails
• Rails
• Comet сервер
• СУБД• Сотни лишних запросов к БД• Постоянная (де)сериализация и синхронизация
Sunday, December 16, 12
![Page 16: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/16.jpg)
Fail!
Sunday, December 16, 12
![Page 17: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/17.jpg)
Eventmachine
• Решает проблемы с подключением клиентов
• Держит стейт в памяти• В сотни раз сокращает трафик к БД
Sunday, December 16, 12
![Page 18: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/18.jpg)
Online игра наEventmachine
• Стейт игры держится в памяти
• Пользователи подключаются к одному серверу• Команды передаются внутри Ruby VM
• Запись в БД только из игры
Sunday, December 16, 12
![Page 19: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/19.jpg)
Eventmachine
• Сохраняется вся экосистема Rails
• Можно прибить гвоздями асинхронную БД
• Расшаренный код с Rails-приложением
Sunday, December 16, 12
![Page 20: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/20.jpg)
Win?!
Sunday, December 16, 12
![Page 21: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/21.jpg)
Eventmachine
• Страдает реализация (нелепые баги)• Callbacks hell
• Как жить с ошибками?• Учет ресурсов• Контроль перегрузки• Репликация и failover
Sunday, December 16, 12
![Page 22: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/22.jpg)
Callbacks
Sunday, December 16, 12
![Page 23: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/23.jpg)
Fibers
• Спасают• Глючат• Но спасают• Ещё сложнее, чем коллбеки
Sunday, December 16, 12
![Page 24: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/24.jpg)
Обработка ошибок
• Ошибки происходят• Баги в коде• Неожиданные входные данные• Все ошибки не убрать
Sunday, December 16, 12
![Page 25: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/25.jpg)
Обработка ошибок
• Как обрабатывать?• Как не повалить весь сервер?• Какие данные разрушаются от одной ошибки?• Как не превратить код в сплошную обработку ошибок?
Sunday, December 16, 12
![Page 26: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/26.jpg)
Обработка ошибок
• В Ruby ошибка привязана к потоку выполнения
• Объекты живут отдельно от потоков
• Это ключевая проблема почти для всех языков• Надо связывать объекты и ошибки руками, делая новые ошибки
Sunday, December 16, 12
![Page 27: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/27.jpg)
Утечки памяти
• В Ruby сотни утечек
• Данные не группируются по объектам предметной области
• Утекла, так утекла. Ребутнем потом.
Sunday, December 16, 12
![Page 28: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/28.jpg)
Fail!
Sunday, December 16, 12
![Page 29: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/29.jpg)
Контроль за нагрузкой
• Как не дать сервису упасть под нагрузкой?• Как правильно отказать новым клиентам?
• Как не навредить старым клиентам?
Sunday, December 16, 12
![Page 30: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/30.jpg)
Контроль за нагрузкой
Sunday, December 16, 12
![Page 31: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/31.jpg)
Контроль за нагрузкой
• Бесконтрольно принимаем клиентов
• Начинаем тормозить всех
• Все получают таймаут от фронт-прокси, делают retry
• В системе удваивается количество работы
Sunday, December 16, 12
![Page 32: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/32.jpg)
Контроль за нагрузкой
Sunday, December 16, 12
![Page 33: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/33.jpg)
Контроль за нагрузкой
• Требуется backpush в каждом компоненте системы
• Важно не дать затыку пролезть вглубь системы• Для этого нужен адекватный контроль загрузки• Торможение клиента и отказ на ранней стадии• Требуется удобная сборка данных по состоянию клиентов
Sunday, December 16, 12
![Page 34: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/34.jpg)
Репликация и failover
• У вас только один Comet-сервер?
• Как пережить его падение?• Репликация по сети — только руками.
Sunday, December 16, 12
![Page 35: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/35.jpg)
Fail!
Sunday, December 16, 12
![Page 36: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/36.jpg)
Erlang
• Построен вокруг изоляции ошибок• Обработка клиентов строго изолирована и группирована• Все ресурсы строго разграничены
• Обработка клиентов прогнозируема• Прозрачная сетевая кластеризация
Sunday, December 16, 12
![Page 37: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/37.jpg)
Процессы в Erlang
• Вся логика изолирована в независимых процессах• Коммуникация только обменом сообщений
• Данные только внутри процессов• Их могут быть миллионы
Sunday, December 16, 12
![Page 38: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/38.jpg)
Процессы в Erlang
• Процессы чертовски удобны!
• Ими проще моделировать предметную область
• Они совпадают с теми квадратиками на флипчарте• Проще проектировать в таких терминах
Sunday, December 16, 12
![Page 39: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/39.jpg)
Ошибки
• Любая ошибка привязана к процессу• Самое частое поведение — упасть процессу по ошибке
• Не тратишь время на обработку ошибок• Система устойчива к нерегулярным сбоям
Sunday, December 16, 12
![Page 40: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/40.jpg)
Ресурсы
• Все ресурсы строго изолированы
• Со смертью процесса всё освобождается, включая файлы и сокеты
• Консоль прям внутри работающей системы
• Элементарный поиск потребителя памяти• Утечки — вообще не проблема
Sunday, December 16, 12
![Page 41: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/41.jpg)
Ресурсы
• Год аптайма — не проблема
Sunday, December 16, 12
![Page 42: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/42.jpg)
Контроль нагрузки
• Синхронные call-ы сообщениями сдерживают нагрузку
• Длина очереди процесса — прекрасная метрика
• Можно интроспектить загрузки процессов• Гораздо проще вовремя отказать
Sunday, December 16, 12
![Page 43: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/43.jpg)
Кластеризация
• Адресация процессов доступна по сети• Механизмы для глобальной адресации процессов в кластере
• Надо быть аккуратным, что бы не положить канал
Sunday, December 16, 12
![Page 44: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/44.jpg)
Win!
Sunday, December 16, 12
![Page 45: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/45.jpg)
Win?
Sunday, December 16, 12
![Page 46: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/46.jpg)
Проблемы Erlang
• Говорливый синтаксис после Ruby
• Неудобная работа со строками (много текста), но есть серьезные фичи для скорости (iolists)
• Нет и не планируется удобного ORM типа ActiveRecord
• Зато можно хранить данные в памяти. Пользуйтесь этим!
Sunday, December 16, 12
![Page 47: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/47.jpg)
С чего начать?
• “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](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/48.jpg)
Что будет полезно?
• ChicagoBoss — веб-фреймворк а-ля Rails 0.5
• https://github.com/doubleyou/dps Распределенный Comet сервер
Sunday, December 16, 12
![Page 49: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/49.jpg)
Итого
• Rails — чудесный инструмент для сайтов
• Rails становится непригоден для интерактивного веба
• Eventmachine хороший мостик в новый веб
• В Eventmachine есть нерешаемые проблемы
• Erlang их чудесно решает. Написали и забыли.
Sunday, December 16, 12
![Page 50: Rails, Eventmachine, Erlang](https://reader033.fdocuments.in/reader033/viewer/2022061211/54923191ac79592f288b46f3/html5/thumbnails/50.jpg)
Вопросы?
Макс Лапшин
http://levgem.livejournal.com
Sunday, December 16, 12