Распределенное кэширование в Elixir

Я пишу приложение Elixir, которому требуется реестр для хранения сопоставления того, какой pid принадлежит какому пользователю. У меня будет GenServer для каждого пользователя в приложении, которое будет контролироваться. У меня есть базовый пример, работающий с одним узлом, использующим ETS, но с 2+ узлами я не могу использовать ETS, поскольку он не поддерживает кластеризацию/репликацию. Каковы другие варианты использования распределенного кеша? Из некоторых исследований я выбрал вариант использования базы данных, такой как Redis, или Amensia.


person ed1t    schedule 11.03.2016    source источник


Ответы (1)


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

GenServer.start_link(__MODULE__, args, [name: {:global, user_id}]

Затем вы можете просто найти :global.whereis_name(user_id), чтобы получить pid. Если процесс умирает, он автоматически отменяется. Вот документация для глобального модуля Erlang.

person Cody Poll    schedule 11.03.2016
comment
Обратите внимание, что термин регистрации (user_id в примере) может быть любым термином Erlang/Elixir, а не только атомами. - person Cody Poll; 11.03.2016
comment
Будет ли user_id считаться атомом? Я читал в документации по erlang, что пространство имен/таблица атома не собирается мусором. Таким образом, наличие большого количества pids с именованным атомом может привести к накладным расходам, пока виртуальная машина не будет восстановлена. - person ed1t; 11.03.2016
comment
Вы, вероятно, использовали бы целое число или строку (uuid?), или, как бы то ни было, вы однозначно идентифицируете своих пользователей (первичный ключ в базе данных?). Вы бы не использовали атом именно по той причине, о которой вы говорите, - он не будет собирать мусор. - person Cody Poll; 11.03.2016
comment
Я бы использовал строку, которая является uuid. - person ed1t; 11.03.2016
comment
Затем он будет собирать мусор, когда это необходимо. - person Cody Poll; 11.03.2016