Опыт использования Erlang
в разработке многопользовательской игры.
Юра Жлоба aka yzh44yzh
Многопоточность
Распределенность
Устойчивость к ошибкам
Горячее обновление кода
Кратенько про Erlang
Кратенько про нас
Кратенько про проект
А теперь переходим к сути :)
Многопоточность. Теория и практика.
Распределенность (только теория).
Устойчивость к ошибкам....
Многопоточность. Теория.
О, это оооочень сложно!
Мютексы там, семафоры всякие,
критические секции
“Java Concurrency in Pra...
Многопоточность. Теория.
Многопоточность бывает разная.
Бывает такая, которая простая :)
Многопоточность. Теория.
Легкие потоки
Эффективные планировщики
Изолированные области памяти
Изолированные сборщики мусора...
Многопоточность. Практика.
Процессы – кирпичики архитектуры
Сотни и тысячи процессов в одном проекте
Многопоточность. Практика.
Сходство с ООП:
Инкапсуляция состояния
Публичные и приватные функции
Отправка сообщений вместо ...
Многопоточность. Практика.
Dead lock, Race condition
Бывают, да. Но они не совсем не страшные.
Многопоточность. Практика.
Как выглядит эффективный сервер
если он написан не на Erlang?
(Ruby, Python, Node.js etc)
Многопоточность. Практика.
Например, так:
Несколько нод, по одной на каждое ядро
Rabbit MQ, чтобы наладить коммуникацию
Ng...
Многопоточность. Практика.
Все это заменяет одна нода на Erlang
Проще в разработке,
в развертывании,
в диагностике проблем...
Распределенность
Решение высокого уровня
Сетевая прозрачность
Просто посылаем сообщение процессу в другой
ноде так же, как...
Распределенность
Безопасность на куках
Доверенная зона, где все процессы
и все функции доступны
Распределенность
Но и собственное решение
с предоставлением внешнего АПИ
не запрещается делать :)
Устойчивость к ошибкам. Теория.
3 уровня защиты:
Изоляция потоков
Супервайзеры
Распределенность
Устойчивость к ошибкам. Практика.
Нет волшебной таблетки
От бага в бизнес-логике
никакой супервайзер не спасет
Нода не пад...
Устойчивость к ошибкам. Практика.
Let it crash
или
try/catch, где надо
Горячее обновление кода. Теория.
Жизнь и смерть Erlang-процесса
Как изменить неизменяемое состояние?
Горячее обновление кода. Теория.
Бесконечная рекурсия
Хвостовая, без накопления памяти на стеке
Горячее обновление кода. Теория.
Аргументы функции и все переменные в ней неизменны
А состояние процесса меняется. Чудо :)
Горячее обновление кода. Теория.
Горячая загрузка модуля меняет код его функций
Но состояние процесса остается прежним
В к...
Горячее обновление кода. Теория.
В простом случае все просто
Но бывают сложные случаи :)
Горячее обновление кода. Теория.
Изменилась структура данных
Изменилось дерево супервайзеров
Разное время обновления проце...
Горячее обновление кода. Практика.
Юзаем локально, в ходе разработки
Написал код, загрузил, поглядел как работает
Перезапу...
Горячее обновление кода. Практика.
Выкатываем фичу в production
Потому что не хотим рестартовать сервер
Потому что там все...
Горячее обновление кода. Практика.
Имеем нестабильный production сервер
И пользователей в роли бета-тесторов
(и они не сча...
Горячее обновление кода. Практика.
Отдельный тестовый сервер
Нестабильные изменения выкатываем на него
Горячее обновление кода. Практика.
Production сервер обновляем редко
Горячее обновление не получается
из-за “сложных случа...
Горячее обновление кода. Практика.
Сохранение состояний игр перед рестартом
Восстановление после рестарта
Горячее обновление кода. Практика.
И что теперь?
Горячее обновление не нужно?
Горячее обновление кода. Практика.
Ну можно выкатывать быстрые,
не опасные фичи, мелкие фиксы
Если не хочется ждать 2 неде...
Горячее обновление кода. Практика.
Но еще есть супер полезное применение ...
Горячее обновление кода. Практика.
Диагностика проблем прямо в production
Создание новых средств диагностики
И внедрение и...
Борьба за качество проекта
Тестировать сложно
И вручную, и автоматически
Оба варианта стоят времени и усилий
Борьба за качество проекта
Хорошо иметь функцию без побочных эффектов
Написал юнит-тест
Проверил правильные, неправильные
...
Борьба за качество проекта
Вот бы весь проект состоял из чистых функций!
Но, черт возьми, повсюду полно побочных
эффектов....
Побочные эффекты:
послали данные в сокет
записали чего-то в файл
вывели сообщение на консоль
сохранили данные в базу
запус...
Страшная тайна программирования
Об этом не пишут в книгах ...
Страшная тайна программирования
Побочный эффект -- это смысл работы любой
программы, это и есть то полезное, что она делае...
Борьба за качество проекта
Тестируем работу с базой данных
К черту моки!
Будем тестировать работу с базой данных,
а не с м...
Борьба за качество проекта
Отдельная тестовая база
DROP TABLE, CREATE TABLE,
наполнение таблиц тестовыми данными
Перед каж...
Борьба за качество проекта
Тестируем функции,
которые реально читают из базы и пишут в базу
Да, это не быстро
Зато тестиру...
Борьба за качество проекта
Тестируем взаимодействие процессов
В тестах подымаем дерево супервайзеров
Запускаем процессы
За...
Борьба за качество проекта
Творится синхронное и асинхронное невесть что
А тест должен это как-то проверять
(асинхронное с...
Борьба за качество проекта
Надеюсь, эти тесты не сильно
зависят от фазы луны :)
Мои худо-бедно работают,
и местами что-то ...
Борьба за качество проекта
Более-менее нормальное покрытие тестами
стоит дорого.
А их еще поддерживать надо,
обновлять при...
Борьба за качество проекта
Большая компания наймет
отдельных людей для этого.
А что делать маленькой компании?
Нас всего т...
Борьба за качество проекта
Тестовый клиент
Отдельное консольное приложение
Умеет создавать десятки и сотни подключений
И ч...
Борьба за качество проекта
Два режима работы:
Полу-ручной
Стресс-тест
Борьба за качество проекта
Выявил и устранил проблемы в архитектуре
Нашел и оптимизировал узкие места
Пофиксил баги
Сплю с...
Недостатки Erlang
Малое количество разработчиков
Не является языком общего назначения
Динамическая типизация
Библиотеки тр...
Выводы
Будем ли мы применять Erlang
в следующих проектах?
Выводы
Однозначно да :)
Вопросы? :)
Upcoming SlideShare
Loading in …5
×

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

1,839 views
1,699 views

Published on

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

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,839
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
18
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

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

  1. 1. Опыт использования Erlang в разработке многопользовательской игры. Юра Жлоба aka yzh44yzh
  2. 2. Многопоточность Распределенность Устойчивость к ошибкам Горячее обновление кода Кратенько про Erlang
  3. 3. Кратенько про нас
  4. 4. Кратенько про проект
  5. 5. А теперь переходим к сути :) Многопоточность. Теория и практика. Распределенность (только теория). Устойчивость к ошибкам. Теория и практика. Горячее обновление кода. Теория и практика. Борьба за качество проекта. Недостатки Erlang. Выводы.
  6. 6. Многопоточность. Теория. О, это оооочень сложно! Мютексы там, семафоры всякие, критические секции “Java Concurrency in Practice” нужно выучить назубок А иначе страшные dead lock будут преследовать вас в ночных кошмарах
  7. 7. Многопоточность. Теория. Многопоточность бывает разная. Бывает такая, которая простая :)
  8. 8. Многопоточность. Теория. Легкие потоки Эффективные планировщики Изолированные области памяти Изолированные сборщики мусора Обмен сообщениями
  9. 9. Многопоточность. Практика. Процессы – кирпичики архитектуры Сотни и тысячи процессов в одном проекте
  10. 10. Многопоточность. Практика. Сходство с ООП: Инкапсуляция состояния Публичные и приватные функции Отправка сообщений вместо вызовов функций Полиморфизм функций и модулей Даже конструкторы и деструкторы есть И даже фабрика :)
  11. 11. Многопоточность. Практика. Dead lock, Race condition Бывают, да. Но они не совсем не страшные.
  12. 12. Многопоточность. Практика. Как выглядит эффективный сервер если он написан не на Erlang? (Ruby, Python, Node.js etc)
  13. 13. Многопоточность. Практика. Например, так: Несколько нод, по одной на каждое ядро Rabbit MQ, чтобы наладить коммуникацию Nginx на входе Redis для in-memory кеширования
  14. 14. Многопоточность. Практика. Все это заменяет одна нода на Erlang Проще в разработке, в развертывании, в диагностике проблем, в поддержке.
  15. 15. Распределенность Решение высокого уровня Сетевая прозрачность Просто посылаем сообщение процессу в другой ноде так же, как и процессу в своей ноде
  16. 16. Распределенность Безопасность на куках Доверенная зона, где все процессы и все функции доступны
  17. 17. Распределенность Но и собственное решение с предоставлением внешнего АПИ не запрещается делать :)
  18. 18. Устойчивость к ошибкам. Теория. 3 уровня защиты: Изоляция потоков Супервайзеры Распределенность
  19. 19. Устойчивость к ошибкам. Практика. Нет волшебной таблетки От бага в бизнес-логике никакой супервайзер не спасет Нода не падает, Но отказ в обслуживании ничем не лучше
  20. 20. Устойчивость к ошибкам. Практика. Let it crash или try/catch, где надо
  21. 21. Горячее обновление кода. Теория. Жизнь и смерть Erlang-процесса Как изменить неизменяемое состояние?
  22. 22. Горячее обновление кода. Теория. Бесконечная рекурсия Хвостовая, без накопления памяти на стеке
  23. 23. Горячее обновление кода. Теория. Аргументы функции и все переменные в ней неизменны А состояние процесса меняется. Чудо :)
  24. 24. Горячее обновление кода. Теория. Горячая загрузка модуля меняет код его функций Но состояние процесса остается прежним В какой-то момент процесс покидает старую функцию loop, и входит в новую функцию loop
  25. 25. Горячее обновление кода. Теория. В простом случае все просто Но бывают сложные случаи :)
  26. 26. Горячее обновление кода. Теория. Изменилась структура данных Изменилось дерево супервайзеров Разное время обновления процессов
  27. 27. Горячее обновление кода. Практика. Юзаем локально, в ходе разработки Написал код, загрузил, поглядел как работает Перезапускать сервер при каждом изменении в коде – лишнее.
  28. 28. Горячее обновление кода. Практика. Выкатываем фичу в production Потому что не хотим рестартовать сервер Потому что там всегда есть игры, которые прервутся
  29. 29. Горячее обновление кода. Практика. Имеем нестабильный production сервер И пользователей в роли бета-тесторов (и они не счастливы выполнять эту роль :)
  30. 30. Горячее обновление кода. Практика. Отдельный тестовый сервер Нестабильные изменения выкатываем на него
  31. 31. Горячее обновление кода. Практика. Production сервер обновляем редко Горячее обновление не получается из-за “сложных случаев” Обновление – это всегда рестарт
  32. 32. Горячее обновление кода. Практика. Сохранение состояний игр перед рестартом Восстановление после рестарта
  33. 33. Горячее обновление кода. Практика. И что теперь? Горячее обновление не нужно?
  34. 34. Горячее обновление кода. Практика. Ну можно выкатывать быстрые, не опасные фичи, мелкие фиксы Если не хочется ждать 2 недели до конца спринта.
  35. 35. Горячее обновление кода. Практика. Но еще есть супер полезное применение ...
  36. 36. Горячее обновление кода. Практика. Диагностика проблем прямо в production Создание новых средств диагностики И внедрение их налету
  37. 37. Борьба за качество проекта Тестировать сложно И вручную, и автоматически Оба варианта стоят времени и усилий
  38. 38. Борьба за качество проекта Хорошо иметь функцию без побочных эффектов Написал юнит-тест Проверил правильные, неправильные и граничные входящие данные И уверен, что функция всегда работает как надо
  39. 39. Борьба за качество проекта Вот бы весь проект состоял из чистых функций! Но, черт возьми, повсюду полно побочных эффектов. Кишмя кишат. Печаль :(
  40. 40. Побочные эффекты: послали данные в сокет записали чего-то в файл вывели сообщение на консоль сохранили данные в базу запустили новый процесс послали сообщение другому процессу
  41. 41. Страшная тайна программирования Об этом не пишут в книгах ...
  42. 42. Страшная тайна программирования Побочный эффект -- это смысл работы любой программы, это и есть то полезное, что она делает. Примите это :)
  43. 43. Борьба за качество проекта Тестируем работу с базой данных К черту моки! Будем тестировать работу с базой данных, а не с моками!
  44. 44. Борьба за качество проекта Отдельная тестовая база DROP TABLE, CREATE TABLE, наполнение таблиц тестовыми данными Перед каждым тестом
  45. 45. Борьба за качество проекта Тестируем функции, которые реально читают из базы и пишут в базу Да, это не быстро Зато тестируем то, что надо :)
  46. 46. Борьба за качество проекта Тестируем взаимодействие процессов В тестах подымаем дерево супервайзеров Запускаем процессы Заставляем их посылать сообщения друг другу
  47. 47. Борьба за качество проекта Творится синхронное и асинхронное невесть что А тест должен это как-то проверять (асинхронное сразу не проверишь, подождать надо) Придумай, как проверять. Ты ведь инженер, это твоя работа :)
  48. 48. Борьба за качество проекта Надеюсь, эти тесты не сильно зависят от фазы луны :) Мои худо-бедно работают, и местами что-то проверяют
  49. 49. Борьба за качество проекта Более-менее нормальное покрытие тестами стоит дорого. А их еще поддерживать надо, обновлять при изменениях в коде.
  50. 50. Борьба за качество проекта Большая компания наймет отдельных людей для этого. А что делать маленькой компании? Нас всего трое, как тестировать?
  51. 51. Борьба за качество проекта Тестовый клиент Отдельное консольное приложение Умеет создавать десятки и сотни подключений И через них дергать все АПИ сервера
  52. 52. Борьба за качество проекта Два режима работы: Полу-ручной Стресс-тест
  53. 53. Борьба за качество проекта Выявил и устранил проблемы в архитектуре Нашел и оптимизировал узкие места Пофиксил баги Сплю спокойно :)
  54. 54. Недостатки Erlang Малое количество разработчиков Не является языком общего назначения Динамическая типизация Библиотеки третьих сторон не production ready
  55. 55. Выводы Будем ли мы применять Erlang в следующих проектах?
  56. 56. Выводы Однозначно да :)
  57. 57. Вопросы? :)

×