#caching #elixir #webserver #phoenix-framework
#кэширование #elixir #веб-сервер #phoenix-framework
Вопрос:
Я пришел из опыта разработки игр и имею небольшой опыт работы с веб-серверами.
Я разрабатываю веб-сервер на основе Elixir / Phoenix. Допустим, у нас есть несколько игроков, которые могут вступать в гильдии. Связь между Guild
и Player
— один ко многим. Чтобы повысить производительность, мы хотим кэшировать данные в памяти как можно больше, поэтому мы кэшируем данные игроков, а также гильдий. Но поскольку игроки могут «делиться» одними и теми же гильдиями, мы пытаемся перенести данные гильдии на GenServer, чтобы каждую операцию для одной гильдии можно было выполнять последовательно.
С дизайном, упомянутым выше, мы поняли, что с кэшированием для гильдии стало немного сложнее иметь дело. Поскольку каждая гильдия сама по себе является отдельным процессом, какой процесс отвечает за завершение процесса гильдии?
- Если процесс гильдии отвечает за истечение срока действия, каждое сообщение о приведении / вызове, отправленное после истечения срока действия, не может быть успешно выполнено.
- Если у нас есть
GuildManager
для управления всей логикой истечения срока действия для процессов гильдии. Завершение процесса гильдии также приведет к сбою каждого процесса с pid-идентификатором гильдии.
Итак, какова наилучшая практика для решения такого рода проблем?
Комментарии:
1. Существует множество решений: перехват выходов в родительских системах, реестр живых гильдий, постепенное прекращение гильдий, сторожевые псы, в конце концов, но невозможно сказать, какое из них в основном применимо здесь, не видя реального кода.
2. @AlekseiMatiushkin На данный момент у нас нет фактического кода, поскольку мы все еще находимся на стадии проектирования. Мы хотим знать наилучшую практику проектирования вокруг такой ситуации «общего состояния» (гильдии).
3. Я согласен с @AlekseiMatiushkin, что есть много способов сделать это, и «лучший способ» в основном зависит от вашего контекста. Распространенным решением является наличие набора
DynamicSupervisor
игр (или гильдий), который используется для управления (запуска и остановки) жизненным циклом игр (вы можете избежать перезапусков с:temporary
помощью опции перезапуска). Чтобы реализовать истечение срока действия, в начале вы могли бы просто использовать время ожидания GenServer.