Size: a a a

2020 November 22

ВВ

Вася Васечкин... in ErlangRus
Всем доброго времени суток. Развейте, пожалуйста, сомнения..
Ситуация : Есть группа процессов, принимающих сообщения из топика kafka. Один процесс на каждую партицию, всего их, к примеру, 64.  Сообщения мелкие, их много и требуется неким образом преобразовать каждое и отправить в другой топик kafka. В каждом сообщении есть числовой признак, по которому можно выделить обработку в отдельный процесс. Уникальных значений признака, к примеру, 20000, и они заранее не известны.
Вопрос : как лучше организовать процесс поиска и запуска обработчика по определённому признаку?
v1) Создать именованный процесс-балансировщик, в который будут стекаться все сообщения, и где будет проходить проверка процесса-обработчика, его spawn и фиксация Pid в ets табличке. Если процесс уже создан - просто посылаем ему сообщение на обработку.

v2) Регистрировать каждый процесс-обработчик под динамическим именем на основе признака через register(Name, Pid). Проверять, создан ли он, через whereis(Name). И делать это прямо в процессе , обрабатывающего партицию.

v3) gproc

как думаете?
источник

LL

Lama Lover in ErlangRus
Вася Васечкин
Всем доброго времени суток. Развейте, пожалуйста, сомнения..
Ситуация : Есть группа процессов, принимающих сообщения из топика kafka. Один процесс на каждую партицию, всего их, к примеру, 64.  Сообщения мелкие, их много и требуется неким образом преобразовать каждое и отправить в другой топик kafka. В каждом сообщении есть числовой признак, по которому можно выделить обработку в отдельный процесс. Уникальных значений признака, к примеру, 20000, и они заранее не известны.
Вопрос : как лучше организовать процесс поиска и запуска обработчика по определённому признаку?
v1) Создать именованный процесс-балансировщик, в который будут стекаться все сообщения, и где будет проходить проверка процесса-обработчика, его spawn и фиксация Pid в ets табличке. Если процесс уже создан - просто посылаем ему сообщение на обработку.

v2) Регистрировать каждый процесс-обработчик под динамическим именем на основе признака через register(Name, Pid). Проверять, создан ли он, через whereis(Name). И делать это прямо в процессе , обрабатывающего партицию.

v3) gproc

как думаете?
Если сообщения мелкие, их много и они быстро обрабатываются, то лучше через именованный процесс-балансировщик.

Важно чтобы у него был приоритет повыше, off-heap аллокции сообщений и не сообщения к нему приходили а был только запрос процесса по числовому признаку

А вообще, на сколько важно отправлять сообщения с одним признаком на один процесс?
источник

LL

Lama Lover in ErlangRus
Был бы elixir, тут зашёл бы Registry
Можно, конечно, самому попробовать что-то такое реализовать
источник

ВВ

Вася Васечкин... in ErlangRus
> А вообще, на сколько важно отправлять сообщения с одним признаком на один процесс?
Суть в том, что для обработки сообщений в рамках признака нужен дополнительный запрос к базе, результат которого кэшируется в стейте и используется по мере необходимости..если направлять сообщения в пул, то придётся писать логику синхронизации запросов к базе...если запрос уже выполняется, надо добавить свой pid в некий список ожидающих результата в  процессе запроса и остановиться в receive, ожидая ответ...если сообщений много, а база долго выполняет запросы, свободные воркеры очень быстро закончатся, но если у нас процесс на признак - то запрос к бд можно выполнять прямо в нём, а потом обрабатывать что накопилось. gen_statem тут подходит хорошо с 2 состояниями - 'обработка', 'запрос к базe'
источник

ML

Maksim Lapshin in ErlangRus
Вася Васечкин
> А вообще, на сколько важно отправлять сообщения с одним признаком на один процесс?
Суть в том, что для обработки сообщений в рамках признака нужен дополнительный запрос к базе, результат которого кэшируется в стейте и используется по мере необходимости..если направлять сообщения в пул, то придётся писать логику синхронизации запросов к базе...если запрос уже выполняется, надо добавить свой pid в некий список ожидающих результата в  процессе запроса и остановиться в receive, ожидая ответ...если сообщений много, а база долго выполняет запросы, свободные воркеры очень быстро закончатся, но если у нас процесс на признак - то запрос к бд можно выполнять прямо в нём, а потом обрабатывать что накопилось. gen_statem тут подходит хорошо с 2 состояниями - 'обработка', 'запрос к базe'
Сколько их у тебя в секунду?
источник

ВВ

Вася Васечкин... in ErlangRus
> Сколько их у тебя в секунду?
2-3 тысячи , в штатном режиме
источник

ВВ

Вася Васечкин... in ErlangRus
из них в среднем 5-6 с одинаковым признаком
источник

ML

Maksim Lapshin in ErlangRus
Вася Васечкин
> Сколько их у тебя в секунду?
2-3 тысячи , в штатном режиме
Честно говоря, у тебя и один может прожевать, но возможно стоит на каждую партицию по одному процессу (они же для этого и делаются)
источник

ВВ

Вася Васечкин... in ErlangRus
Maksim Lapshin
Честно говоря, у тебя и один может прожевать, но возможно стоит на каждую партицию по одному процессу (они же для этого и делаются)
Так и сделано, процесс на партицию + процесс-балансировщик по признаку
источник

ВВ

Вася Васечкин... in ErlangRus
а теперь думаю, велосипед это или нормально..
источник

ML

Maksim Lapshin in ErlangRus
Вася Васечкин
а теперь думаю, велосипед это или нормально..
Если оно не падает, переживает отключения кафки, в понедельник утром все так же работает и твои коллеги могут починить это без тебя, то оно вполне хорошо
источник

ВВ

Вася Васечкин... in ErlangRus
Maksim Lapshin
Если оно не падает, переживает отключения кафки, в понедельник утром все так же работает и твои коллеги могут починить это без тебя, то оно вполне хорошо
Спасибо за советы, всем хорошего воскресенья!
источник
2020 November 23

ŹR

Źmićer Rubinštejn in ErlangRus
Есть в эрланге что-то, что перекомпилирует код в шелле когда файлики меняются? Принято таким пользоваться при разработке?
источник

V

Vasilii Demidenok in ErlangRus
rebar3 auto ? ещё https://github.com/rustyio/sync был
источник

ŹR

Źmićer Rubinštejn in ErlangRus
У нас sync в проде крутится… Страшно признаваться
источник

ŹR

Źmićer Rubinštejn in ErlangRus
Я правда думал, что он только бимы подгружает
источник

VS

Vladimir Sekisov in ErlangRus
auto убьет нафиг супервизоры при перезагрузке,
мне как-то не нравится, когда чуть подправил модуль
и хочу потестить, начинать все сначала.
источник

DF

Denis Fakhrtdinov in ErlangRus
Можно написать небольшой кусочек кода, который можно положить в user_default и дергать в консольке когда нужно.
источник

DF

Denis Fakhrtdinov in ErlangRus
Кажется, я что-то похожее видел у @seriy_ps, но это не точно.
источник

DF

Denis Fakhrtdinov in ErlangRus
источник