
Eugene
30.08.2016
09:30:13
да

Dmitry
30.08.2016
09:30:31
Т.е. в общем случае, мне не надо отдельно супервизор пилить, я могу прямо в апп всю логику фигачить

Eugene
30.08.2016
09:31:07
можно прямо в этот сгенереный файл писать код, конечно. но не желательно

Dmitry
30.08.2016
09:31:27

Google

Dmitry
30.08.2016
09:31:35
Разницы то. Только лишняя прослойка
Типо апп запускает супервизор, который за всем наблюдает

Eugene
30.08.2016
09:31:50
ну скажем так, не по канонам это
в идеале ты должен откоментить воркера какого-то, в котором будет выполнятся уже реальная работа:
# worker(Heartbeat.Worker, [arg1, arg2, arg3]),
откоментить/написать
ты хочешь писать код (“мясо”) прям в модуль где находится use Application? в этом случае если вылезет рантайм ошибка, упадет весь апликейшен. не нужно так делать

Dmitry
30.08.2016
09:33:51

Eugene
30.08.2016
09:33:59
а, понял
можешь конечно
это уже нормальная практика
сори, я тебя не так понял сначала :)
в elixir in action как-раз это красиво описано. при запуске приложения запускаются воркеры “сервера туду”, супервайзор БД и его дети (воркеры базы данных), процесс-реестр процессов
все сразу. главное в определенном порядке

Google

Dmitry
30.08.2016
09:36:29
Да читал, только деталей не помню
И ещё - там для базы данных заранее известно сколько детей
А у меня по ходу рантайма надо удалять и добавлять
Лан, попробую выкатить через несколько часов, буду ждать пулов

Eugene
30.08.2016
09:37:57
для этого надо сделать супервайзора, добавить ему одного чайлда, и сделать стратегию рестартов simple_one_for_one
таким образом ты можешь кучу чайлдов запускать в рантайме

Dmitry
30.08.2016
09:48:58
ещё вопрос: Как лучше это расписание хранить в памяти?
Есть допусти мэп, там надо сопостовлять пид и расписание.
Но расписание слишком большое для ключа
А пид вроде нельзя использовать

Eugene
30.08.2016
09:49:25
почему пид нельзя?

Dmitry
30.08.2016
09:49:34
хз
Смысл в том чтобы пид находить как то))
Ща сформулирую кароч
Короче хз что я хочу(
Если в бд поменяется расписание - хз как это обрабатывать
2 Варика есть.
Первый - это хранить ключом id расписания в бд, а само расписание и пид - в значении.
Если расписание меняется - находить по Id, расписание менять и по пиду перезапускать сервак
А второй - крушить супервизор и просто все с начала начинать - забирать из бд все расписания и стартовать заново все процессы

Eugene
30.08.2016
10:10:35
не совсем понимаю зачем что-то перезапускать вообще
расписание – процесс
воркер1 – процесс
воркер2 – процесс
воркер3 – процесс

Google

Eugene
30.08.2016
10:11:35
в процессе расписании стейт – где map: pid – воркер, значение – период повтора (“каждые 5 минут")
в процессе расписании так-же функция которая вызывает сама себя рекурсивно. в теле этой функции читаешь расписание, и слеш соотв пиду сообщение “поработай” (если пора)
если в мапе частота миняется на “каждые 10 минут“, то рекурсиная функция в теле уже каждый 10 минут будет слать сообщение “поработай" нужному пиду
для начала предлагаю решать эту задачу без БД вообще, само собой

Dmitry
30.08.2016
10:14:02

Eugene
30.08.2016
10:14:19
пользователь шлет сообщение в процесс-расписание

Dmitry
30.08.2016
10:14:34
Вернее как найти именно тот мап...

Alexander
30.08.2016
10:14:55
https://twitter.com/iamdevloper/status/770549611165548544

Eugene
30.08.2016
10:15:56
пускай у расписаний будут имена. получится такой мап:
%{
“заправить постель” => { pid, “каждый день в 7 утра” },
“вынести мусор” => { pid, “каждый день в 10 утра” },
“позвонить маме” => { pid, “каждые 2 часа” }
}
пользователь хочет чтоб постель заправлялась чуть позже, в 7:15. шлет call-сообщение в процесс-расписание
какой это будет пид – это уже пользователю знать не обязательно (т.к. это деталь реализации)

Dmitry
30.08.2016
10:17:27
вот я и говорю. Только не имена а айди из базы, потому что они там и так есть)

Eugene
30.08.2016
10:17:54
ну значит id

Dmitry
30.08.2016
10:21:55
Типо такое апи:
Вот к примеру хочу читать несколько газет по расписанию:
HBRegistry.add(%Sched{..}, times_pid)
HBRegistry.add(%Sched{..}, guardian_pid)
HBRegistry.add(%Sched{..}, observer_pid)
А потом к примеру поменять расписание:
HBRegistry.change(%Sched{{..new}, times_pid)
Вот в этом месте я уже этот times_pid нигде не найду. Мне легче прошлый убить, и новый запустить.
Но чтобы прошлый убить, мне его надо найти.
Но я и по прошлому расписанию не найду, и по пиду не найду короче
Поэтому я думаю, что в БД расписание храниться по id. И вот если я его буду гонять - то только по нему и найду

Eugene
30.08.2016
10:30:02
процессы должны быть невидимы для пользователя
грубо говоря я вижу это так:
HBRegistry.add(%Sched{..}, “times”)
HBRegistry.add(%Sched{..}, “guardian”)
HBRegistry.add(%Sched{..}, “observer”)
HBRegistry.change(%Sched{{..new}, “times”)

Dmitry
30.08.2016
10:31:01
Ну типо да...

Google

Eugene
30.08.2016
10:31:13
или как ты говоришь: вместо строки “times” – id соотвествующий этому “times” из базы

Dmitry
30.08.2016
10:31:29
HBRegistry.add(%Sched{..}, TimesReader)
И у timesreader запускается start_link, а потом он висит и ждёт тиков

Eugene
30.08.2016
10:31:55
так

Dmitry
30.08.2016
10:32:02
Так вот при change надо его найти
Если у меня к примеру 10 разных times
Ну, times то только одно, но это плохой пример просто
Лучший - это чтение из 10 каналов твиттера, 5 лент фейсбука и rss хабра

Eugene
30.08.2016
10:33:08
ок. давай этот сценарий детальнее: если 10 разных таймс, как система должна сработать? обновить расписание всем 10?

Dmitry
30.08.2016
10:34:48
HBRegistry.add(%Sched{..}, TwitterReader, 34543)
HBRegistry.add(%Sched{..}, TwitterReader, 34543)
HBRegistry.add(%Sched{..}, FacebookReader, "vasya_pupkin")

Admin
ERROR: S client not available

Dmitry
30.08.2016
10:35:02
Ну во второй строке число поменять
Типо разные каналы)

Eugene
30.08.2016
10:35:21
(в телеграме можно редактировать)
ок, понял
ну, норм, это ниче не меняет по сути
разве что я бы не делал 3 параметра
а делал бы тупль
HBRegistry.add(schedule, { TwitterReader, 34543 })
не суть

Google

Dmitry
30.08.2016
10:36:12
Ну, ну ок

Eugene
30.08.2016
10:36:22
тебе нужно хранить список процессов
где ключ – тупль
%{
{ TwitterReader, 34543 } => “раз в 10 минут”,
{ TwitterReader, 34545 } => “раз в 20 минут”,
{ FacebookReader, "vasya_pupkin" } => “раз в час”
}
и:
%{
{ TwitterReader, 34543 } => Pid#123
{ TwitterReader, 34545 } => Pid#234,
{ FacebookReader, "vasya_pupkin" } => Pid#345
}

Dmitry
30.08.2016
10:37:49
Ну почти.
%{
{ TwitterReader, 34543 } => pid1,
{ TwitterReader, 34545 } => pid2,
{ FacebookReader, "vasya_pupkin" } => pid3
}

Eugene
30.08.2016
10:37:53
ну или совместить, как я раньше писал:

Dmitry
30.08.2016
10:37:56
да
%{
{ TwitterReader, 34543 } => Pid#123
{ TwitterReader, 34545 } => Pid#234,
{ FacebookReader, "vasya_pupkin" } => Pid#345
}

Eugene
30.08.2016
10:38:14
%{
{ TwitterReader, 34543 } => { pid1, “раз в 10 минут” },
{ TwitterReader, 34545 } => { pid2, “раз в 20 минут” },
{ FacebookReader, "vasya_pupkin" } => { pid3, “раз в час” }
}

Dmitry
30.08.2016
10:38:55
Да, так норм, канает

Eugene
30.08.2016
10:39:11
в последнем мапе достаточно информации, по-моему, чтобы уникально находить пиды и менять им расписания

Dmitry
30.08.2016
10:39:15
Если хабр, т.е. без параметров, то так и будет:
{ HabrReader }
А если юзер проебался - то сам виноват)

Eugene
30.08.2016
10:39:55
можно одним значением с хабром так, угу
не знаю как ты хочешь реализовать “раз в N минут”, но думаю придется хранить еще время “последнего раза”. псевдокод:
%{
{ TwitterReader, 34543 } => { pid1, “раз в 10 минут”, “2014-05-08 23:34:13” },
{ TwitterReader, 34545 } => { pid2, “раз в 20 минут”, “2014-05-08 22:15:14” },
{ FacebookReader, "vasya_pupkin" } => { pid3, “раз в час”, “2014-05-08 19:41:18” }
}

Dmitry
30.08.2016
10:42:42
Тока щас подумал...
Надо всётки функцию
HBRegistry.add(%Sched{..}, &TwitterReader.start_link/1, 34543)
А всё потому что кто-то захочет сделать по умному:
HBRegistry.add(%Sched{..}, &TwitterSupervisor.start_child/1, 34543)
Я гениальная схема опять нахер летит((9

Eugene
30.08.2016
10:43:39
что плохого во втором варианте?

Dmitry
30.08.2016
10:44:03
Что так что так не получается в ключ превратить)
Если функцию засылать
Если модуль засылать - то можно в ключ, т.к. это атом по сути