Elixir: лучшая практика для переноса временного состояния внутри GenServer?

#caching #elixir #webserver #phoenix-framework

#кэширование #elixir #веб-сервер #phoenix-framework

Вопрос:

Я пришел из опыта разработки игр и имею небольшой опыт работы с веб-серверами.

Я разрабатываю веб-сервер на основе Elixir / Phoenix. Допустим, у нас есть несколько игроков, которые могут вступать в гильдии. Связь между Guild и Player — один ко многим. Чтобы повысить производительность, мы хотим кэшировать данные в памяти как можно больше, поэтому мы кэшируем данные игроков, а также гильдий. Но поскольку игроки могут «делиться» одними и теми же гильдиями, мы пытаемся перенести данные гильдии на GenServer, чтобы каждую операцию для одной гильдии можно было выполнять последовательно.

С дизайном, упомянутым выше, мы поняли, что с кэшированием для гильдии стало немного сложнее иметь дело. Поскольку каждая гильдия сама по себе является отдельным процессом, какой процесс отвечает за завершение процесса гильдии?

  • Если процесс гильдии отвечает за истечение срока действия, каждое сообщение о приведении / вызове, отправленное после истечения срока действия, не может быть успешно выполнено.
  • Если у нас есть GuildManager для управления всей логикой истечения срока действия для процессов гильдии. Завершение процесса гильдии также приведет к сбою каждого процесса с pid-идентификатором гильдии.

Итак, какова наилучшая практика для решения такого рода проблем?

Комментарии:

1. Существует множество решений: перехват выходов в родительских системах, реестр живых гильдий, постепенное прекращение гильдий, сторожевые псы, в конце концов, но невозможно сказать, какое из них в основном применимо здесь, не видя реального кода.

2. @AlekseiMatiushkin На данный момент у нас нет фактического кода, поскольку мы все еще находимся на стадии проектирования. Мы хотим знать наилучшую практику проектирования вокруг такой ситуации «общего состояния» (гильдии).

3. Я согласен с @AlekseiMatiushkin, что есть много способов сделать это, и «лучший способ» в основном зависит от вашего контекста. Распространенным решением является наличие набора DynamicSupervisor игр (или гильдий), который используется для управления (запуска и остановки) жизненным циклом игр (вы можете избежать перезапусков с :temporary помощью опции перезапуска). Чтобы реализовать истечение срока действия, в начале вы могли бы просто использовать время ожидания GenServer.