亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Table of Contents
What are Event Sourcing and CQRS?
How to implement it in Java? Using Axon Framework
Add dependencies (Maven)
Example: Bank Account Transfer
1. Define events
2. Aggregate - Write a model
3. Event processing (update reading model)
4. Read model entity (for query)
5. Query the interface
When to use Event Sourcing CQRS?
Things to note
Summarize
Home Java javaTutorial Event Sourcing and CQRS Patterns in Java

Event Sourcing and CQRS Patterns in Java

Jul 29, 2025 am 12:34 AM
java

Event traceability and CQRS are suitable for complex business systems. 1. Event traceability provides complete audit and time travel capabilities by saving event sequence reconstruction status, but increases query complexity; 2. CQRS separates read and write models to improve scalability and performance, but introduces final consistency; 3. In Java, Axon Framework can be implemented in combination with Spring Boot, using @Aggregate to process commands, @EventSourcingHandler updates status, and @EventHandler builds read models; 4. Applicable to scenarios that require high auditability and uneven read and write load, and is not suitable for simple CRUD systems; 5. Pay attention to event immutability, version control, final consistency processing and debugging complexity. This architecture is of great value in high demand systems.

Event Sourcing and CQRS Patterns in Java

Event Sourcing and command query separation of responsibilities (CQRS) are two important models in modern distributed systems that deal with complex business logic and improve system scalability. In the Java ecosystem, combined with tools such as Spring Boot and Axon Framework, these two modes can be efficiently implemented. The following is an analysis from several aspects of concepts, application scenarios, implementation methods and precautions.

Event Sourcing and CQRS Patterns in Java

What are Event Sourcing and CQRS?

1. Event Sourcing

In traditional systems, we usually only save the current status of the entity (such as the user balance is 100 yuan). The core idea of event tracing is: not to directly save the state, but to save the sequence of events that lead to state changes .

For example, the balance change in a user account is not directly updated with the balance field, but records:

Event Sourcing and CQRS Patterns in Java
  • MoneyDeposited(amount=50)
  • MoneyWithdrawn(amount=20)

The state is reconstructed by replaying these events.

advantage:

Event Sourcing and CQRS Patterns in Java
  • Complete audit log
  • Easy to debug and backtrack
  • Support time travel (reconstructs status at any time point)

shortcoming:

  • Query performance may decline (replay event required)
  • Complex event version management
  • High threshold for beginners

2. CQRS (Command Query Responsibility Segregation)

CQRS separates the system's read and write operations:

  • Command : Modify data, write model (Write Model)
  • Query : read data, corresponding to read model (Read Model)

This is not just hierarchy, but allows different data models, databases and even technology stacks to handle read and write.

Typical structure:

 Client → Command → Command Handler → Events → Event Store
                     ↓
               Event Handlers → Update Read Model (eg, SQL, Elasticsearch)
                     ↓
Client ← Query ← Read Model

advantage:

  • Read and write models can be optimized independently
  • Easy to scale (such as reading more and writing less scenarios can scale out the query service in a query service)
  • A clearer division of responsibilities

shortcoming:

  • System complexity increases
  • There is a delay between read and write (final consistency)

How to implement it in Java? Using Axon Framework

Axon is the most popular framework in Java to implement Event Sourcing and CQRS, and integrates well with Spring.

Add dependencies (Maven)

 <dependency>
    <groupId>org.axonframework</groupId>
    <artifactId>axon-spring-boot-starter</artifactId>
    <version>4.6.0</version>
</dependency>

Example: Bank Account Transfer

1. Define events
 public class MoneyDepositedEvent {
    public final String accountId;
    public final double amount;

    public MoneyDepositedEvent(String accountId, double amount) {
        this.accountId = accountId;
        this.amount = amount;
    }
}

public class MoneyWithdrawnEvent {
    public final String accountId;
    public final double amount;

    public MoneyWithdrawnEvent(String accountId, double amount) {
        this.accountId = accountId;
        this.amount = amount;
    }
}
2. Aggregate - Write a model
 @Aggregate
public class BankAccount {

    @AggregateIdentifier
    private String accountId;
    private double balance;

    public BankAccount() {} // Required by Axon

    // Command Handler
    @CommandHandler
    public BankAccount(CreateAccountCommand command) {
        // Publish the account creation event AggregateLifecycle.apply(new AccountCreatedEvent(command.accountId));
    }

    @CommandHandler
    public void handle(DepositMoneyCommand command) {
        if (command.amount <= 0) {
            throw new IllegalArgumentException("Amount must be positive");
        }
        AggregateLifecycle.apply(new MoneyDepositedEvent(command.accountId, command.amount));
    }

    @CommandHandler
    public void handle(WithdrawMoneyCommand command) {
        if (command.amount > balance) {
            throw new IllegalStateException("Insufficial funds");
        }
        AggregateLifecycle.apply(new MoneyWithdrawnEvent(command.accountId, command.amount));
    }

    // Event Sourcing Handler - Used to update the status @EventSourcingHandler
    public void on(MoneyDepositedEvent event) {
        this.balance = event.amount;
    }

    @EventSourcingHandler
    public void on(MoneyWithdrawnEvent event) {
        this.balance -= event.amount;
    }
}
3. Event processing (update reading model)
 @Component
public class AccountProjection {

    private final AccountRepository accountRepository;

    public AccountProjection(AccountRepository accountRepository) {
        this.accountRepository = accountRepository;
    }

    @EventHandler
    public void on(MoneyDepositedEvent event) {
        AccountView account = accountRepository.findById(event.accountId)
            .orElse(new AccountView(event.accountId, 0.0));
        account.balance = event.amount;
        accountRepository.save(account);
    }

    @EventHandler
    public void on(MoneyWithdrawnEvent event) {
        AccountView account = accountRepository.findById(event.accountId)
            .orElseThrow();
        account.balance -= event.amount;
        accountRepository.save(account);
    }
}
4. Read model entity (for query)
 @Entity
public class AccountView {
    @Id
    private String id;
    private double balance;

    // constructors, getters, setters
}
5. Query the interface
 @RestController
public class AccountQueryController {

    @Autowired
    private AccountRepository accountRepository;

    @GetMapping("/accounts/{id}")
    public AccountView getAccount(@PathVariable String id) {
        return accountRepository.findById(id).orElse(null);
    }
}

When to use Event Sourcing CQRS?

  • The business logic is complex and requires audit tracking (such as finance, order system)
  • Read and write loads vary greatly and need independent expansion
  • The system needs to support "undo", "replay", and "time travel"
  • In the microservice architecture, the communication between services through event

?? Not recommended for use with simple CRUD systems, it will be over-designed.


Things to note

  • Event immutable : Once published, it cannot be modified, and only compensation events can be added.
  • Event version control : When the event structure changes, serialization compatibility or migration must be supported.
  • Read model consistency : CQRS is the final consistency, and the front-end needs to deal with the situation where "the operation is successful but the query is not updated".
  • Debugging difficulty increases : tools are required to support event stream viewing, replaying, etc.

Summarize

In Java, Event Sourcing and CQRS can be implemented more easily through the Axon Framework:

  • Use @Aggregate to manage writing models
  • Update the aggregation status with @EventSourcingHandler
  • Use @EventHandler to build a reading model
  • Complete separation of commands and queries

Although complexity is introduced, this architecture is very valuable in systems that require high auditability and scalability.

Basically all that is, the key is to understand that "state is the result of events" and that "reading and writing can take different paths."

The above is the detailed content of Event Sourcing and CQRS Patterns in Java. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undress AI Tool

Undress AI Tool

Undress images for free

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

A Developer's Guide to Maven for Java Project Management A Developer's Guide to Maven for Java Project Management Jul 30, 2025 am 02:41 AM

Maven is a standard tool for Java project management and construction. The answer lies in the fact that it uses pom.xml to standardize project structure, dependency management, construction lifecycle automation and plug-in extensions; 1. Use pom.xml to define groupId, artifactId, version and dependencies; 2. Master core commands such as mvnclean, compile, test, package, install and deploy; 3. Use dependencyManagement and exclusions to manage dependency versions and conflicts; 4. Organize large applications through multi-module project structure and are managed uniformly by the parent POM; 5.

Building RESTful APIs in Java with Jakarta EE Building RESTful APIs in Java with Jakarta EE Jul 30, 2025 am 03:05 AM

SetupaMaven/GradleprojectwithJAX-RSdependencieslikeJersey;2.CreateaRESTresourceusingannotationssuchas@Pathand@GET;3.ConfiguretheapplicationviaApplicationsubclassorweb.xml;4.AddJacksonforJSONbindingbyincludingjersey-media-json-jackson;5.DeploytoaJakar

python property decorator example python property decorator example Jul 30, 2025 am 02:17 AM

@property decorator is used to convert methods into properties to implement the reading, setting and deletion control of properties. 1. Basic usage: define read-only attributes through @property, such as area calculated based on radius and accessed directly; 2. Advanced usage: use @name.setter and @name.deleter to implement attribute assignment verification and deletion operations; 3. Practical application: perform data verification in setters, such as BankAccount to ensure that the balance is not negative; 4. Naming specification: internal variables are prefixed, property method names are consistent with attributes, and unified access control is used to improve code security and maintainability.

css dark mode toggle example css dark mode toggle example Jul 30, 2025 am 05:28 AM

First, use JavaScript to obtain the user system preferences and locally stored theme settings, and initialize the page theme; 1. The HTML structure contains a button to trigger topic switching; 2. CSS uses: root to define bright theme variables, .dark-mode class defines dark theme variables, and applies these variables through var(); 3. JavaScript detects prefers-color-scheme and reads localStorage to determine the initial theme; 4. Switch the dark-mode class on the html element when clicking the button, and saves the current state to localStorage; 5. All color changes are accompanied by 0.3 seconds transition animation to enhance the user

css dropdown menu example css dropdown menu example Jul 30, 2025 am 05:36 AM

Yes, a common CSS drop-down menu can be implemented through pure HTML and CSS without JavaScript. 1. Use nested ul and li to build a menu structure; 2. Use the:hover pseudo-class to control the display and hiding of pull-down content; 3. Set position:relative for parent li, and the submenu is positioned using position:absolute; 4. The submenu defaults to display:none, which becomes display:block when hovered; 5. Multi-level pull-down can be achieved through nesting, combined with transition, and add fade-in animations, and adapted to mobile terminals with media queries. The entire solution is simple and does not require JavaScript support, which is suitable for large

Developing a Blockchain Application in Java Developing a Blockchain Application in Java Jul 30, 2025 am 12:43 AM

Understand the core components of blockchain, including blocks, hashs, chain structures, consensus mechanisms and immutability; 2. Create a Block class that contains data, timestamps, previous hash and Nonce, and implement SHA-256 hash calculation and proof of work mining; 3. Build a Blockchain class to manage block lists, initialize the Genesis block, add new blocks and verify the integrity of the chain; 4. Write the main test blockchain, add transaction data blocks in turn and output chain status; 5. Optional enhancement functions include transaction support, P2P network, digital signature, RESTAPI and data persistence; 6. You can use Java blockchain libraries such as HyperledgerFabric, Web3J or Corda for production-level opening

How to use Java MessageDigest for hashing (MD5, SHA-256)? How to use Java MessageDigest for hashing (MD5, SHA-256)? Jul 30, 2025 am 02:58 AM

To generate hash values using Java, it can be implemented through the MessageDigest class. 1. Get an instance of the specified algorithm, such as MD5 or SHA-256; 2. Call the .update() method to pass in the data to be encrypted; 3. Call the .digest() method to obtain a hash byte array; 4. Convert the byte array into a hexadecimal string for reading; for inputs such as large files, read in chunks and call .update() multiple times; it is recommended to use SHA-256 instead of MD5 or SHA-1 to ensure security.

python parse date string example python parse date string example Jul 30, 2025 am 03:32 AM

Use datetime.strptime() to convert date strings into datetime object. 1. Basic usage: parse "2023-10-05" as datetime object through "%Y-%m-%d"; 2. Supports multiple formats such as "%m/%d/%Y" to parse American dates, "%d/%m/%Y" to parse British dates, "%b%d,%Y%I:%M%p" to parse time with AM/PM; 3. Use dateutil.parser.parse() to automatically infer unknown formats; 4. Use .d

See all articles