Опыт использования erlang в разработке...

57
Опыт использования Erlang в разработке многопользовательской игры. Юра Жлоба aka yzh44yzh

Upload: yuri-zhloba

Post on 12-Jun-2015

1.266 views

Category:

Technology


3 download

DESCRIPTION

Доклад для "IT_Share. GameDev Web"

TRANSCRIPT

Page 1: Опыт использования Erlang в разработке многопользовательской игры

Опыт использования Erlangв разработке многопользовательской игры.

Юра Жлоба aka yzh44yzh

Page 2: Опыт использования Erlang в разработке многопользовательской игры

Многопоточность

Распределенность

Устойчивость к ошибкам

Горячее обновление кода

Кратенько про Erlang

Page 3: Опыт использования Erlang в разработке многопользовательской игры

Кратенько про нас

Page 4: Опыт использования Erlang в разработке многопользовательской игры

Кратенько про проект

Page 5: Опыт использования Erlang в разработке многопользовательской игры

А теперь переходим к сути :)

Многопоточность. Теория и практика.

Распределенность (только теория).

Устойчивость к ошибкам. Теория и практика.

Горячее обновление кода. Теория и практика.

Борьба за качество проекта.

Недостатки Erlang.

Выводы.

Page 6: Опыт использования Erlang в разработке многопользовательской игры

Многопоточность. Теория.

О, это оооочень сложно!

Мютексы там, семафоры всякие, критические секции

“Java Concurrency in Practice”нужно выучить назубок

А иначе страшные dead lock будут преследовать вас в ночных кошмарах

Page 7: Опыт использования Erlang в разработке многопользовательской игры

Многопоточность. Теория.

Многопоточность бывает разная.

Бывает такая, которая простая :)

Page 8: Опыт использования Erlang в разработке многопользовательской игры

Многопоточность. Теория.

Легкие потоки

Эффективные планировщики

Изолированные области памяти

Изолированные сборщики мусора

Обмен сообщениями

Page 9: Опыт использования Erlang в разработке многопользовательской игры

Многопоточность. Практика.

Процессы – кирпичики архитектуры

Сотни и тысячи процессов в одном проекте

Page 10: Опыт использования Erlang в разработке многопользовательской игры

Многопоточность. Практика.

Сходство с ООП:

Инкапсуляция состояния

Публичные и приватные функции

Отправка сообщений вместо вызовов функций

Полиморфизм функций и модулей

Даже конструкторы и деструкторы есть

И даже фабрика :)

Page 11: Опыт использования Erlang в разработке многопользовательской игры

Многопоточность. Практика.

Dead lock, Race condition

Бывают, да. Но они не совсем не страшные.

Page 12: Опыт использования Erlang в разработке многопользовательской игры

Многопоточность. Практика.

Как выглядит эффективный сервересли он написан не на Erlang?

(Ruby, Python, Node.js etc)

Page 13: Опыт использования Erlang в разработке многопользовательской игры

Многопоточность. Практика.

Например, так:

Несколько нод, по одной на каждое ядро

Rabbit MQ, чтобы наладить коммуникацию

Nginx на входе

Redis для in-memory кеширования

Page 14: Опыт использования Erlang в разработке многопользовательской игры

Многопоточность. Практика.

Все это заменяет одна нода на Erlang

Проще в разработке,в развертывании,

в диагностике проблем,в поддержке.

Page 15: Опыт использования Erlang в разработке многопользовательской игры

Распределенность

Решение высокого уровня

Сетевая прозрачность

Просто посылаем сообщение процессу в другой ноде так же, как и процессу в своей ноде

Page 16: Опыт использования Erlang в разработке многопользовательской игры

Распределенность

Безопасность на куках

Доверенная зона, где все процессы и все функции доступны

Page 17: Опыт использования Erlang в разработке многопользовательской игры

Распределенность

Но и собственное решение

с предоставлением внешнего АПИ

не запрещается делать :)

Page 18: Опыт использования Erlang в разработке многопользовательской игры

Устойчивость к ошибкам. Теория.

3 уровня защиты:

Изоляция потоков

Супервайзеры

Распределенность

Page 19: Опыт использования Erlang в разработке многопользовательской игры

Устойчивость к ошибкам. Практика.

Нет волшебной таблетки

От бага в бизнес-логике никакой супервайзер не спасет

Нода не падает, Но отказ в обслуживании ничем не лучше

Page 20: Опыт использования Erlang в разработке многопользовательской игры

Устойчивость к ошибкам. Практика.

Let it crash

или

try/catch, где надо

Page 21: Опыт использования Erlang в разработке многопользовательской игры

Горячее обновление кода. Теория.

Жизнь и смерть Erlang-процесса

Как изменить неизменяемое состояние?

Page 22: Опыт использования Erlang в разработке многопользовательской игры

Горячее обновление кода. Теория.

Бесконечная рекурсия

Хвостовая, без накопления памяти на стеке

Page 23: Опыт использования Erlang в разработке многопользовательской игры

Горячее обновление кода. Теория.

Аргументы функции и все переменные в ней неизменны

А состояние процесса меняется. Чудо :)

Page 24: Опыт использования Erlang в разработке многопользовательской игры

Горячее обновление кода. Теория.

Горячая загрузка модуля меняет код его функций

Но состояние процесса остается прежним

В какой-то момент процесс покидает старую функцию loop, и входит в новую функцию loop

Page 25: Опыт использования Erlang в разработке многопользовательской игры

Горячее обновление кода. Теория.

В простом случае все просто

Но бывают сложные случаи :)

Page 26: Опыт использования Erlang в разработке многопользовательской игры

Горячее обновление кода. Теория.

Изменилась структура данных

Изменилось дерево супервайзеров

Разное время обновления процессов

Page 27: Опыт использования Erlang в разработке многопользовательской игры

Горячее обновление кода. Практика.

Юзаем локально, в ходе разработки

Написал код, загрузил, поглядел как работает

Перезапускать сервер при каждом изменении в коде – лишнее.

Page 28: Опыт использования Erlang в разработке многопользовательской игры

Горячее обновление кода. Практика.

Выкатываем фичу в production

Потому что не хотим рестартовать сервер

Потому что там всегда есть игры, которые прервутся

Page 29: Опыт использования Erlang в разработке многопользовательской игры

Горячее обновление кода. Практика.

Имеем нестабильный production сервер

И пользователей в роли бета-тесторов

(и они не счастливы выполнять эту роль :)

Page 30: Опыт использования Erlang в разработке многопользовательской игры

Горячее обновление кода. Практика.

Отдельный тестовый сервер

Нестабильные изменения выкатываем на него

Page 31: Опыт использования Erlang в разработке многопользовательской игры

Горячее обновление кода. Практика.

Production сервер обновляем редко

Горячее обновление не получается из-за “сложных случаев”

Обновление – это всегда рестарт

Page 32: Опыт использования Erlang в разработке многопользовательской игры

Горячее обновление кода. Практика.

Сохранение состояний игр перед рестартом

Восстановление после рестарта

Page 33: Опыт использования Erlang в разработке многопользовательской игры

Горячее обновление кода. Практика.

И что теперь?

Горячее обновление не нужно?

Page 34: Опыт использования Erlang в разработке многопользовательской игры

Горячее обновление кода. Практика.

Ну можно выкатывать быстрые,не опасные фичи, мелкие фиксы

Если не хочется ждать 2 недели до конца спринта.

Page 35: Опыт использования Erlang в разработке многопользовательской игры

Горячее обновление кода. Практика.

Но еще есть супер полезное применение ...

Page 36: Опыт использования Erlang в разработке многопользовательской игры

Горячее обновление кода. Практика.

Диагностика проблем прямо в production

Создание новых средств диагностики

И внедрение их налету

Page 37: Опыт использования Erlang в разработке многопользовательской игры

Борьба за качество проекта

Тестировать сложно

И вручную, и автоматически

Оба варианта стоят времени и усилий

Page 38: Опыт использования Erlang в разработке многопользовательской игры

Борьба за качество проекта

Хорошо иметь функцию без побочных эффектов

Написал юнит-тест

Проверил правильные, неправильныеи граничные входящие данные

И уверен, что функция всегда работает как надо

Page 39: Опыт использования Erlang в разработке многопользовательской игры

Борьба за качество проекта

Вот бы весь проект состоял из чистых функций!

Но, черт возьми, повсюду полно побочных эффектов. Кишмя кишат. Печаль :(

Page 40: Опыт использования Erlang в разработке многопользовательской игры

Побочные эффекты:

послали данные в сокет

записали чего-то в файл

вывели сообщение на консоль

сохранили данные в базу

запустили новый процесс

послали сообщение другому процессу

Page 41: Опыт использования Erlang в разработке многопользовательской игры

Страшная тайна программирования

Об этом не пишут в книгах ...

Page 42: Опыт использования Erlang в разработке многопользовательской игры

Страшная тайна программирования

Побочный эффект -- это смысл работы любойпрограммы, это и есть то полезное, что она делает.

Примите это :)

Page 43: Опыт использования Erlang в разработке многопользовательской игры

Борьба за качество проекта

Тестируем работу с базой данных

К черту моки! Будем тестировать работу с базой данных,

а не с моками!

Page 44: Опыт использования Erlang в разработке многопользовательской игры

Борьба за качество проекта

Отдельная тестовая база

DROP TABLE, CREATE TABLE,наполнение таблиц тестовыми данными

Перед каждым тестом

Page 45: Опыт использования Erlang в разработке многопользовательской игры

Борьба за качество проекта

Тестируем функции,которые реально читают из базы и пишут в базу

Да, это не быстро

Зато тестируем то, что надо :)

Page 46: Опыт использования Erlang в разработке многопользовательской игры

Борьба за качество проекта

Тестируем взаимодействие процессов

В тестах подымаем дерево супервайзеров

Запускаем процессы

Заставляем их посылать сообщения друг другу

Page 47: Опыт использования Erlang в разработке многопользовательской игры

Борьба за качество проекта

Творится синхронное и асинхронное невесть что

А тест должен это как-то проверять(асинхронное сразу не проверишь, подождать надо)

Придумай, как проверять.Ты ведь инженер, это твоя работа :)

Page 48: Опыт использования Erlang в разработке многопользовательской игры

Борьба за качество проекта

Надеюсь, эти тесты не сильно зависят от фазы луны :)

Мои худо-бедно работают, и местами что-то проверяют

Page 49: Опыт использования Erlang в разработке многопользовательской игры

Борьба за качество проекта

Более-менее нормальное покрытие тестамистоит дорого.

А их еще поддерживать надо,обновлять при изменениях в коде.

Page 50: Опыт использования Erlang в разработке многопользовательской игры

Борьба за качество проекта

Большая компания наймет отдельных людей для этого.

А что делать маленькой компании?Нас всего трое, как тестировать?

Page 51: Опыт использования Erlang в разработке многопользовательской игры

Борьба за качество проекта

Тестовый клиент

Отдельное консольное приложение

Умеет создавать десятки и сотни подключений

И через них дергать все АПИ сервера

Page 52: Опыт использования Erlang в разработке многопользовательской игры

Борьба за качество проекта

Два режима работы:

Полу-ручной

Стресс-тест

Page 53: Опыт использования Erlang в разработке многопользовательской игры

Борьба за качество проекта

Выявил и устранил проблемы в архитектуре

Нашел и оптимизировал узкие места

Пофиксил баги

Сплю спокойно :)

Page 54: Опыт использования Erlang в разработке многопользовательской игры

Недостатки Erlang

Малое количество разработчиков

Не является языком общего назначения

Динамическая типизация

Библиотеки третьих сторон не production ready

Page 55: Опыт использования Erlang в разработке многопользовательской игры

Выводы

Будем ли мы применять Erlang в следующих проектах?

Page 56: Опыт использования Erlang в разработке многопользовательской игры

Выводы

Однозначно да :)

Page 57: Опыт использования Erlang в разработке многопользовательской игры

Вопросы? :)