
Aleh
07.12.2017
10:16:41

Sergey
07.12.2017
10:16:58

Mykola
07.12.2017
10:17:14
саги - это только полрешения

Google

Sergey
07.12.2017
10:17:28

Jan
07.12.2017
10:18:05

Mykola
07.12.2017
10:18:11
ну чем, я делаю так: по очереди вызываю методы у внешних сервисов, смотрю результаты вызова, в конце принимаю решение

Sergey
07.12.2017
10:18:20
то есть мы регаем юзера, оставляя транзакцию в базе не закоммиченной, уходим во внешние сервисы явно и делаем дела, если один из 5-ти сервисов кинул ошибку может быть пробуем еще и еще, но если в конечном итоге мы уже 10 секунд мудохаемся и решаем откатывать все - как быть со стэйтом в сторонних сервисах?

Mykola
07.12.2017
10:18:42
это задача №2

Sergey
07.12.2017
10:18:50
и если ты забиваешь на задачу номер два - то в чем проблема с ивентами?

Aleh
07.12.2017
10:19:18
разница между ивентами и не ивентами только в определении “получателя вызова”, в одном случае это использованием средств языка(полиморфизм), в другом это любая динамика сделанного нами диспатчера. Только и всего

Mykola
07.12.2017
10:19:24
саги покрывают последовательность ивентов, но плохо покрывают их отсутствие

Aleh
07.12.2017
10:19:27
разницы для получателя сообщения нет вообще
разница есть для отправителя

Sergey
07.12.2017
10:19:33
регаем юзера - кидаем ивент - сервисы обрабатывают ивент, и кидают свои. Если у всех все вышло - кидаем команду что бы поменяли статус пользователя.

Google

Sergey
07.12.2017
10:19:49
отправить всем по сообщению в духе "а забудьте"
а если сообщение зафэйлится?

Mykola
07.12.2017
10:20:22
ну ты нормально описал стратегию

Sergey
07.12.2017
10:20:29
что с ивентами что без

Mykola
07.12.2017
10:20:53
а как ты знаешь, что он умер? :)

Sergey
07.12.2017
10:20:55
разница будет лишь в том в каком состоянии будет система между

Mykola
07.12.2017
10:21:06
ты же не знаешь про внешние сервисы ;)
ты же толлько про ивент знаешь

Sergey
07.12.2017
10:21:38
мне не важно кто ивенты кинул - но если ивента небыло например минуту - значит все плохо.
и сервис который эмитит ивенты тоже может у себя в контракте учитывать что "если я ничего не сделал с момента запроса за 50 секунд - то ничего не надо делать"

Mykola
07.12.2017
10:22:24
о! то есть у тебя будет сервис2, который знает последовательность событий, нужных сервису1

Sergey
07.12.2017
10:22:24
не очень красиво но...

Mykola
07.12.2017
10:22:34
коуплинг!

Sergey
07.12.2017
10:22:41

Mykola
07.12.2017
10:23:01
это я как ругательство использую

Sergey
07.12.2017
10:23:15
ты можешь в событии например отправить "короч я тебе послал во столько-то, а вот если ты ничего не успеешь до такого-то времени тупо игнорь"

Google

Sergey
07.12.2017
10:23:19
и никакого кауплинга)
и таким образом выстраивать стратегии по хэндлингу таких ситуаций
а еще возможно ты просто будешь делать бесконечный ретрай и тебе из 5-ти сервисов реально нужно будет только 2 что бы пользователь начал работать с системой, просто не вся функциональность ему будет доступна
но для 99% пользователей все будет хорошо
а для оставшихся 1% все будет плохо но не долго

Mykola
07.12.2017
10:24:47
ты не мне послал, ты делаешь так:
1. шлешь ивент в диспетчер
2. ждешь другого ивента от диспетчера
3. если он не пришел за 10 сек, то падаешь с "я упал, причина не ясна"
супер?

Sergey
07.12.2017
10:25:12
ммм
саги чел

Mykola
07.12.2017
10:25:22
дык это и есть саги

Sergey
07.12.2017
10:27:53
- модуль координатор подписался на событие "юзер зареган" "юзер зареган в рефералке", "юзер зареган в где-то еще" и т.д.
- модуль юзеров отправил ивент о том что новый юзер неподтвержденный создан.
- модель координатор словил событие и отправил команду требуемым сервисам (ладно, тут будет кауплинг но он так и так будет)
- экторы сделали свои события о том что у них все получилось или нет.
- координатор решил что делать дальше и если все хорошо - кинет команду пользователям что бы тот перевел статус юзера или роли добавили или чего там надо. Ну или отметить пользвателя что тот зафэйлился.


Mykola
07.12.2017
10:29:02
да я знаю, я просто не описал вот этот "координатор"
но смотри
координатор знает что? последовательность действий, нужных для регистрации
почему это знает некий координатор, а не сам сервис регистрации?
кохижн!
обработка исключительных ситуаций куда?
что делать с заплутавшими ивентами? (впоминаю башорг про пинг, который 4 дня гулял)
и опять же, что делать, если мы хотим регистрацию ограничить по времени? слать через 10 секунд ивент "регистрация зафейлилась", чтоб этот координатор прекратил дальнейшие действия?

Google

Артур Евгеньевич
07.12.2017
11:36:04
cohesion = связность, не?
Почему нельзя использовать оригинальные термины, и обязательно создавать путаницу? Связность, связанность, завязанность, зацепление, привязанность

Sergey
07.12.2017
11:47:34
а, ты Антону

Anton
07.12.2017
11:48:20
ну вообще-то я именно и отметил, что ты употребил кохижен и связность в одном предложении

Sergey
07.12.2017
11:49:30

Anton
07.12.2017
11:51:12

Admin
ERROR: S client not available

Anton
07.12.2017
11:51:57
в общем спор ни о чем. Все всё понимают (надеюсь).

Mykola
07.12.2017
11:54:39
а что ты предлагаешь?)
я не предлагаю, я просто говорю, что евенты не всегда помогают нам порешать архитектурные вопросы в целом... хоть ты и уменшаешь связность в отдельно взятом месте, но она никуда не девается, эта связность прописана в условии задачи
и где-то это всплывет

Sergey
07.12.2017
11:56:07
она помогает избегать циклическиз зависимостей, так лучше?

Mykola
07.12.2017
11:56:35
нет, циклические зависимости не есть проблема сама по себе
ну зависит один рест-сервис от другого, и наоборот
в чем проблема?

Sergey
07.12.2017
12:19:40

Mykola
07.12.2017
12:27:50
это не проблема, это просто факт

Sergey
07.12.2017
12:55:57
это симптом плохой декомпозиции
если у тебя есть два модуля между которыми есть циклическая зависимость - значит либо это должен быть один модуль, либо у тебя должен быть третий модуль

Mykola
07.12.2017
14:33:42
почему? это нарушает какой-то принцип?

Google

Anton
07.12.2017
14:36:10
Как по мне если есть циклическая зависимость, то в таком случае нарушается сам принцип модульности.
т.е. эти модули нельзя разделить и использовать поотдельности.

Mykola
07.12.2017
14:36:33
ребят, KISS

Sergey
07.12.2017
14:36:40

Mykola
07.12.2017
14:36:58
если модули нельзя разделить, то может их и не надо разделять?

Sergey
07.12.2017
14:36:58
ребят, KISS
KISS не в том что бы "втупую нахерачить" а втом что бы можно было тупым людям пользоваться
если их нельзя разделить - это один модуль

Mykola
07.12.2017
14:37:22
да блин, ну есть реальный пример из жизни, который работает

Sergey
07.12.2017
14:37:44
вот
принцип)

Mykola
07.12.2017
14:38:25
а вот тут про пекеджи, это немного не совсем модули
это куски кода

Anton
07.12.2017
14:39:07
модули - это что угодно, куски приложения

Mykola
07.12.2017
14:39:21
но не наоборот
а значит принципы, которые касаются кусков кода не обязательно должны касаться всех модулей
ок? :)
ну пример из жизни, как и обещал: контейнер, который создает ноды внутри себя, и устанавливает этим нодам парент самого себя
пример циклической зависимости, которая работает как надо