
Ilja
18.12.2017
08:23:34
Исторически за консистентность данных отвечает БД, а не рантайм. В вашем распоряжении на выбор: оптимтстичные блокировки, пессимистичные блокировки, клиринговая логика... Сильные уровни изоляции транзакций (с сериализуемостью) и т.д. Для того, чтобы по нескольку раз не прлсить денег или не платить. А таймауты соединений - они всего лишь уменьшают вероятность, но не гарантируют отсутствие конфликтов. Это не уровень бизнес-логики.

Alex
18.12.2017
08:41:30
Я не в курсе за апи страйпа, но у них могут быть цивилизованные методы выяснить, была ли транзакция в том таймауте, или не была. А если нет, нужно сразу останавливаться, без каскада в другого провайдера, и говорить пользователю про технический сбой
Потом при сверке уже разгребать - дооказывать услугу пользователю при необходимости

Evgeny
18.12.2017
10:14:04

Google

Alexander
18.12.2017
10:47:45
Ну ребят вы что-то вообще
От всех проблем спасает стейтмашина или очередь

Alex
18.12.2017
10:49:39
кстати, транзакции в бд очень плохо согласуются с транзакциями в сети.

Roman
18.12.2017
13:08:19
подскажите, есть ли уже какие-нибудь книги по phoenix 1.3?

Alex
18.12.2017
13:28:34

Roman
18.12.2017
13:29:18

Alex
18.12.2017
13:30:20

Alexander
18.12.2017
16:38:09
118
)

Buckler
18.12.2017
16:44:02
Hello, Vyacheslav!
Please, calculate:
38+67=...
If you don't answer - you'll get banned from the channel...
Good luck!

Ilja
18.12.2017
16:47:21
Save half on Phoenix in Action and these other selected books. Just enter mllessellt in the Promotional Code box when you check out. Expires Tuesday, December 26. Only at manning.com
https://www.manning.com/books/phoenix-in-action?trk_msg=SUHOFFDSRA44J1CPDB3USITBI4&trk_contact=OOSFKR732SLEB9P9MV0RS4T51K&trk_sid=P62L7PK1VCG0B2FD25UINJMGBO&utm_source=Listrak&utm_medium=Email&utm_term=https%3a%2f%2fwww.manning.com%2fbooks%2fphoenix-in-action&utm_campaign=New+MEAP!+Half+off+Phoenix+in+Action+%2b+other+selected+books

Roman
19.12.2017
07:18:44
народ, поможите, а? туплю безбожно. Есть необходимость сделать рассылку email нотификаций юзерам. Событий нотификации вагон и маленькая тележка — порядка 50. Хочу прикрутить GenStage для этого дела. То есть один broadcaster, который плюёт то или иное событие и его ловит нужный consumer. Не могу разобраться как сделать так, чтобы событие ловил только искомый consumer, а не все подряд

Google

Fey
19.12.2017
07:31:58
если я правильно помню, то там нет такой опции. надо велосипед городить
я даже как-то городил, но потом вообще отказался от генстейджа

Dmitry
19.12.2017
07:39:36
Он работает ровно наоборот
Консюмер запрашивает данные

Alexey
19.12.2017
07:40:38
может какой pubsub применять?
gproc или tasks

Roman
19.12.2017
07:41:13
вот я и чую что где-то я накосячил :) Вроде бы говорили что GenStage заменил GenEvent
но, видять, я не понял нифига
не уверен что таски то, что мне нужно

Dmitry
19.12.2017
07:42:12
Тебе нужен Phoenix.PubSub

Roman
19.12.2017
07:43:48
идея такая: есть апи, оттуда прилетает некая структура (скажем, тип нотификации и id записи в базе). Это дело прилетает в модуль и он вызывает нужный хэдлер для конкртеной нотификации (ищем по типу)
ну и дальше уже генерим email и так далее

Marsel
19.12.2017
08:25:03
я нуб в эликсире, но с текущими знаниями я бы сделал так: прилетевшую структуру кладем в хранилище(бд или EST), запущенный GenStage(consumer просит у producer список записей для работы) смотрит в хранилище
думаю знатоки поправят что тут не так)

Roman
19.12.2017
08:28:27

Ilja
19.12.2017
16:39:43
GenStage - это не замена GenEvent. GenStage - это реактивные потоки. Вернее, воплощение этой концепции: http://www.reactive-streams.org/
Если нужен сервис, который от апстрим-сервиса принимает, скажем, видеопоток по быстрому каналу и отдаёт даунстрим (клиенту) по медленному - вот тут как раз нужен GenStage, чтобы не заполнить всю память буферизованным потоком.
То есть, в ситуациях, когда данные поступают быстрее, чем отдаются, GenStage позволяет создавать обратное давление и работать в постоянном объёме памяти.
К данному кейсу не имеет отношения, но на будущее пригодится, думаю.

Google

Dmitry
20.12.2017
10:10:14
В каком кейсе вы называете сообщения через сокеты?
snake_case? или CamelCase? или lowerCameleCase?

Mikhail
20.12.2017
10:14:35
junior_CustomCase

Alexey
20.12.2017
10:19:49
OBERONCASESTYLE!

Slava
20.12.2017
10:23:19
uSeRnAmE

Voldemar
20.12.2017
10:26:09
u53Rn4m3

Alexey
20.12.2017
10:26:50
ну или, как вариант, 0001, 0002, 0003

Maxim
20.12.2017
10:27:12

Dorzhi
20.12.2017
10:31:44
l33tc4s3

Евгений
20.12.2017
10:36:24
kebab-case

Slava
20.12.2017
10:37:54
⠇⠑⠑⠞⠉⠁⠎⠑
только придется распечатывать код с выпуклостями

Mikhail
20.12.2017
10:50:28
чот напомнило
https://forum.kinopoisk.ru/picture.php?albumid=2897&pictureid=57226

Admin
ERROR: S client not available

Mikhail
20.12.2017
10:51:30
превьюшка не сработала, кину так

Alexey
20.12.2017
10:55:34
семисегментный по-ходу

Vladimir
20.12.2017
11:04:58
циферок нету

Roman
20.12.2017
11:06:09

Mikhail
20.12.2017
11:06:58
хищники-гуманитарии

Aldar
20.12.2017
13:05:57
хех, если у меня воркер прямо на старте кидает исключение, супервизор его не поднимает?

Google

Aldar
20.12.2017
13:07:22
прописываю ему worker(Worker, [], restart: :permanent), у супервизора настройка :one_for_one

Alexander
20.12.2017
13:17:29
ну вообще-то да.
send(self(), init)
...
handle_info(init, ...)

Ilja
20.12.2017
13:17:51
Старт производится по статическому списку в Supervisor.start_link? Или динамически с помощью Supervisor.start_child?
Предполагаю, что первое. В этом случае официальная документация к Erlang OTP даёт ответ:
To ensure a synchronized startup procedure, start_link/2,3 does not return until Module:init/1 has returned and all child processes have been started.
И далее:
If any child process start function fails or returns an error tuple or an erroneous value, the supervisor first terminates all already started child processes with reason shutdown and then terminate itself and returns {error, {shutdown, Reason}}.

Aldar
20.12.2017
13:26:18


Ilja
20.12.2017
13:29:52
В смысле, в если воркер кидает на старте исключение, то супервизор не только его не поднимает, но и сам не поднимается.
И это имеет смысл. Потому что все эти стратегии супервизирования и restart: :permanent относятся к той части жизненного цикла воркеров, когда они уже проинициализированы и принимают сообщения.
Если они не могут пройти инит - система неработоспособна.
Поэтому она падает, в соответствии с концепцией "Fail fast".

Dmitry
20.12.2017
17:18:44
Ребят, хочу написать книжку на Manning по Devops в эликсире!
Помогите определиться с содержанием )
Писать ли обзор редакторов для эликсир с плагинами?
Второй вопрос - distillery только, иди exrm тоже
Потом чем деплоить - bootleg, edelivery, Mina, Capistrano
Потом надо написать про билд тачки, стейдж тачки
Раскрутка их с помощью ansible
Потом контейнеризация в docker через swarm и kubernetes