
Alexander
27.12.2017
10:13:00
Supervisor.start_child(MsinSup, SomeAgent, {Agent, :start_link, [ как там он инициализируется а забыл ] }, что там ещё надо я забыл)
из любого места, в любой супервизор так можно засунуть вообще левого чайлда

Dmitry
27.12.2017
10:13:20
Обычно стейт процесса, когда изменения важны и должны после падения сохраниться - обрабатывается и синхронизируется в ETS или в базу данных. В случае падения оттуда считываются.

Alexander
27.12.2017
10:13:24
это костыль правда . )

Google

Dmitry
27.12.2017
10:14:25
Валидация данных не должна крэшить процесс далее, чем первые стадии рапид прототайпинга.

Alexander
27.12.2017
10:15:34
про валидацию я хз, если не должна — то try/catch и возвращать тупл {ok, ...} / { error, ...}

Dmitry
27.12.2017
10:16:21
Либо ловящийся try rescue с обработкой и выдачей, что конкретно не так в данных, либо такая же ошибка, но выдаётся как ok / error тупл.

Evgeny
27.12.2017
10:16:32
либо оно прокидывается выше где все равно ловится

Dmitry
27.12.2017
10:17:39

Evgeny
27.12.2017
10:18:52

Dmitry
27.12.2017
10:19:29
Таблица ETS создаётся одна на всех подобных клиентов.

Alex
27.12.2017
10:19:46

Dmitry
27.12.2017
10:19:52
Процесс сам не умрёт по той простой причине, что он ничего делать не будет.
И это не костыль.

Alex
27.12.2017
10:20:38
или вообще в топлевел супервизоре ее создать

Google

Evgeny
27.12.2017
10:20:42

Dmitry
27.12.2017
10:21:43
Не умрёт процесс, который держит ETS и ничего более не делает.
Ему и свой стейт не нужен, потому что он ничего не делает кроме как держать ETS.

Evgeny
27.12.2017
10:26:01
Это я понял
но генерить множество ничего не делающих процессов, как-то претит мне, как бывшему плюсовику.
"Надо себя заставить, братан" (с)
в эрланге это норма, ибо относительно дешево

Dmitry
27.12.2017
10:28:00
Eugene У тебя как в OS при старте VM - уже 30+ легковесных процессов будет всяких там от kernel для работы с сетью, io и так далее. Так же и сложная аппликация ещё как минимум столько же создать просто необходимых для работы этого приложения.

Evgeny
27.12.2017
10:31:55

Ilja
27.12.2017
10:37:55
Let it crash проще объяснить на людях. Если прораб посылает рабочего рыть тоннель, то рабочий сам не в состоянии обработать исключение, возникающее при обвале. Это задача прораба - расхлебать. А сам рабочий - let it crash.

Dmitry
27.12.2017
10:39:29
И если информация, которую прораб хранит настолько важна, что не должна потеряться при обвале - ему нужна рация, чтобы он её сообщал в другое место.

Ilja
27.12.2017
10:43:26
Да, если прораба собъёт автобус, то он перед этим должен был позаботиться о том, чтобы оставить в офисе рабочую документацию, которую можно будет передать другому прорабу.

Dmitry
27.12.2017
10:43:49
*рабочего
Я про рабочего писал.

Ilja
27.12.2017
10:44:27
Да, я понял. Просто расширил дерево супервизирования. ?

Evgeny
27.12.2017
11:07:35
А если офис ночью могут внезапно снести, то ....

Alexander
27.12.2017
11:12:27

Evgeny
27.12.2017
11:14:31
при этом прораб по-бырому рожает еще одного рабочего

Sergey
27.12.2017
11:15:03
безысходность какая то

Alexander
27.12.2017
11:15:33
Да все ок. Мы просто уже в крайности пошли

Google

Sergey
27.12.2017
11:15:36
в этой истории нехватает только взрывов на заднем фоне

Alexander
27.12.2017
11:16:11
Не может это не работать совсем, когда куча людей счастлива и только наш боярский чатик недоволен

Evgeny
27.12.2017
11:16:16

Sergey
27.12.2017
11:18:37
а есть какой то патерн , сохранения всех эвентов перед тем как начать с ними работать и последующим востановлением стейта по ним ?
у gen_server
по типу akka persistence

Evgeny
27.12.2017
11:19:36
ну наверное можно перед смертью сохранить стейт, а потом восстановить, но очередь сообщений теряется восстановлению не подлежит

Ilja
27.12.2017
11:20:02
Скажем так, let-it-crash в эрланговском исполнении позволяет делать системы с девятью девятками аптайма. Если количество девяток представляет какую-то ценность для вашего бизнеса - то эрланговский let-it-crash показывает правильный путь к решению. Никто не говорит, что девять девяток - это просто. Это высший пилотаж, конечно. Но есть ли, с чем сравнивать?
Просто есть определённые ценности и ориентиры: стабильность времени ответа, аптайм... BEAM ориентирован именно на них. Хотите всего этого - осваивайте.

Evgeny
27.12.2017
11:20:04
а лучше, как тут люди советуют, вообще стейт вынести подальше от камнепадов

Ilja
27.12.2017
11:20:41
А, ну ещё смузи в Рокете. ?
Но это в экосистеме не от рождения.

Evgeny
27.12.2017
11:21:37

Alexey
27.12.2017
11:22:01
defmodule MyApp.Server do
use GenServer
# ...
def init(_) do
Process.flag(:trap_exit, true)
state = MyApp.Backup.fetch_state()
{:ok, state}
end
# ...
def terminate(_reason, state) do
MyApp.Backup.store_state(state)
end
end

Ilja
27.12.2017
11:23:03
В Эликсире ещё и Task есть.

Alexander
27.12.2017
11:23:35

Sergey
27.12.2017
11:24:21
неделя перед новым годом самое то

Ilja
27.12.2017
11:24:48
Недавно слышал мнение, что командные видеоигры очень повышают способность программистов к эффективной командной работе. Но я не уверен, что PS4 подходит. Вероятно, речь о чём-то тактическом.
Вероятно, игра в страйкбол работает так же, только гораздо дороже и реже.
Alexey trap exit необязателен, если State хранится выше по дереву супервизирования.

Google

Ilja
27.12.2017
11:28:21
И, собственно, он же будет trap exit-ом только для тех процессов, с которыми слинкован.
Я просто сначала не совсем понял, для какой цели он здесь.

Slava
27.12.2017
11:30:34
по опыту могу сказать, что лучше всего организовывать бухачи для команды. только так все хоть немного раскрываются, ближе общаются и формируется что-то типа командного духа

Alexey
27.12.2017
11:30:56
ну скорее как пример. В тех же рельсах джобы в сайдкике тоже могут грохаться, а потом уходить в retry
не понимаю в чем проблема let it crash

Slava
27.12.2017
11:32:46

Alexey
27.12.2017
11:34:24
Где-то приводился пример на основе серверов. Зашел ты погуглить - гугл упал. Обновляешь страничку, ждешь когда оживет. Ожил - получил данные

Slava
27.12.2017
11:38:17
в этом случае речь про application server'a, скорее, вернее про процессы/треды в них и если там вылетел эксепшн, то они обычно просто перезапускаются по отдельности.
но ведь они не держат в себе какой-либо стейт в отличие от генсервера.
не будешь же ты расчитывать на хранение данных в памяти в треде/процессе пумы/юникорна, например

Alexander
27.12.2017
11:52:22
Но реальность будет такая

Admin
ERROR: S client not available

Evgeny
27.12.2017
12:01:41
Зачем в чайлдспеках может пригодится значение :brutal_kill?
Родил процесс и сразу убил? Зачем?
а дошло
это значит, что после того как будет отдана отмашка сдохнуть, супервизор не будет ждать пока процесс обработает завершение и сразу его прибьет, я верно понял?


Dmitry
27.12.2017
12:16:13
"клиент уползает с поломаными ногами, а ты делаешь вид что вообще ничего не произошло" - Ну здесь архитектурная ошибка.... Вот у нас в системе до сих пор, иногда заглянешь в логи, а там крэши, но большую часть кршей конечные пользователи не замечают никак. Потому что let it crash - помогает сделать архитектуру так, что непредвиденные и разные не пойманные ошибки никак не влияют на конечный результат. Что-то рухнуло, перезапустилось, обработало пользователь конечный вообще ничего не заметил.
Суть в конечном итоге, что let it crash философия сводится к тому, что пиши свою систему так, что в случае непредвиденных ошибок - она будет все равно работать и дает механизмы для построения подобной системы. Поэтому не понимаю критики в данном случае. П.с. от непонимания оной - один участник чата уже свалил)

Evgeny
27.12.2017
12:19:36
все-таки эликсир пересахарен
(fn(x) -> x end).(a: "a", b: "b")
тоже самое что и
(fn(x) -> x end).([a: "a", b: "b"])
ватта фак?

Google

Evgeny
27.12.2017
12:21:34
точнее я знаю что за фак
вопрос нафуя?

Slava
27.12.2017
12:23:12
ответ: раби
вопрос: а что руби-то?
предполагаемый ответ: перл

Evgeny
27.12.2017
12:24:06
ответ РГМ - руби гойловного моска

Marat
27.12.2017
12:24:26

Evgeny
27.12.2017
12:24:45
скобки поставил - ничего не поменялось - норм так

Dmitry
27.12.2017
12:24:55
Eugene : Передавать именные аргументы в функцию последним аргументом красиво:System.cmd("ls", [], env: [{"TEST", "test"}], cd: "/") вместо: System.cmd("ls", [], [env: [{"TEST", "test"}], cd: "/"])
Интересно форматтер это исправляет или нет

Evgeny
27.12.2017
12:25:07
я знаю, как эта херь работает

Le
27.12.2017
12:25:15
каждую неделю новый синтаксисобатхерт. не надоело?

Slava
27.12.2017
12:25:34

Vasiliy
27.12.2017
12:25:41
ruby:
def foo(x, hash={})
foo("blah", a: 12, :b => 13)

Dmitry
27.12.2017
12:26:40
@sdzyba : Убирает форматтер, хорошо.

Andrey
27.12.2017
12:26:51
есть мнение что если тебе не нравится по каким-то причинам сахар, то можно просто молча его не есть

Le
27.12.2017
12:27:07

Andrey
27.12.2017
12:27:14
тем более что есть lfe, alpaca просто erlang в конце концов

Dmitry
27.12.2017
12:28:17
@nitrodev Проверил тоже, уже.

Evgeny
27.12.2017
12:30:10
тут не только вызов функций оно везде так работает.
просто неконсистентность.
есть a. Список из одного элемента a будет [a]
есть a: "a", b: "b" - список из двух кортежей. [a: "a", b: "b"] - список списков кортежей? А вот и нет.
Я только что искал ошибку, неправильно чайлдспеки из-за этого написаны

Dmitry
27.12.2017
12:31:27
Eugene Помойму все консистентно. : - позволяет убрать [ скобки
Если нужен лист в листе, то [[a: "a"]]
Никакие скобки автоматически нигде не добавляются, просто их можно не писать, если : ни них уже указывает.