Elixir GenServer лучший способ приведения к другим узлам - PullRequest
0 голосов
/ 17 сентября 2018

У меня в GenServer есть следующие функции:

def add_event(param1, param2) do
    Enum.each(:pg2.get_members("some_group"), fn pid -> GenServer.cast(pid, {:new_event, param1, param2}) end)
  end

  def handle_cast({:new_event, param1, param2}, state) do
    #do something
    {:noreply, state}
  end

Моя идея заключается в том, что всякий раз, когда вызывается add_event, я хочу передать этот запрос всем членам группы в других узлах. У меня вопрос: хорошая ли это идея - приводить непосредственно внутри публичного API или лучше сделать это внутри handle_cast callback

?

1 Ответ

0 голосов
/ 17 сентября 2018

Выполнение отправки в Process (не в клиентском API) подразумевает следующие плюсы и минусы:

плюсы :

  1. Реальное асинхронное поведение : поскольку диспетчеризация находится на стороне сервера, внутри Process, вы не будете ждать после завершения диспетчеризации, чтобы GenServer продолжал работать.
  2. Супервизор : вы можете использовать Супервизор для контроля диспетчера.
  3. сохранять состояние в диспетчере, чтобынапример, укажите: pid, которые называются наиболее часто, какой тип event используется чаще, добавьте некоторую логику в диспетчеризацию ..

cons :

  1. Вы создаете два handle_cast вместо одного: один для отправки и один для фактического выполнения работы.Больше строк кода -> вы теряете в удобочитаемости
  2. Некоторые из ваших процессов будут посвящены диспетчеризации, а некоторые другие будут посвящены выполнению работы ... но все они будутс того же genserver. У вас есть один GenServer для двух видов процессов
  3. Процесс, предназначенный для отправки задания, скорее всего, не нуждается в поддержании состояния.
  4. Вы не можете использоватьдругая стратегия супервизора в зависимости от типа процесса .. поскольку они происходят из одного и того же GenServer

Если бы мне пришлось выбирать : я бы отправил насторона client api, так как это более простой шаблон.Если мне нужно сохранить состояние около call и cast моего GenServer, я бы создал второй, посвященный этому.

...