5. А теперь переходим к сути :)
Многопоточность. Теория и практика.
Распределенность (только теория).
Устойчивость к ошибкам. Теория и практика.
Горячее обновление кода. Теория и практика.
Борьба за качество проекта.
Недостатки Erlang.
Выводы.
6. Многопоточность. Теория.
О, это оооочень сложно!
Мютексы там, семафоры всякие,
критические секции
“Java Concurrency in Practice”
нужно выучить назубок
А иначе страшные dead lock будут
преследовать вас в ночных кошмарах
10. Многопоточность. Практика.
Сходство с ООП:
Инкапсуляция состояния
Публичные и приватные функции
Отправка сообщений вместо вызовов функций
Полиморфизм функций и модулей
Даже конструкторы и деструкторы есть
И даже фабрика :)
18. Устойчивость к ошибкам. Теория.
3 уровня защиты:
Изоляция потоков
Супервайзеры
Распределенность
19. Устойчивость к ошибкам. Практика.
Нет волшебной таблетки
От бага в бизнес-логике
никакой супервайзер не спасет
Нода не падает,
Но отказ в обслуживании ничем не лучше
23. Горячее обновление кода. Теория.
Аргументы функции и все переменные в ней неизменны
А состояние процесса меняется. Чудо :)
24. Горячее обновление кода. Теория.
Горячая загрузка модуля меняет код его функций
Но состояние процесса остается прежним
В какой-то момент процесс покидает старую
функцию loop, и входит в новую функцию loop
26. Горячее обновление кода. Теория.
Изменилась структура данных
Изменилось дерево супервайзеров
Разное время обновления процессов
27. Горячее обновление кода. Практика.
Юзаем локально, в ходе разработки
Написал код, загрузил, поглядел как работает
Перезапускать сервер
при каждом изменении в коде – лишнее.
28. Горячее обновление кода. Практика.
Выкатываем фичу в production
Потому что не хотим рестартовать сервер
Потому что там всегда есть игры,
которые прервутся
29. Горячее обновление кода. Практика.
Имеем нестабильный production сервер
И пользователей в роли бета-тесторов
(и они не счастливы выполнять эту роль :)
30. Горячее обновление кода. Практика.
Отдельный тестовый сервер
Нестабильные изменения выкатываем на него
31. Горячее обновление кода. Практика.
Production сервер обновляем редко
Горячее обновление не получается
из-за “сложных случаев”
Обновление – это всегда рестарт
32. Горячее обновление кода. Практика.
Сохранение состояний игр перед рестартом
Восстановление после рестарта
36. Горячее обновление кода. Практика.
Диагностика проблем прямо в production
Создание новых средств диагностики
И внедрение их налету
37. Борьба за качество проекта
Тестировать сложно
И вручную, и автоматически
Оба варианта стоят времени и усилий
38. Борьба за качество проекта
Хорошо иметь функцию без побочных эффектов
Написал юнит-тест
Проверил правильные, неправильные
и граничные входящие данные
И уверен, что функция всегда работает как надо
39. Борьба за качество проекта
Вот бы весь проект состоял из чистых функций!
Но, черт возьми, повсюду полно побочных
эффектов. Кишмя кишат. Печаль :(
40. Побочные эффекты:
послали данные в сокет
записали чего-то в файл
вывели сообщение на консоль
сохранили данные в базу
запустили новый процесс
послали сообщение другому процессу
43. Борьба за качество проекта
Тестируем работу с базой данных
К черту моки!
Будем тестировать работу с базой данных,
а не с моками!
44. Борьба за качество проекта
Отдельная тестовая база
DROP TABLE, CREATE TABLE,
наполнение таблиц тестовыми данными
Перед каждым тестом
45. Борьба за качество проекта
Тестируем функции,
которые реально читают из базы и пишут в базу
Да, это не быстро
Зато тестируем то, что надо :)
46. Борьба за качество проекта
Тестируем взаимодействие процессов
В тестах подымаем дерево супервайзеров
Запускаем процессы
Заставляем их посылать сообщения друг другу
47. Борьба за качество проекта
Творится синхронное и асинхронное невесть что
А тест должен это как-то проверять
(асинхронное сразу не проверишь, подождать надо)
Придумай, как проверять.
Ты ведь инженер, это твоя работа :)
48. Борьба за качество проекта
Надеюсь, эти тесты не сильно
зависят от фазы луны :)
Мои худо-бедно работают,
и местами что-то проверяют
49. Борьба за качество проекта
Более-менее нормальное покрытие тестами
стоит дорого.
А их еще поддерживать надо,
обновлять при изменениях в коде.
50. Борьба за качество проекта
Большая компания наймет
отдельных людей для этого.
А что делать маленькой компании?
Нас всего трое, как тестировать?
51. Борьба за качество проекта
Тестовый клиент
Отдельное консольное приложение
Умеет создавать десятки и сотни подключений
И через них дергать все АПИ сервера
53. Борьба за качество проекта
Выявил и устранил проблемы в архитектуре
Нашел и оптимизировал узкие места
Пофиксил баги
Сплю спокойно :)
54. Недостатки Erlang
Малое количество разработчиков
Не является языком общего назначения
Динамическая типизация
Библиотеки третьих сторон
не production ready