Size: a a a

2021 November 27

SB

S B in ErlangRus
Народ, помогайте. Есть генсервер, но их количество заранее неизвестно. Они создаются и умирают. До тысячи штук на ноду — просто чтоб было понимание верхнего предела и рейт, скажем, не более 10 CRUD операций в секунду.

Первый вариант — simple_one_for_one супервизор, но у него же нет управляемого состояния как у генсервера и кажется, что это решение игрушечное.

Второе что я вижу — это генсервер, который будет точкой входа, а ещё запускать и тормозить кого надо. Но тогда мне придётся внутри него отслеживать, какие процессы померли раньше времени и как-то их перезапускать?
источник

SB

S B in ErlangRus
Какие ещё подходы есть? Проверенные временем?
источник

MK

Matwey Kornilov in ErlangRus
Надо обеспечить предел количества генсерверов?
источник

LL

Lama Lover in ErlangRus
А проблема-то какая? Что сделать нужно?
источник

SB

S B in ErlangRus
Надо чтоб динамика осталась и при этом все плюшки Эрланга в виде супервизоров тоже остались.
источник

SB

S B in ErlangRus
И при этом чтобы было легко следить кто сейчас запущен, находить их по критериям кастомным и так далее.
источник

LL

Lama Lover in ErlangRus
simple_one_for_one
источник

SB

S B in ErlangRus
И если я хочу найти «всех детей, у которых выполняется критерий А», то мне надо 1) на уровне супервайзера запросить всех running детей, 2) каждого ребёнка спросить «а ты удовлетворяешь критерию А?» и в зависимость от ответа решать че с ним далее делать?
источник

EM

Evgeny M. in ErlangRus
а как ты собираешься идентифицировать процессы? Если это допустим не sofo
источник

LL

Lama Lover in ErlangRus
У вас две проблемы: динамический супервайзинг и роутинг. Не надо пытаться решить это в одном процессе. Супервизоры в эрланге специально не умеют ничего кроме супервайзинга

Для роутинга запустите отдельный сервер-менеджер, который будет мониторить чайлдов. Если бы вы были на эликсире, всё бы решилось использованием Registry, но в эрланге придётся писать это самому

Перезапуск упавших воркеров оставьте для simple_one_for_one супервизора

Я обычно реализую всё в таком дереве супервизоров

all_for_one
|- pool_router
|- simple_one_for_one
   |- worker1
   |- worker2
   ...
источник

SB

S B in ErlangRus
Не знаю что такое sofo. Но есть же у супервизора список пидов детей, которые в режиме running. А далее gen_server:cast(ChildPID, my_msg).
источник

EM

Evgeny M. in ErlangRus
sofo - simple_obne_for_one
источник

EM

Evgeny M. in ErlangRus
ну вот как ты будешь выбирать именно тот пид в который надо послать сообщение
источник

EM

Evgeny M. in ErlangRus
по любому нужен регистр этих процессов, с табличкой
источник

SB

S B in ErlangRus
Я пока вижу вариант броадкастить всем пидам «привет, а не тебя ли я ищу?»
источник

LL

Lama Lover in ErlangRus
Я выше написал как правильно делать
источник

SB

S B in ErlangRus
Их же до тысячи. Перф позволяет. Это не хайлоад.
источник

EM

Evgeny M. in ErlangRus
самое простое - отдельный процес с protected ets, чтобы можно было туда лазить без захода в гgen_server
источник

SB

S B in ErlangRus
Понял. Я как раз искал решение, где не надо своё велосипедить режистри.
источник

EM

Evgeny M. in ErlangRus
есть готовые регистры. gproc например
источник