@proelixir

Страница 96 из 1045
Eugene
30.08.2016
09:30:13
да

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

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

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
в идеале ты должен откоментить воркера какого-то, в котором будет выполнятся уже реальная работа: # worker(Heartbeat.Worker, [arg1, arg2, arg3]),
Так в этом то и вопрос. Могу я тут указывать воркеров, или могу только супервизор, в котором уже воркеров

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 минут будет слать сообщение “поработай" нужному пиду

для начала предлагаю решать эту задачу без БД вообще, само собой

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
Что так что так не получается в ключ превратить)

Если функцию засылать

Если модуль засылать - то можно в ключ, т.к. это атом по сути

Страница 96 из 1045