Size: a a a

Spring Framework and more

2019 October 22

PB

Pavel Bukhmatov in Spring Framework and more
Sander 🕶
Всем привет,
кто работал с микросервисами, cqrs + event sourcing, amqp (kafka),
хотелось бы задать несколько вопросов.

Если мы строим архитектуру приложения с использованием паттернов cqrs + event sourcing,
то задействовано будет две базы данных,
a. первая хранит всю историю изменений "события" + snapshot,
b. вторая хранит, последними изменения

1) Допустим я хочу вывести для определенного пользователя, всю историю его транзакий, которые он совершал в течении года, как это можно сделать?

Разве я могу читать из базы, где мы записываем историю всех событий? Ведь говорилось что эта база только для записи!
Поэтому мне не сильно понятно, как такое правильно делать? Может надо сделать какой-нибудь materialized view ...

2) Какие инструменты вы используете для воссоздания всего этого? Ведь просто Kafka будет недостаточно я думаю,
ибо это просто брокер сообщений или все токи Kafka будет достаточно?

Нашел следующие инструменты: Lagom, Axon, Eventuate
Евент - это не история изменения какой-то сущности.

Событие = евент - это факт намерения пользователя. Намерение != конкретные сущности доменной модели. Намерение != история. Оно  может являться лишь ТРИГГЕРОМ к появлению/изменению каких-то сущностей или к срабатыванию каких-то процессов.

В частности евент может быть триггером к появлению записи с историей каких-то сущностей. Например записи о начале/конце какой-то транзакции. Таким образом, вы сначала регистрируете намерение пользователя что-то сделать, а лишь потом делаете это.

Эти намерения хранятся, чтобы при их повторной многократной переигровке один за другим вы каждый раз могли получать одно и тоже состояние системы. Где хранить - зависит от объемов и от того, что вы хотите получить.

Хотите иметь возможность переигрывать, например, всю историю за все времена - тогда каждый евент нужно где-то хранить долго. Например, в time series БД (их много и все в той или иной степени работают плохо). Тогда вам нужно будет всю эту историю скормить чему-нибудь, что у вас обрабатывает евенты. Обычно берут любую messaging систему. Кафка - чуть ли не дефолтный вариант, но далеко не единственный.

Если вы хотите переигрывать только условную неделю - достаточно хранилища в топиках кафки. Если у вас другая система обмена сообщениями - скорее всего в ней есть настройки того, сколько и где будут хранится сообщения.

Но опять же, вам ничто не мешает хранить всю историю, но иметь возможность переигрывать лишь прошлую неделю. Эти две задачи между собой ортогональны
источник

S🕶

Sander 🕶 in Spring Framework and more
источник

S🕶

Sander 🕶 in Spring Framework and more
источник

S🕶

Sander 🕶 in Spring Framework and more
- Таблица из книги назыавется EVENTS, это изменения аггрегатов.
- time series bd? обычно все события что проихсодят, все хранятся в одной таблице, можно логически разбить на несколько.
- есть snapshot, что помогает работать со всей таблицей, а в snapshot - закешированная информация
- слышал что kafka может хранить эти данные вроде как, но есть ли там возмоность считывать и как-то выводить информацию от туда? и будет ли это быстро работать.

Но так и не понял, могу ли я считывать информацию из первой базы - которая является базой только для записи?
Просто одна база для записи, а другая для чтения, но если я хочу получтиь историю всех транзакий,
например у нас есть банк и наши убытки на счету, ты там можешь смотреть свою историю,
но если я хочу увидеть историю, то мне придется ведь тогда не ток записывать, но и читать из этой базы,
разве так можно и правильно ли это будет? (одна база для записи и другая для чтения).
источник

S🕶

Sander 🕶 in Spring Framework and more
источник

S🕶

Sander 🕶 in Spring Framework and more
@aquatir вы можете пожалуйста мне в личку написать пожалуйста! 🙏
источник

PB

Pavel Bukhmatov in Spring Framework and more
Sander 🕶
- Таблица из книги назыавется EVENTS, это изменения аггрегатов.
- time series bd? обычно все события что проихсодят, все хранятся в одной таблице, можно логически разбить на несколько.
- есть snapshot, что помогает работать со всей таблицей, а в snapshot - закешированная информация
- слышал что kafka может хранить эти данные вроде как, но есть ли там возмоность считывать и как-то выводить информацию от туда? и будет ли это быстро работать.

Но так и не понял, могу ли я считывать информацию из первой базы - которая является базой только для записи?
Просто одна база для записи, а другая для чтения, но если я хочу получтиь историю всех транзакий,
например у нас есть банк и наши убытки на счету, ты там можешь смотреть свою историю,
но если я хочу увидеть историю, то мне придется ведь тогда не ток записывать, но и читать из этой базы,
разве так можно и правильно ли это будет? (одна база для записи и другая для чтения).
Об этом и речь, если поток намерений пользователя - суть история изменений 1 сущности, это уже не поток намерений. Это история изменений 1 сущности.
Так делать можно, но это убивает саму концепцию event sourcing.
Каконично - евенты отдельно
История, порожденная этими евентами - отдельно
источник

PB

Pavel Bukhmatov in Spring Framework and more
Можно хранилища евентлв разбивать на несколько таблиц. Это не противоречит подходу. Странно, если эти евенты что-то кроме самого намерения обозначают
источник

S🕶

Sander 🕶 in Spring Framework and more
- почему это убиывает? ты все равно разрешаешь изменение только через aggregate
источник

PB

Pavel Bukhmatov in Spring Framework and more
Кешироварие информации - это очень звучит как kappa architecture https://milinda.pathirage.org/kappa-architecture.com/
источник

PB

Pavel Bukhmatov in Spring Framework and more
Sander 🕶
- почему это убиывает? ты все равно разрешаешь изменение только через aggregate
Потому что евент - не история. Это намерение. Должна всегда оставаться возможно расширить набор действий, производимых при появлении этого намерения.
источник

PB

Pavel Bukhmatov in Spring Framework and more
Если завязывать строго "вот этот евент приводит к созданию истории транзакций и больше ни к чему" - это тоже хороший рабочий механизм, но он не позволяет расширяться в стиле евент сорсинга, когда событие не знает, какие изменения системы оно порождает
источник

S🕶

Sander 🕶 in Spring Framework and more
- тогда что является по твойму изменения намерения?
- да так и есть, история транзакций хранится в таблице, блин что-то я не сильно понял про твой способ расширятся в стиле event sourcing,
есть ли возможность что ты мне все токи в личке сможешь писать?
источник

S🕶

Sander 🕶 in Spring Framework and more
и я все так и не понял, про чтение истории данных! как я могу читать данные из базы, если эта база только для записи.
источник

П

Павел Сарпов in Spring Framework and more
Привет. Кто работал с HikariPool - вопрос. Если хикари обнаружил leakConnection - он его закроет сам или что произойдет с ним?
У меня странная ситуация - после некоторого количества запросов, если запросы выполнены с ошибкой - в локах валяются сообщения о ликах. После чего вываливаюсь в ошибку, что  HikariPool-1 - Connection is not available, request timed out after 30000ms.

Кто что может посоветовать?
источник

SL

Sergey Lovushkin in Spring Framework and more
Привет. Можно посмотреть вот тут https://github.com/brettwooldridge/HikariCP
источник

М

Михаил in Spring Framework and more
Павел Сарпов
Привет. Кто работал с HikariPool - вопрос. Если хикари обнаружил leakConnection - он его закроет сам или что произойдет с ним?
У меня странная ситуация - после некоторого количества запросов, если запросы выполнены с ошибкой - в локах валяются сообщения о ликах. После чего вываливаюсь в ошибку, что  HikariPool-1 - Connection is not available, request timed out after 30000ms.

Кто что может посоветовать?
Последние версии хикари сами менеджат утечки
источник

М

Михаил in Spring Framework and more
Скорее всего просто коннект к базе отваливается и его самопроверки дают подобные сообщения
источник

D

Diana in Spring Framework and more
SIBUR Challenge 2019: 1 000 000 рублей призового фонда и вакансия в крупнейшей нефтехимической компании России - активируй прямо сейчас свою возможность и пройди регистрацию! Для специалистов и студентов data science.
https://ai-community.com/sibur-challenge-2019

с 21 октября по 24 ноября организаторы SIBUR Challenge 2019 - AI-Community - приглашают тебя побороться за первое место, а также дополнительные призы.

Сейчас стартовал первый онлайн этап соревнования. Можешь участвовать один или с командой. В студенческом или общем треке. Решать предстоит производственные и маркетинговые задачи от компании Сибур.

В рамках соревнования тебе будут доступны обучающие вебинары по тематикам поставленных задач, действует геймифицированная система бонусов, финал пройдет в Москве и завершится вечеринкой.

Регистрируйся сейчас, изучай условия, собирай команду: https://ai-community.com/sibur-challenge-2019
источник

KS

Kamo Spertsyan in Spring Framework and more
Ребят, как в Spring Boot можно реализовать генерацию id в таблице на базе ФИО?
Чтобы для Иванова Ивана Ивановича был id "IvanovII", а если такой занят, то "IvanovII2" и т.д.

Вот здесь говорится, как в SQL это сделать, а я хочу настроить Spring
https://stackoverflow.com/a/7520431/8506507
источник