@JakubPilimon
jakub.pilimon@gmail.com
github.com/pilloPl
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)]
}message broker
Shop
UI
@StreamListener("items")
public void itemEventStream(ItemPaid itemPaid) {
log.info("Received item paid event {}", itemPaid);
readModel.markItemAsPaid(itemPaid.getUuid(),
itemPaid.getWhen());
} @Publisher(channel = "items")
public ItemPaid ship(ItemPaid itemPaid) {
log.info("sending: {}", itemPaid);
return itemPaid;
}spring.cloud.stream.bindings.items.destination=items
spring.cloud.stream.bindings.items.destination=items
spring.cloud.stream.bindings.items.group=ui
spring.cloud.stream.bindings.items.destination=items
spring.cloud.stream.bindings.items.group=ui_2nd_instance
spring.cloud.stream.bindings.items.destination=items
spring.cloud.stream.bindings.items.group=ui
spring.cloud.stream.bindings.items.destination=items
spring.cloud.stream.bindings.items.group=ui
spring.cloud.stream.bindings.items.destination=items
spring.cloud.stream.bindings.items.group=ui
spring.cloud.stream.instanceIndex=1
spring.cloud.stream.instanceCount=2Shop
(write model)
UI (read model)
eventually events
commands
DTOs
front end
@JakubPilimon
jakub.pilimon@gmail.com
github.com/pilloPl