Через несколько месяцев я начну новый проект.
Проект будет содержать множество бизнес-логики, разбросанных по нескольким subdomains
. Да, мы будем использовать принципы Domain Driven Design
. Техника будет состоять из Spring, Spring Boot & Hibernate
стека.
Я искал некоторые библиотеки Java, чтобы охватить такие инфраструктурные вещи, как:
domain event publication
event store
event deduplication
resequencers
на стороне потребителяprojections
reliable publishing
reliable delivery & redelivery
- ...
Я наткнулся на Axon Framework
. Я уже слышал об этом, не знал в деталях. Так что я прочитал несколько сообщений в блогах, немного документации и посмотрел несколько трансляций на Youtube.
Это кажется очень многообещающим, я подумываю использовать его, потому что не хочу снова и снова изобретать колесо на инфраструктурной стороне.
Я ищу кого-нибудь, кто ответит и прояснит мои вопросы:
Обработка команд
Axon использует CommandHandlers
с void
методами. Можно ли заставить их возвращать значение (например, сгенерированный бизнес-идентификатор) или объекты для уведомления о бизнес-операции?
Для меня не проблема, что этим методом будет блокировка ввода-вывода.
Публикация событий локального и удаленного домена
Я хочу иметь четкое разделение событий домена local
и remote
. Local domain
события должны быть видны и потребляться только в локальном поддомене. Можно ли настроить синхронизацию потребления событий и / или асинхронность? События моего локального домена могут быть «жирными». Им разрешено переносить больше данных, потому что они не пересекают границы домена.
Remote domain events
будет "тонким", поэтому для удаленных доменов потребуется только минимальный объем данных. Операционные события этого типа всегда должны обрабатываться асинхронно.
Можно ли преобразовать событие локального (толстого) домена в событие удаленного (тонкого) домена на границе домена? Под «краем» я подразумеваю инфраструктурную сторону. Таким образом, модели предметной области не требуется различать события локального и удаленного домена.
CQRS синхронно
Мое приложение будет состоять из 1 (возможно 2) core domains
и several subdomains
. Некоторые домены содержат много бизнес-логики и потребуют CQRS
.
Другой домен будет более грубым. Можно ли делать CQRS
синхронно?
Я хочу начать с этого, прежде чем добавлять технические сложности, такие как обработка асинхронности. Это возможно с Axon
?
Это также означает, что события домена будут храниться в хранилище событий без использования event sourcing
.
Можно ли использовать Axon event store
без источника событий? То же самое и с проекциями, я просто хочу проецировать события предметной области для построения моей модели чтения.
Модульный монолит
Мы будем использовать modular monolith
.
Не очень модно в наши дни со всеми microservices
штучками. Хотя я убежден в наличии монолита, в котором каждый домен полностью разделен (код приложения и схема БД), где операции будут обрабатываться с конечной согласованностью, а события домена содержат необходимые данные. Позже, при необходимости, будет проще перейти на microservices architecture
.
Является ли Axon фреймворком, который вписывается в модульную монолитную архитектуру? Что нужно учитывать?
Полностью разделенная модель предметной области (не зависящая от персистентности)
Модель предметной области будет полностью отделена от модели данных. Нам нужен репозиторий, который считывает модель данных (с использованием Hibernate
) и использует data mapper
для создания агрегата, когда он должен быть загружен.
Также необходим другой способ, агрегат необходимо преобразовать и сохранить в модель данных (с использованием средства отображения данных).
Кроме того, события домена агрегатов необходимо сохранять в хранилище событий и публиковать в локальных или удаленных обработчиках событий.
Это имеет некоторые последствия:
нам нужно иметь полный контроль над реализацией репозитория, который взаимодействует с одним или несколькими DAO (репозиториями данных Spring), чтобы извлекать необходимые данные из сущностей Hibernate и создавать на их основе агрегат. В конце концов, агрегат можно смоделировать в виде двух или даже трех реляционных таблиц.
нам не нужна аннотация Hibernate в модели предметной области
Возможен ли такой подход с Axon? Я вижу только примеры, использующие прямой JPA (модель предметной области сопоставляет сущности от 1 до 1) или источники событий.
Этот подход действительно мешает нам, поскольку модель отдельной предметной области дает гораздо больше возможностей, чем ее прямое сопоставление к объектам данных.
Ниже приведен пример того, чего я хочу достичь:
Агрегирование (без JPA) в некотором пакете модели предметной области:
public class ScoringResultAggregate {
// members, constructor, operation omitted for brevity
}
Hibernate Entity в некотором пакете инфраструктуры:
@Entity
@Table(name ="SOME_TABLE_NAME)
public class ScoringResultEntity {
// member and getters & setters; no domain logic
}
Интерфейс репозитория, принадлежащий модели предметной области:
public interface ScoringResultRepository {
void save(ScoringResultAggregate scoringResultAggregate);
ScoringResultAggregate findByApplicationNumber(ApplicationNumber applicationNumber);
}
Адаптер, реализующий интерфейс репозитория; отвечает за отображение агрегата из / в модель данных (JPA):
class ScoringResultAdapterRepository implements ScoringResultRepository {
private ScoringResultJpaRepository scoringResultJpaRepository;
ScoringResultJPARepository(ScoringResultJpaRepository scoringResultJpaRepository) {
this.scoringResultJpaRepository= scoringResultJpaRepository;
public void save(ScoringResultAggregate scoringResultAggregate) {
// converts aggregate to ScoringResultEntity and saves the state into DB
}
public ScoringResultAggregate findByApplicationNumber(ApplicationNumber applicationNumber) {
// loads an ScoringResultEntity from DB and converts it into an aggregate
}
}
Axon Server
Axon server
выглядит очень многообещающе. Хотя, разве это полезно только для event sourcing
? Можно ли его использовать вместе с базой данных Sql, где хранятся агрегаты (постоянство состояния), а события домена сохраняются на сервере Axon Server?
Много вопросов. Надеюсь, кто-нибудь с опытом работы с Axon сможет мне помочь :-)