
Oleg
19.09.2017
20:46:07
юзера и без oauth может захотеть создать
а иногда более одного имейла привязать

Vladimir
19.09.2017
20:47:35
сложный бизнес-кейс, однако, нужно выдумывать оригинальное техническое решение
запилить сессию, в рамках сессии генерить некий уид пользователя, заводить по нему агрегат и лепить к нему имейлы. Хочет лепить несколько одинаковых имейлов к разным уидам? да ради бога, делать письмо с особой ссылкой на прикреп

Google

Oleg
19.09.2017
20:51:54

Vladimir
19.09.2017
20:52:45
или вообще выбрать первый имейл "лидирующим" и лепить все к нему, ведь про "отвязывать имейлы" речи не было
а с остальным ивеншуал консистент вьюхи и маппинги разберутся

Oleg
19.09.2017
21:17:05


Max
20.09.2017
06:30:01
я подумал. На счет саги вчера наврал - это не распределенная транзакция - это описание бизнес процесса, который применяется частично, и для системы в целом, не является атомарной операцией. Соотвественно относительно себя может привести систему в какой то момент к неконсистетному состоянию, (т. е. например создаст пользователя в одном агрегате, но не создаст в другом). Но за то через какое-то время все таки доделает свои части бизнес процесса (дорегистрирует пользователя в другом агрегате ну или откатит изменения в первом) и все будет хорошо.
как я понимаю решение за которое топит олег - это например батч в кассандру в несколько таблиц(Пользователи, Имейлы и тд) как легковесные транзакции - лично мне нравится
я так и не нашел докладов или статей от грега про саги или распределенные транзакции, но вроде как он и не говорит что "вот везде используйте es" он говорит "нужно построить отчет как sql - ну выгрузи данные в sql и построй там отчет " так что если тут ставится задача стронг консистенси для миллиона пользователей у которых есть миллион идентификаторов можно и не упираться, а сделать через какой нибудь отдельный консистентый сервис
можно сделать через сагу - но саги все равно придется отдавать на откуп хотябы техподдержки
можно сделать просто два независимых агрегата и говорить пользователю - типа имейл мы твой приняли, все ок, а вот username поменяй - но это бизнес может послать вас(а может и не послать)
короче cqrs/es это больше конь в вакууме чем конкретное решение - это просто идея - она не может ответить на вопрос "а как вот мне миллиард пользователей держать в консистетном состоянии" - этим занимаются другие системы и другие подходы
кстати агрегаты это не из cqrs/es это частное решение притянутое из ddd, которое решает проблему маленьких быстрых консистентных островков - заметьте в акка персистенс - нету PersistentAggregate


Vladimir
20.09.2017
06:31:43

Oleg
20.09.2017
06:38:46
В общем, основная идея на которую я сагрился в том, что мы каким-то хорошо известным способом можем поддерживать строгую целостность в CQRS при самой разнообразной эволюции логики. И если мы пришли к тому, что это как минимум неочевидно и требует проработки для каждого отдельного случая, я просто вернусь к своему замечанию о том, что авторизация - это та тема, где нам нужно иметь консистенси не повсюду, но в каком-то хотя бы самом ядре, учитывая что оно обязательно потом будет связано с биллингом, секьюрити и пр.
Поэтому для мысленных игр с эвентсорсингом стот взять какую-то менее ответственную область. Какие-нибудь посты и комменты, мессаджи и лайки, витрину или корзину
Ну или если ОП сознательно принимает эвенчуал в своей авторизации, у меня тоже нечего добавить


Vladimir
20.09.2017
06:53:31
таймауты, очевидно, должен хранить некий роутер, или сама вьюха будет уведомлять агрегат "я перестроилась"
в общем как пишут в тройке-другой статей, каждый кейс требует четкого рассмотрения бизнес требований и компромиссов. Можно сделать ивентсорсинг в юзерсторадже, если понимать все требования (а можно mysql с транзакциями затянуть)

Oleg
20.09.2017
06:55:21

Vladimir
20.09.2017
06:56:09
я настолько морально готов к такому дерьму, что даже не бомбит)

Google

Max
20.09.2017
08:03:27
В общем, основная идея на которую я сагрился в том, что мы каким-то хорошо известным способом можем поддерживать строгую целостность в CQRS при самой разнообразной эволюции логики. И если мы пришли к тому, что это как минимум неочевидно и требует проработки для каждого отдельного случая, я просто вернусь к своему замечанию о том, что авторизация - это та тема, где нам нужно иметь консистенси не повсюду, но в каком-то хотя бы самом ядре, учитывая что оно обязательно потом будет связано с биллингом, секьюрити и пр.
Поэтому для мысленных игр с эвентсорсингом стот взять какую-то менее ответственную область. Какие-нибудь посты и комменты, мессаджи и лайки, витрину или корзину
+

Митко Соловец?
20.09.2017
08:11:23
лол в чате хаскеллистов маленько скалку обсирают, кеек

Aleksey
20.09.2017
08:12:09

Митко Соловец?
20.09.2017
08:12:30
да там затирают про какой-то процедурный код в определениях

Nick
20.09.2017
08:13:28

Aleksey
20.09.2017
08:13:30

Nick
20.09.2017
08:14:00
Слава богу, что не Хаскель)

Митко Соловец?
20.09.2017
08:14:13

Nick
20.09.2017
08:14:26
Где-то ещё есть скала чат?

Митко Соловец?
20.09.2017
08:14:40
вот реально, захожу сюда, чуваки обсуждают прод, акка стримы, проблемы жизненные

Aleksey
20.09.2017
08:14:55
я спокойно отношусь к этому. хаскелисты ребята умные, предмет спора понимают. вот отличии от крепких середничков из джаваспрингго с экспертным мнением.

Митко Соловец?
20.09.2017
08:15:02
захожу к хаскеллистам, они превозмогают синтаксис

Nick
20.09.2017
08:15:35

Митко Соловец?
20.09.2017
08:15:52

Aleksey
20.09.2017
08:16:07

Nick
20.09.2017
08:16:19
Да может он не про тебя)
Он просто свои статистические наблюдения привёл)

Oleg
20.09.2017
08:17:06

Nick
20.09.2017
08:17:41
Он хотел написать хаскелистов

Митко Соловец?
20.09.2017
08:17:58
Процедурный код в определениях попахивает Скалкой. За ним - туда

Google

Митко Соловец?
20.09.2017
08:18:15
@odomontois

Oleg
20.09.2017
08:18:23

Митко Соловец?
20.09.2017
08:18:56
ну тип посылать людей с одного языка на другой - ну такое, не?)

Oleg
20.09.2017
08:18:56
посмотрите на akka GraphDSL

Митко Соловец?
20.09.2017
08:19:11

Oleg
20.09.2017
08:19:27
все лучшие придут в скалу
а эти так и будут сидеть без процедурного кода в определениях

Nick
20.09.2017
08:20:11
В голос

Alex
20.09.2017
08:40:47
/toxic


folex
20.09.2017
09:20:51
я подумал. На счет саги вчера наврал - это не распределенная транзакция - это описание бизнес процесса, который применяется частично, и для системы в целом, не является атомарной операцией. Соотвественно относительно себя может привести систему в какой то момент к неконсистетному состоянию, (т. е. например создаст пользователя в одном агрегате, но не создаст в другом). Но за то через какое-то время все таки доделает свои части бизнес процесса (дорегистрирует пользователя в другом агрегате ну или откатит изменения в первом) и все будет хорошо.
как я понимаю решение за которое топит олег - это например батч в кассандру в несколько таблиц(Пользователи, Имейлы и тд) как легковесные транзакции - лично мне нравится
я так и не нашел докладов или статей от грега про саги или распределенные транзакции, но вроде как он и не говорит что "вот везде используйте es" он говорит "нужно построить отчет как sql - ну выгрузи данные в sql и построй там отчет " так что если тут ставится задача стронг консистенси для миллиона пользователей у которых есть миллион идентификаторов можно и не упираться, а сделать через какой нибудь отдельный консистентый сервис
можно сделать через сагу - но саги все равно придется отдавать на откуп хотябы техподдержки
можно сделать просто два независимых агрегата и говорить пользователю - типа имейл мы твой приняли, все ок, а вот username поменяй - но это бизнес может послать вас(а может и не послать)
короче cqrs/es это больше конь в вакууме чем конкретное решение - это просто идея - она не может ответить на вопрос "а как вот мне миллиард пользователей держать в консистетном состоянии" - этим занимаются другие системы и другие подходы
кстати агрегаты это не из cqrs/es это частное решение притянутое из ddd, которое решает проблему маленьких быстрых консистентных островков - заметьте в акка персистенс - нету PersistentAggregate
В кассандре же нельзя serial (lightweight transactions) на несколько таблиц делать. На несколько партишнов ключа-то нельзя. Или я не прав, и можно? Очень интересно, если так.


Oleg
20.09.2017
09:22:18

folex
20.09.2017
09:22:51
https://docs.datastax.com/en/cql/3.1/cql/cql_reference/batch_r.html
> In Cassandra 2.0.6 and later, you can batch conditional updates introduced as lightweight transactions in Cassandra 2.0. Only updates made to the same partition can be included in the batch because the underlying Paxos implementation works at the granularity of the partition.

Oleg
20.09.2017
09:24:34

Евгений
20.09.2017
09:24:38
Coq (язык формулировки математических теорий и программирования, основанный на зависимых типах, описан в книге «Coq’art: Interactive theorem proving and program development» отчасти использует алгоритм Хиндли — Милнера с определенным количеством эвристик, однако его система типов настолько сложна и мощна, что вывод типов в ней является вычислительно неразрешимой задачей, поэтому очень часто типы приходится указывать вручную.

guga
20.09.2017
09:28:21
Или он поверит, а потом в рантайме упадёт?

Евгений
20.09.2017
09:28:41
мб он не проверяет?
или проверяет только для простых случаев

Google

Oleg
20.09.2017
09:30:45

folex
20.09.2017
09:31:27

Oleg
20.09.2017
09:31:36
через SERIAL, да

folex
20.09.2017
09:35:12
через SERIAL, да
Что-то это расходится с моей интерпретацией документации. Пойду попробую.
По идее нельзя писать IF [NOT] EXISTS на несколько партишнов => таблиц, а по-другому LWT на запустишь же?

Oleg
20.09.2017
09:42:16
в этом вся суть его
ты же там только и делаешь, что типы доказываешь, а не кот котишь

folex
20.09.2017
09:44:04
cqlsh:test> CREATE TABLE test.customers (
... user bigint,
... balance int,
... PRIMARY KEY (user)
... );
cqlsh:test> CREATE TABLE test.purchases (
... user bigint,
... expense_id bigint,
... amount int,
... PRIMARY KEY (user, expense_id)
... );
cqlsh:test> BEGIN BATCH
S; ... INSERT INTO customers (user, balance) VALUES (1, -10) IF NOT EXIST
; ... INSERT INTO purchases (user, expense_id, amount) VALUES (1, 1, 10)
... APPLY BATCH;
InvalidRequest: Error from server: code=2200 [Invalid query] message="Batch with conditions cannot span multiple tables"
@odomontois ^
или ты предлагаешь вручную выставлять SERIAL? Но это вроде невозможно.

Nick
20.09.2017
09:45:05
@odomontois почему у вас так медленно работает сайт? отвечай !

folex
20.09.2017
09:46:40
cqlsh:test> CREATE TABLE test.customers (
... user bigint,
... balance int,
... PRIMARY KEY (user)
... );
cqlsh:test> CREATE TABLE test.purchases (
... user bigint,
... expense_id bigint,
... amount int,
... PRIMARY KEY (user, expense_id)
... );
cqlsh:test> BEGIN BATCH
S; ... INSERT INTO customers (user, balance) VALUES (1, -10) IF NOT EXIST
; ... INSERT INTO purchases (user, expense_id, amount) VALUES (1, 1, 10)
... APPLY BATCH;
InvalidRequest: Error from server: code=2200 [Invalid query] message="Batch with conditions cannot span multiple tables"
в общем я вижу что это напрямую следует из документации: паксос работает на уровне 1го партишна, поэтому в кассандре в принципе нельзя так сделать

Mikhail
20.09.2017
09:47:12


Max
20.09.2017
09:53:23
cqlsh:test> CREATE TABLE test.customers (
... user bigint,
... balance int,
... PRIMARY KEY (user)
... );
cqlsh:test> CREATE TABLE test.purchases (
... user bigint,
... expense_id bigint,
... amount int,
... PRIMARY KEY (user, expense_id)
... );
cqlsh:test> BEGIN BATCH
S; ... INSERT INTO customers (user, balance) VALUES (1, -10) IF NOT EXIST
; ... INSERT INTO purchases (user, expense_id, amount) VALUES (1, 1, 10)
... APPLY BATCH;
InvalidRequest: Error from server: code=2200 [Invalid query] message="Batch with conditions cannot span multiple tables"
я хз с моего дивана все выглядело ок)))

folex
20.09.2017
09:54:00

Alex
20.09.2017
10:12:24
инференс для завтипов неразрешим да
ему не обязательно выводить, достаточно проверить что указанное непротиворечиво

Oleksandr
20.09.2017
10:16:11
а может быть так, что при изменении указанного юзером типа вся ветка автоматического вывода пойдет в совсем другую сторону?
теоретически-то ясно, что может, а в реальных ЯП ?

Oleg
20.09.2017
10:25:00

Google

Oleg
20.09.2017
10:25:04
но без условий можно

folex
20.09.2017
10:25:19
@odomontois как это синтаксически выглядит, можешь привести пример?
потому что насколько я понимаю, единственный способ сделать consistency = SERIAL это использовать IF

Oleg
20.09.2017
10:28:43

folex
20.09.2017
10:29:12
ЙЕЕЕ

Oleksandr
20.09.2017
10:30:52
гм, надо это заскриншотить и сохранить куда-то, Олег признает, что не прав

Aleksei
20.09.2017
10:31:32
он не признает что неправ
он признает что кто то другой прав
не надо передергивать

folex
20.09.2017
10:38:07
В sbt если в рутовом сабмодуле какие-то настройки вынести в inThisBuild, они же подтянутся всеми остальными сабмодулями, верно?