Event sourcing

 

@JakubPilimon

jakub.pilimon@gmail.com

github.com/pilloPl

ORM

STATE

STATE

new ShopItem("ordered")
item.setStatus("paid")
...
insert into shop_items (id, status) values (1, 'ordered')
update shop_items set status = 'paid' where id = 1
...
"new instance of ordered Shop Item was created"
"this shop item was marked as paid"
...
new ItemOrdered(itemID, timestamp)
new ItemPaid(itemID, timestamp)
item.setStatus("paid")
new ShopItem("ordered")
new ShopItem("ordered")
ordered.setStatus("paid")

State 1

State 2 

(State 1 + Event 2)

single ShopItem deltas

technology agnostic log, descriptive event log

@Entity
class Product {

    private float price;
    
    //...
    
    public void cutPrice(int percent) {    
        checkState(percent < 100);
        this.price = 
                price - price * percent / 100;
        DomainEvents.publish(
                new NewPriceAssigned(percent, this.id));
    
    }

}
 def 'should cut price by 10 percent'() {
        given:
            ShopItem item = newWithPrice(50.00)
        when:
            item.cutPrice(10)
        then:
            item.price == 45.00
    }
 def 'should cut price by procent'() {
        given:
            ShopItem item = newWithPrice(50)
        when:
            item.cutPrice(10)
        then:
            item.getUncommittedChanges() ==
                        [new NewPriceAssigned(price: 45)]
    }

QUERIES

message broker

Shop

UI

Horizontal asymmetric scaling

Failover

A/B testing

&

blue green deployments

Partitioning

Adding new service

message broker

Shop

UI

Orders

Manager

Shipping

Performance

Testing?

Shop

(write model)

UI (read model)

eventually events

commands

DTOs

front end

Pitfalls

Thank you!

@JakubPilimon

jakub.pilimon@gmail.com

github.com/pilloPl

Event sourcing BJUG

By Jakub Pilo

Event sourcing BJUG

Overview of event sourcing and CQRS benefits

  • 746