?

Log in

Event Sourcing и Моноид - Язык программирования Scala

> Recent Entries
> Archive
> Friends
> Profile
> Официальный сайт Scala

April 1st, 2017


Previous Entry Share
mikkim08
06:52 pm - Event Sourcing и Моноид
Вот говорят, что есть т.н. event sourcing, когда в базу записываются только event-ы, например
"изменить значения таких-то полей у такой-то instance-a такой-то entity", "удалить такой-то instance" и т.д. А потом по последовательности этих event-ов можно восстановить весь state.

Выглядит это восстановление так: каждый event превращается в функцию: State => State, которые потом "композируются". Поскольку A => A с операцией andThen образуют моноид, то процесс восстановения можно записать:
def createTransform(e: Event): State => State = ...
val transform = events foldMap createTransform
transform(state)
Логично ?
Даёт ли нам что-то использование абстракции моноида ?
Есть ли какие-нибудь примера использования моноида для event sourcing ?

(11 comments | Leave a comment)

Comments:


[User Picture]
From:juan_gandhi
Date:April 1st, 2017 04:11 pm (UTC)
(Link)
Ну это как бы очевидно. Свободный моноид на событиях.
From:mikkim08
Date:April 1st, 2017 04:20 pm (UTC)
(Link)
Можно развернуть ? Я не уверен, что понял Ваш ответ.
[User Picture]
From:lomeo
Date:April 1st, 2017 05:26 pm (UTC)
(Link)
Он не просто свободный, он trace monoid, т.е. частично коммутативный.

2mikkim08: моноидальность позволяет в принципе пускать в параллель; свобода(?) означает, что мы сами вычисления не делаем при свёртке (не интерпретируем моноид); частичная коммутативность даёт возможность переставить некоторые State → State так, чтобы схлопнуть их в один. Скажем, мы что-то создали, потом у него поменяли поля, потом поменяли другие, потом удалили; всё это просто схлопнется в id, т.е. "не менять state".
From:mikkim08
Date:April 1st, 2017 05:36 pm (UTC)
(Link)
свобода(?) означает, что мы сами вычисления не делаем при свёртке (не интерпретируем моноид)

О, спасибо. Теперь понятно, что значит "свободный".

частичная коммутативность даёт возможность переставить некоторые State → State так, чтобы схлопнуть их в один.

Ага. (Только не все последовательности допустимы, наверное (например insert до delete или update после delete) так что придётся переопределить State => State как State => Either[Error, State])

А есть какая-нибудь библиотечка с таким моноидом ?

Edited at 2017-04-01 05:37 pm (UTC)
[User Picture]
From:leammas
Date:April 1st, 2017 05:42 pm (UTC)
(Link)
https://github.com/notxcain/aecor - но чистым моноидом тут не обошлось.
From:mikkim08
Date:April 2nd, 2017 09:54 am (UTC)
(Link)
Спасибо.
[User Picture]
From:lomeo
Date:April 1st, 2017 06:57 pm (UTC)
(Link)
Не знаю. Но тут вроде как не сложно написать самому.
From:Valentin Budaev
Date:April 3rd, 2017 11:22 am (UTC)
(Link)
Важно, что это не только моноид, а полноценная свободная монада, со всеми вытекающими.
[User Picture]
From:juan_gandhi
Date:April 3rd, 2017 06:59 pm (UTC)
(Link)
Свободная монада? На каком функторе?
From:Valentin Budaev
Date:April 4th, 2017 06:51 am (UTC)
(Link)
Описывающем АСТ языка, для которого терм - линейная последовательность событий.
Ну, для конкретности, что-нибудь вроде data DatabaseAction x = Add Entity x | Delete Entity x | Modify Entity x | Done
[User Picture]
From:juan_gandhi
Date:April 1st, 2017 05:29 pm (UTC)
(Link)
Ну это как бы очевидно. Свободный моноид на событиях.

> Go to Top
LiveJournal.com