Если вы вернете {ok, Pid} чего-то, на что вы не ссылаетесь, это запутает супервизора, который полагается на возвращаемое значение.Если вы не хотите, чтобы супервизор использовал это в качестве функции start_link, вы можете обойтись без него.
Ваш подход выглядит так, как будто он должен работать, так как каждый узел будет пытаться запустить новый экземпляр, если он глобальный.умирает.Вы можете обнаружить, что вам нужно увеличить значение MaxR
в настройках супервизора, поскольку вы будете получать сообщения о процессах каждый раз, когда изменяется член кластера.
Один из способов, которыми я создавал глобальные синглтоны в прошломчтобы запустить процесс на всех узлах, но иметь один из них (тот, который выигрывает глобальную гонку регистрации), быть ведущим.Другие процессы контролируют мастер, и когда мастер выходит, попытайтесь стать мастером.(И опять же, если они не выигрывают регистрационную гонку, то они следят за тем, что сделал).Если вы сделаете это, вам придется самостоятельно обрабатывать глобальную регистрацию имени (т.е. не использовать функциональность gen_server:start({global, ...
), потому что вы хотите, чтобы процесс запускался независимо от того, выиграет ли он при регистрации, он просто будет вести себя по-разному в каждом случае.
Сам процесс должен быть более сложным (он должен выполняться как в режиме мастера, так и в режиме без мастера), но он быстро стабилизируется и не вызывает большого количества спама в журнале при попытках запуска супервизора.
Мой метод обычно требует нескольких раундов пересмотра, чтобы избавиться от угловых случаев, но, на мой взгляд, меньше хлопот, чем написание распределенного приложения OTP.Этот метод имеет еще одно преимущество перед распределенными приложениями в том, что вам не нужно статически настраивать список узлов, участвующих в вашем кластере - любой узел может быть кандидатом на запуск мастер-копии процесса.Ваш подход имеет то же свойство.