Я начну проект с нуля через несколько месяцев.
Проект будет содержать множество бизнес-логи c, распределенных по нескольким 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.
Кажется, это очень многообещающе, я собираюсь использовать его, потому что я не хочу изобретать, чтобы снова и снова крутиться на инфраструктурная сторона.
Так что я ищу кого-то, чтобы ответить и уточнить мои вопросы:
Обработка команд
Использование аксонов CommandHandlers
с void
методами. Можно ли заставить их возвращать значение (например, сгенерированный бизнес-идентификатор) или объекты для целей уведомления, касающиеся бизнес-операции?
Для меня не проблема, что этот метод будет блокировать ввод-вывод.
Локальная или удаленная публикация событий домена
Я хочу иметь четкое разделение local
против remote
событий домена. Local domain
события должны быть видны только для локального субдомена. Можно ли настроить потребление событий syn c и / или asyn c? Мои локальные доменные события могут быть «жирными». Им разрешено переносить больше данных, поскольку они не пересекают границы домена.
Remote domain events
будет «тонким», поэтому для удаленных доменов необходимы только минимальные данные. События этого типа должны всегда обрабатываться asyn c.
Возможно ли преобразовать событие локального (толстого) домена в событие удаленного (тонкого) домена на краю домена? Под «краем» я подразумеваю инфраструктурную сторону. Таким образом, модели домена не нужно знать различие между локальными и удаленными событиями домена.
CQRS синхронно
Мое приложение будет состоять из 1 ( возможно 2) core domains
и several subdomains
. Некоторые домены содержат множество бизнес-логи c и потребуют CQRS
.
Другой домен будет более «грубым». Можно ли сделать CQRS
синхронно?
Я хочу начать этот путь, прежде чем добавлять технические сложности, такие как обработка asyn c. Это возможно с Axon
?
Это также означает, что доменные события будут храниться в хранилище событий без использования event sourcing
.
Можно ли использовать Axon's event store
без поиска событий? То же самое для проекции, я просто хочу проецировать события домена для построения моей модели чтения.
Модульный монолит
Мы будем использовать modular monolith
.
Не очень модно в наши дни со всеми вещами microservices
. Хотя я убежден, что у меня есть монолит, в котором каждый домен полностью отделен (код приложения и схема DB), где операции будут обрабатываться с возможной согласованностью, а события домена содержат необходимые данные. Позже и, если необходимо, будет проще перейти на microservices architecture
.
Является ли Axon платформой, подходящей для модульной монолитной архитектуры? Есть что-то, чтобы принять во внимание?
Полностью разделенная модель домена (постоянство агности c)
Модель домена будет полностью отделена от данных модель. Нам нужно иметь репозиторий, который читает модель данных (используя Hibernate
) и использует data mapper
для создания агрегата, когда его нужно загрузить.
Также необходим другой способ, агрегат необходимо преобразовать и сохранены в модель данных (с помощью картографа данных).
Кроме того, доменные события агрегатов необходимо сохранять в хранилище событий и публиковать в локальных или удаленных обработчиках событий.
Это имеет некоторые последствия:
нам нужно иметь полный контроль над реализацией репозитория, который взаимодействует с одним или несколькими DAO (хранилищами данных Spring), чтобы извлекать необходимые данные из сущностей Hibernate и создавать из них агрегат. В конце концов, агрегат может быть смоделирован в 2 или даже 3 реляционных таблицах.
нам не нужна аннотация Hibernate в модели предметной области
Возможен ли такой подход с Аксоном? Я вижу только примеры, использующие прямой JPA (доменные модели от 1 до 1 для сущностей) или источники событий.
Этот подход действительно является для нас преградой, модель с раздельными доменами дает гораздо больше возможностей, чем непосредственное сопоставление. к объектам данных.
Ниже приведен пример того, чего я хочу достичь:
Агрегирование (без JPA) в некотором пакете модели домена:
public class ScoringResultAggregate {
// members, constructor, operation omitted for brevity
}
Hibernate Объект в некотором пакете инфраструктуры:
@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?
Множество вопросов. Надеюсь, кто-то с опытом работы с Аксоном может мне помочь: -)