У меня есть уникальная проблема, с которой мне не нужно было обращаться в elxir.
Мне нужно использовать динамический супервизор для динамического запуска (n) числа детей в кластерной среде. Я использую libcluster для управления кластеризацией и использования глобального реестра процессов для поиска динамического диспетчера pid.. Вот что происходит:
global: Name conflict terminating {:packer_supervisor, #PID<31555.1430.0>}
Вот код для супервизора:
defmodule EcompackingCore.PackerSupervisor do
use DynamicSupervisor
require Logger
def start_link() do
DynamicSupervisor.start_link(__MODULE__, :ok, name: {:global, :packer_supervisor})
end
def init(:ok) do
Logger.info("Starting Packer Supervisor")
DynamicSupervisor.init(strategy: :one_for_one)
end
def add_packer(badge_id, packer_name) do
child_spec = {EcompackingCore.Packer, {badge_id, packer_name}}
DynamicSupervisor.start_child(:global.whereis_name(:packer_supervisor), child_spec)
end
def remove_packer(packer_pid) do
DynamicSupervisor.terminate_child(:global.whereis_name(:packer_supervisor), packer_pid)
end
def children do
DynamicSupervisor.which_children(:global.whereis_name(:packer_supervisor))
end
def count_children do
DynamicSupervisor.count_children(:global.whereis_name(:packer_supervisor))
end
end
Проблема заключается в том, что супервизор запускается на обоих узлах. Какой был бы лучший способ справиться с этим? Мне действительно нужен супервизор, чтобы быть динамичным, чтобы я мог эффективно управлять рабочими модулями. Возможно, другой реестр?
Спасибо за вашу помощь.