-
Notifications
You must be signed in to change notification settings - Fork 0
Components
Компоненты - элементы приложения, обрабатывающие сообщения. Приложение управлет ЖЦ компонента, предоставляет ему необходимые разделяемые ресурсы. В сценарии дизайна рудиментов предполагается, что компоненты статичны и умеют только обмениваться сообщениями, притом маршрутом управляет не сам компонент, а приложение через роутеры.
Специфика обработки позволяет выделить несколько видов компонентов.
Сервер для внешних систем.
Принимает Query из вненего мира и преобразует его в Message (обычно Command), отправляет на обработку. Если требуется, готовит Result (обычно из Event или Error) и отправляет его в ответ на запрос.
Клиент для внешних систем.
Принимает Message (обычно Command) из приложения и выполняет по нему запрос во внешнюю систему. Если требуется, обрабатывает ответ внешней системы и преобразует его (обычно в Event, Error или, реже, Effect).
Управляет коммуникацией внутри приложения и модулей по данным из Message. Предполагается, что сам раутинг дешев по сравнению с выполнением операции в обработчике.
Отдельно выделяются:
-
Type discriminator- связывает типMessageи его единственный обработчик, обеспечивает возможность статического связывания компонент между собой. -
Query DSL- на основе разбора URL (сегменты, параметры в сегментах) и на основе параметров сообщения.
Общее название для всех компонентов, которые непосредственно обрабатывают сообщения. Как правило из Command в Event/Error/Effect
Поток происходящего в системе в виде пар Command -> Message. Память может быть как у приложения целиком, так и у модулей и отдельных компонент.
Обычно-понимаемое состояние как компонент.
Фундаментально, агрегат состоит из функции-обработчика (Command, ActualState) => (NewState, Effect+) и непосредственно хранилища - переменной или элемента в коллекции. Заданная функция позволяет использовать EventStore (foldLeft!) вместо ORM для надежного хранения данных.
Благодаря Type System приложение может гибко контролировать ЖЦ агрегата. Все задумывается с целью сделать агрегат фасадом над хранилищем с сохранением-по-требованию и возможностью быстро сравнить и восстановить поток событий конкретного агрегата и сам агрегат.
Дополнение для реализации обработчиков вида (Context OldState, Command) => (NewState, Event). Контекст в Request представляет собой набор ID, проверяется в Pipes и наполняется Instance. В вызове должен соблюдаться контракт на иммутательность контекста на время вызова. Все меняющиеся части вызова должны быть помещены в State.
ID в контексте можно использовать для организации Pessimistic Locking, выстраивания очередей.
Внутри процессов, Context является структурной частью агрегата и не должна меняться, по контракту.
Набор обработчиков типовых потребностей прикладного приложения.
Предполагается, что Application и Module через Router добавляют обработку проходящих Message.
Обеспечивает захват и высвобождение транзакции к БД. Позволяет обратиться к инстансу транзакции и получить его по идентификатору. Позволяет реализовать pessimistic lock на уровне агрегатов.
Набор сервисов для авторизации и хранения бизнес-информации о пользователе.
Абстракция актора. Использование совместно с агрегатом позволяет реализовать эффективный pessimistic lock
возвращает предопределенный ответ в случае непозволительно-длинной обработки. Им может быть и timeout.
приостанавливает загрузку и продвижение сообщений в случае перегрузки системы