SlideShare a Scribd company logo
Beyond Event
Sourcing
May 2024
Embracing CRUD for Wix's High-Growth
Platform
Beyond Event Sourcing
Hi,
I’m Natan
Backend Infra Tech Lead @Wix
Yoga enthusiast
Speaker
Blogger
natansilnitsky
www.natansil.com
@NSilnitsky
Beyond Event Sourcing @NSilnitsky
Beyond Event Sourcing @NSilnitsky
~4B
Daily HTTP
Transactions
4000±
Microservices
in production
~70B
Kafka
messages a day
Beyond Event Sourcing @NSilnitsky
Agenda
Event sourcing & CQRS Framework for CRUD services
Dev velocity
1
Scalability
2
Performance
3
Resilience
4
* stores
Beyond Event Sourcing @NSilnitsky
Event Sourcing & CQRS
Wix Stores Example
Beyond Event Sourcing @NSilnitsky
Add/Update product QueryProduct
Product Catalog
Beyond Event Sourcing @NSilnitsky
WriteProduct
Event sourcing and CQRS
Product 123:
Product Created
1
Product Changed (price)
2
Product Changed (description)
3
Product Changed (stock-level)
4
ReadProduct
Name
Price
Description
Stock-level
Append-Only
Events
Snapshot
Beyond Event Sourcing @NSilnitsky
Event
Store
CreateProduct:
Catalog Write API
Event sourcing and CQRS
Product Created
Beyond Event Sourcing @NSilnitsky
Event sourcing and CQRS
Product 123:
Product Created
1
Product Changed (price)
2
Product Changed (description)
3
Product Changed (stock-level)
4
Event
Store
CreateProduct:
Catalog Write API
Product Created
Beyond Event Sourcing @NSilnitsky
Replay
GetProduct
Catalog Read API
Event sourcing and CQRS
Replay
events
Product 123:
Product Created
1
Product Changed (price)
2
Product Changed (description)
3
Product Changed (stock-level)
4
Event
Store
CreateProduct:
Catalog Write API
Product Created
Beyond Event Sourcing @NSilnitsky
Event sourcing and CQRS – Advantages
Debug with
“time travel”
GetProduct
Catalog Read API
Replay
events
Product 123:
Product Created
1
Product Changed (price)
2
Product Changed (description)
3
Product Changed (stock-level)
4
Event
Store
CreateProduct:
Catalog Write API
Product Created
Beyond Event Sourcing @NSilnitsky
Product 123:
Product Created
1
Product Changed (price)
2
Product Changed (description)
3
Product Changed (stock-level)
4
…..
5
Product Changed (stock-level)
30
Event
Store
Event sourcing and CQRS
Beyond Event Sourcing @NSilnitsky
Product 123:
Product Created
1
Product Changed (price)
2
Product Changed (description)
3
Product Changed (stock-level)
4
…..
5
Product Changed (stock-level)
30
Event
Store
Product 123 Snapshot
Snapshot
Repository
Event sourcing and CQRS
Beyond Event Sourcing @NSilnitsky
Event sourcing and CQRS - Advantages
Catalog Read API
Inventory
snapshot
Product
Snapshot
Product Created
Product Changed (price)
2
Product Changed (description)
3
Product Changed (stock-level)
Product 123:
1
4
Beyond Event Sourcing @NSilnitsky
Event sourcing and CQRS - Disadvantages
Product
DB
Create/Read Product
Catalog CRUD
Event
Store
CreateProduct:
Catalog Write API
Product Created
Product 123 Snapshot
Snapshot
Repository
Catalog Read API
Beyond Event Sourcing @NSilnitsky
Event sourcing and CQRS - Disadvantages
Product Created (price 4$)
1
Product Changed (price 6$)
2
Product 123:
Snapshot
Repository
Delayed
Product snapshot Consumer
Catalog Write API
Beyond Event Sourcing @NSilnitsky
Event sourcing and CQRS - Disadvantages
Product 123:
Snapshot
Repository
Product Created (price 4$)
1
Product snapshot Consumer
Catalog Write API
Product Changed
2
Product Created (price 4$)
1
Product Changed (price 6$)
2 Delayed
Beyond Event Sourcing @NSilnitsky
Event sourcing and CQRS - Disadvantages
Product Changed (descriptionA)
3
Product Changed (descriptionB)
4
Product 123:
Snapshot
Repository
Product Created (price 4$)
1
Product Changed (descriptionB)
2
Catalog Write API
Product Changed (descriptionA)
3
Product Created (price 4$)
1
Product Changed (price 6$)
2 Delayed
Product snapshot Consumer
Beyond Event Sourcing @NSilnitsky
Event sourcing and CQRS - Disadvantages
Product Changed (descriptionA)
3
Product Changed (descriptionB)
4
Product 123:
Snapshot
Repository
Product Created (price 4$)
1
Product 123 Snapshot
Product Changed (descriptionB)
2
Product
4$
DescriptionA
Product Changed (descriptionA)
3
Catalog Write API
Product Created (price 4$)
1
Product Changed (price 6$)
2 Delayed
Product snapshot Consumer
Beyond Event Sourcing @NSilnitsky
Read your own writes
Event sourcing and CQRS - Disadvantages
Beyond Event Sourcing @NSilnitsky
Event sourcing and CQRS - Disadvantages
Confetti Cannon events:
Product Changed (price -1$)
Read your own writes
Catalog Write API
Event
Store
Beyond Event Sourcing @NSilnitsky
Event sourcing and CQRS - Disadvantages
Confetti Cannon events:
Snapshot
Repository
Confetti Cannon
Snapshot
Physical Item
3$
DescriptionA
Product Changed (price -1$)
Read your own writes
Catalog Write API
Event
Store
Beyond Event Sourcing @NSilnitsky
Event sourcing and CQRS - Disadvantages
Confetti Cannon events:
Snapshot
Repository
Confetti Cannon
Snapshot
Physical Item
3$
DescriptionA
Product Changed (price -1$)
Read your own writes
Catalog Write API
Event
Store
Product Changed (price -1$)
+
Beyond Event Sourcing @NSilnitsky
Product
DB
Update Product
Catalog CRUD
Event sourcing and CQRS - Disadvantages
Read your own writes
Beyond Event Sourcing @NSilnitsky
Read your own writes
Event sourcing and CQRS - Disadvantages
Beyond Event Sourcing
Event sourcing and
CQRS -
Disadvantages
Complexity
Eventual consistency only
Massive scale
Corrupted snapshot
Read your own writes
Beyond Event Sourcing @NSilnitsky
APIs
+
Standardization
Beyond Event Sourcing
@NSilnitsky
RPC
Product Catalog API
Cart
Service
Internal Wix
Developer
Open Platform - API First
* Center 4000, clear,
focused, comprehensive
Beyond Event Sourcing
@NSilnitsky
HTTP/SDK
Product Catalog API
Internal Wix
Developer
PoS
App
External App
Developer
Open Platform - API First
Beyond Event Sourcing
@NSilnitsky
JavaScript
method
Product Catalog API
Internal Wix
Developer
Custom
Filter
External App
Developer
External Wix Site
Developer (Velo)
Open Platform - API First
Beyond Event Sourcing
@NSilnitsky
Product Catalog API
Internal Wix
Developer
External App
Developer
External Wix Site
Developer (Velo)
Open Platform - API First
* CRUD on ES, consistent,
hard in standard way. Users
fast experience
Beyond Event Sourcing @NSilnitsky
Stores
Bookings
Events
Forms
Loyalty Rewards
Tickets Policies
Checkout
Time
Slots
Schemas
Sub
missions
Guests
Coupons
Calendar
Orders
Waitlist
Cart
Catalog
Programs
Open Platform - API First
Internal Wix
Developer
External App
Developer
External Wix Site
Developer (Velo)
Beyond Event Sourcing @NSilnitsky
Wix’s Open Platform
CRUD
Event sourcing
Was
Independent
“startups”
Now
Single Open
Platform
Beyond Event Sourcing @NSilnitsky
Wix’s Open Platform
CRUD
Event sourcing
API First
APIs - TDD
+
FE driven
Was
Independent
“startups”
Now
Single Open
Platform
Beyond Event Sourcing
Framework for
CRUD services
Open Platform
API Schema
Validations & Permissions
Scaffold
Persistence + Event publishing
Data projections (Queries)
Beyond Event Sourcing @NSilnitsky
CreateProduct
Product
Document Store
Catalog API
Product Catalog - CRUD
ReadProduct
UpdateProduct
DeleteProduct
Unified!
Beyond Event Sourcing @NSilnitsky
CreateProduct
ReadProduct
UpdateProduct
DeleteProduct
Catalog API
API First - platformized CRUD
Beyond Event Sourcing @NSilnitsky
CreateProduct
ReadProduct
UpdateProduct
DeleteProduct
Catalog API
API First - platformized CRUD
Beyond Event Sourcing @NSilnitsky
CreateProduct
ReadProduct
UpdateProduct
DeleteProduct
Catalog API
service ProductService {
option (service_entity).message = "...v3.Product";
rpc CreateProduct (CreateProductRequest) returns
(CreateProductResponse) ...
rpc GetProduct (GetProductRequest) returns
(GetProductResponse) ...
rpc UpdateProduct (UpdateProduct) returns (UpdateProduct)
...
…
}
message Product {
option (entity) = {fqdn: "...v3.product"};
google.protobuf.StringValue id = 1;
google.protobuf.Int64Value revision = 2;
...
repeated Inventory inventory = 25;
...
}
API First - platformized CRUD
Beyond Event Sourcing @NSilnitsky
API First - platformized CRUD
CreateProduct
ReadProduct
UpdateProduct
DeleteProduct
Catalog API
service ProductService {
option (service_entity).message = "...v3.Product";
rpc CreateProduct (CreateProductRequest) returns
(CreateProductResponse) ...
rpc GetProduct (GetProductRequest) returns
(GetProductResponse) ...
rpc UpdateProduct (UpdateProduct) returns (UpdateProduct)
...
…
}
message Product {
option (entity) = {fqdn: "...v3.product"};
google.protobuf.StringValue id = 1;
google.protobuf.Int64Value revision = 2;
...
repeated Inventory inventory = 25;
...
}
Beyond Event Sourcing @NSilnitsky
API First - platformized CRUD
Beyond Event Sourcing @NSilnitsky
API First - platformized CRUD
Beyond Event Sourcing @NSilnitsky
Event Driven Architecture
Automatic Domain Events FTW
Beyond Event Sourcing @NSilnitsky
EDA - Domain Events
CreateProduct
UpdateProduct
DeleteProduct
Product Created
Product Updated
Product Deleted
Product
Document Store
Catalog Service
* DE describes…
Beyond Event Sourcing @NSilnitsky
EDA - Domain Events
CreateProduct
UpdateProduct
DeleteProduct
Product Created
Product Updated
Product Deleted
Catalog Service
Product
SDL
* SDL is
document based.
no direct SQL
Beyond Event Sourcing @NSilnitsky
EDA - Domain Events
CreateProduct
UpdateProduct
DeleteProduct
Product Created
Product Updated
Product Deleted
Catalog Service
Product
SDL
* SDL is
document based.
no direct SQL
sdl.insert(request.getProduct.mapTo[ProductDomain])
Beyond Event Sourcing @NSilnitsky
EDA - Domain Events
CreateProduct
UpdateProduct
DeleteProduct
Product Created
Product Updated
Product Deleted
Product
SDL
Catalog Service
Product
SDL
sdlBuilder =
_.withDomainEventsEnabled(_.mapTo[Product])
Beyond Event Sourcing @NSilnitsky
EDA - Domain Events
Data
warehouse/Lake
CreateProduct
UpdateProduct
DeleteProduct
Product Created
Product Updated
Product Deleted
Catalog Service
Product
SDL
* debugging
corruption
Beyond Event Sourcing @NSilnitsky
EDA - Domain Events
ebay-bridge Service
CreateProduct
UpdateProduct
DeleteProduct
Catalog Service
Product Created
Product Updated
Product Deleted
Product
SDL
Beyond Event Sourcing @NSilnitsky
EDA - Domain Events
CreateProduct
UpdateProduct
DeleteProduct
Product Created
Product Updated
Product Deleted
Catalog Service
Product
SDL
Beyond Event Sourcing @NSilnitsky
Data consistency in Wix’s EDA
Resilient Producers and consumers
Beyond Event Sourcing @NSilnitsky
Make DB Update & Event Producing Atomic
Catalog
Service
Ebay Bridge
Service
* atomic,
otherwise
Beyond Event Sourcing @NSilnitsky
Produce event to S3
Resilient Producer
Catch Unsent Events
Catalog Service
Beyond Event Sourcing @NSilnitsky
Produce
to Kafka
Poll
Produce event to S3
Resilient Producer
Fallback to S3 and Heal
Catalog Service Healer Service
Beyond Event Sourcing @NSilnitsky
Consumer retries + DLQ
Make DB Update & Event Producing Atomic
Catalog
Service
Ebay Bridge
Service
Beyond Event Sourcing @NSilnitsky
Alternative - use outbox pattern and/or CDC
Transaction
Outbox Table
Insert
Product Table
Insert
Update
Delete
Database
Instant read-your-own-writes
consistency in Catalog service
Write to
database CDC
Read from
Outbox Table
Kafka
Connect
Debezium
connector
Publishes
messages
to brokers
Kafka
Broker
Eventually consistent data
exchange with Ebay Bridge Service
Catalog
Service
Ebay Bridge Service
Beyond Event Sourcing @NSilnitsky
Data Projection &
query optimization
Materializer
Beyond Event Sourcing @NSilnitsky
Query latency - naive
CreateProduct
ReadProduct
DeleteProduct
Catalog Service
Product
SDL
FilterProductWithInventory
Inventory Service
Inventory
SDL
RPC
1 2
Beyond Event Sourcing @NSilnitsky
Multi-step
Query latency - naive
CreateProduct
ReadProduct
DeleteProduct
Catalog Service
Product
SDL
FilterProductWithInventory
Inventory Service
Inventory
SDL
RPC
price < 100 and stock > 4
2
1
Beyond Event Sourcing @NSilnitsky
Query latency - DB join
CreateProduct
ReadProduct
DeleteProduct
Catalog Service
Product
SDL
FilterProductWithInventory
Inventory Service
Inventory
SDL
DB level Join
Beyond Event Sourcing @NSilnitsky
Query Latency - Materializer
Product +
Inventory
Materializer
Inventory
Inventory updated Event
Catalog
Service
Inventory
Service
FilterProductWithInventory
Beyond Event Sourcing @NSilnitsky
Simplicity
Onboarding new team member
Write performance
Read performance
consistency
Audit log/time machine
Projections/queries
Comparing Event sourcing
to Wix’s CRUD based solution
Event Sourcing
CRUD
SDL+Domain Events
Materializer
Beyond Event Sourcing @NSilnitsky
Simplicity
Onboarding new team member
Write performance
Read performance
consistency
Audit log/time machine
Projections/queries
Comparing Event sourcing
to Wix’s CRUD based solution
Event Sourcing
CRUD
SDL+Domain Events
Materializer
Beyond Event Sourcing @NSilnitsky
Simplicity
Onboarding new team member
Write performance
Read performance
consistency
Audit log/time machine
Projections/queries
Comparing Event sourcing
to Wix’s CRUD based solution
Event Sourcing
CRUD
SDL+Domain Events
Materializer
Beyond Event Sourcing @NSilnitsky
Simplicity
Onboarding new team member
Write performance
Read performance
consistency
Audit log/time machine
Projections/queries
Comparing Event sourcing
to Wix’s CRUD based solution
Event Sourcing
CRUD
SDL+Domain Events
Materializer
Beyond Event Sourcing @NSilnitsky
Simplicity
Onboarding new team member
Write performance
Read performance
consistency
Audit log/time machine
Projections/queries
Comparing Event sourcing
to Wix’s CRUD based solution
Event Sourcing
CRUD
SDL+Domain Events
Materializer
* no consistency
Beyond Event Sourcing @NSilnitsky
Simplicity
Onboarding new team member
Write performance
Read performance
consistency
Audit log/time machine
Projections/queries
Comparing Event sourcing
to Wix’s CRUD based solution
Event Sourcing
CRUD
SDL+Domain Events
Materializer
Beyond Event Sourcing @NSilnitsky
Simplicity
Onboarding new team member
Write performance
Read performance
consistency
Audit log/time machine
Projections/queries
Comparing Event sourcing
to Wix’s CRUD based solution
Event Sourcing
CRUD
SDL+Domain Events
Materializer
Beyond Event Sourcing @NSilnitsky
Summary
Wix successfully shifted its vast distributed system entirely to
CRUD-based microservices, moving away from a CRUD/event sourcing
hybrid.
.
.
.
Beyond Event Sourcing @NSilnitsky
Summary
Wix successfully shifted its vast distributed system entirely to
CRUD-based microservices, moving away from a CRUD/event sourcing
hybrid.
This transformation was driven by a commitment to standardization,
managed infrastructure with automated code generation, and a
decoupled architecture.
Beyond Event Sourcing @NSilnitsky
Summary
Advanced tools were also implemented to boost development speed,
ensure system resilience, and optimize for scale and performance.
Domain Events
Resilient Producer Materializer
Simple Data Layer
Beyond Event Sourcing
Q & A
Thank you
natansilnitsky www.natansil.com
@NSilnitsky
👉 slideshare.net/NatanSilnitsky
Q & A
www.natansil.com
@NSilnitsky

More Related Content

Similar to Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL (20)

PPTX
Effective Microservices In a Data-centric World
Randy Shoup
 
PDF
OReilly SACON2018 - Events on the outside, on the inside, and at the core
Chris Richardson
 
PDF
SVCC Developing Asynchronous, Message-Driven Microservices
Chris Richardson
 
PDF
Developing event-driven microservices with event sourcing and CQRS (svcc, sv...
Chris Richardson
 
PDF
Pragmatic Event Driven Microservices
Allard Buijze
 
PDF
Developing event-driven microservices with event sourcing and CQRS (phillyete)
Chris Richardson
 
PDF
Building and deploying microservices with event sourcing, CQRS and Docker (Be...
Chris Richardson
 
PDF
Events and microservices
Saul Caganoff
 
PPTX
Brown bag eventdrivenmicroservices-cqrs
Vikash Kodati
 
PDF
Building event-driven (Micro)Services with Apache Kafka
Guido Schmutz
 
PDF
[Hands-on] CQRS(Command Query Responsibility Segregation) 와 Event Sourcing 패턴 실습
Oracle Korea
 
PPTX
CQRS and Event Sourcing
Inho Kang
 
PPTX
Pragmatic CQRS with existing applications and databases (Digital Xchange, May...
Lucas Jellema
 
PDF
Building and deploying microservices with event sourcing, CQRS and Docker (Me...
Chris Richardson
 
PDF
"Database isolation: how we deal with hundreds of direct connections to the d...
Fwdays
 
PPTX
APIs Vs Events - Bala Bairapaka, Sandvik AB
Nordic APIs
 
KEY
Event Driven Architecture
andreaskallberg
 
PDF
Building Event Driven (Micro)services with Apache Kafka
Guido Schmutz
 
PDF
#hacksummit 2016 - event-driven microservices – Events on the outside, on the...
Chris Richardson
 
PDF
Developing Event-driven Microservices with Event Sourcing & CQRS (gotoams)
Chris Richardson
 
Effective Microservices In a Data-centric World
Randy Shoup
 
OReilly SACON2018 - Events on the outside, on the inside, and at the core
Chris Richardson
 
SVCC Developing Asynchronous, Message-Driven Microservices
Chris Richardson
 
Developing event-driven microservices with event sourcing and CQRS (svcc, sv...
Chris Richardson
 
Pragmatic Event Driven Microservices
Allard Buijze
 
Developing event-driven microservices with event sourcing and CQRS (phillyete)
Chris Richardson
 
Building and deploying microservices with event sourcing, CQRS and Docker (Be...
Chris Richardson
 
Events and microservices
Saul Caganoff
 
Brown bag eventdrivenmicroservices-cqrs
Vikash Kodati
 
Building event-driven (Micro)Services with Apache Kafka
Guido Schmutz
 
[Hands-on] CQRS(Command Query Responsibility Segregation) 와 Event Sourcing 패턴 실습
Oracle Korea
 
CQRS and Event Sourcing
Inho Kang
 
Pragmatic CQRS with existing applications and databases (Digital Xchange, May...
Lucas Jellema
 
Building and deploying microservices with event sourcing, CQRS and Docker (Me...
Chris Richardson
 
"Database isolation: how we deal with hundreds of direct connections to the d...
Fwdays
 
APIs Vs Events - Bala Bairapaka, Sandvik AB
Nordic APIs
 
Event Driven Architecture
andreaskallberg
 
Building Event Driven (Micro)services with Apache Kafka
Guido Schmutz
 
#hacksummit 2016 - event-driven microservices – Events on the outside, on the...
Chris Richardson
 
Developing Event-driven Microservices with Event Sourcing & CQRS (gotoams)
Chris Richardson
 

More from Natan Silnitsky (20)

PDF
Async-ronizing Success at Wix - Patterns for Seamless Microservices - Devoxx ...
Natan Silnitsky
 
PDF
Integration Ignited Redefining Event-Driven Architecture at Wix - EventCentric
Natan Silnitsky
 
PDF
Reinventing Microservices Efficiency and Innovation with Single-Runtime
Natan Silnitsky
 
PDF
Async Excellence Unlocking Scalability with Kafka - Devoxx Greece
Natan Silnitsky
 
PDF
Wix Single-Runtime - Conquering the multi-service challenge
Natan Silnitsky
 
PDF
WeAreDevs - Supercharge Your Developer Journey with Tiny Atomic Habits
Natan Silnitsky
 
PDF
Effective Strategies for Wix's Scaling challenges - GeeCon
Natan Silnitsky
 
PDF
Workflow Engines & Event Streaming Brokers - Can they work together? [Current...
Natan Silnitsky
 
PDF
DevSum - Lessons Learned from 2000 microservices
Natan Silnitsky
 
PDF
GeeCon - Lessons Learned from 2000 microservices
Natan Silnitsky
 
PDF
Migrating to Multi Cluster Managed Kafka - ApacheKafkaIL
Natan Silnitsky
 
PDF
Wix+Confluent Meetup - Lessons Learned from 2000 Event Driven Microservices
Natan Silnitsky
 
PDF
BuildStuff - Lessons Learned from 2000 Event Driven Microservices
Natan Silnitsky
 
PDF
Lessons Learned from 2000 Event Driven Microservices - Reversim
Natan Silnitsky
 
PDF
Devoxx Ukraine - Kafka based Global Data Mesh
Natan Silnitsky
 
PDF
Devoxx UK - Migrating to Multi Cluster Managed Kafka
Natan Silnitsky
 
PDF
Dev Days Europe - Kafka based Global Data Mesh at Wix
Natan Silnitsky
 
PDF
Kafka Summit London - Kafka based Global Data Mesh at Wix
Natan Silnitsky
 
PDF
Migrating to Multi Cluster Managed Kafka - Conf42 - CloudNative
Natan Silnitsky
 
PDF
5 Takeaways from Migrating a Library to Scala 3 - Scala Love
Natan Silnitsky
 
Async-ronizing Success at Wix - Patterns for Seamless Microservices - Devoxx ...
Natan Silnitsky
 
Integration Ignited Redefining Event-Driven Architecture at Wix - EventCentric
Natan Silnitsky
 
Reinventing Microservices Efficiency and Innovation with Single-Runtime
Natan Silnitsky
 
Async Excellence Unlocking Scalability with Kafka - Devoxx Greece
Natan Silnitsky
 
Wix Single-Runtime - Conquering the multi-service challenge
Natan Silnitsky
 
WeAreDevs - Supercharge Your Developer Journey with Tiny Atomic Habits
Natan Silnitsky
 
Effective Strategies for Wix's Scaling challenges - GeeCon
Natan Silnitsky
 
Workflow Engines & Event Streaming Brokers - Can they work together? [Current...
Natan Silnitsky
 
DevSum - Lessons Learned from 2000 microservices
Natan Silnitsky
 
GeeCon - Lessons Learned from 2000 microservices
Natan Silnitsky
 
Migrating to Multi Cluster Managed Kafka - ApacheKafkaIL
Natan Silnitsky
 
Wix+Confluent Meetup - Lessons Learned from 2000 Event Driven Microservices
Natan Silnitsky
 
BuildStuff - Lessons Learned from 2000 Event Driven Microservices
Natan Silnitsky
 
Lessons Learned from 2000 Event Driven Microservices - Reversim
Natan Silnitsky
 
Devoxx Ukraine - Kafka based Global Data Mesh
Natan Silnitsky
 
Devoxx UK - Migrating to Multi Cluster Managed Kafka
Natan Silnitsky
 
Dev Days Europe - Kafka based Global Data Mesh at Wix
Natan Silnitsky
 
Kafka Summit London - Kafka based Global Data Mesh at Wix
Natan Silnitsky
 
Migrating to Multi Cluster Managed Kafka - Conf42 - CloudNative
Natan Silnitsky
 
5 Takeaways from Migrating a Library to Scala 3 - Scala Love
Natan Silnitsky
 
Ad

Recently uploaded (20)

PDF
Wondershare PDFelement Pro Crack for MacOS New Version Latest 2025
bashirkhan333g
 
PDF
SciPy 2025 - Packaging a Scientific Python Project
Henry Schreiner
 
PDF
Build It, Buy It, or Already Got It? Make Smarter Martech Decisions
bbedford2
 
PPTX
Change Common Properties in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
PDF
vMix Pro 28.0.0.42 Download vMix Registration key Bundle
kulindacore
 
PPTX
Tally_Basic_Operations_Presentation.pptx
AditiBansal54083
 
PDF
[Solution] Why Choose the VeryPDF DRM Protector Custom-Built Solution for You...
Lingwen1998
 
PPTX
Migrating Millions of Users with Debezium, Apache Kafka, and an Acyclic Synch...
MD Sayem Ahmed
 
PPTX
Help for Correlations in IBM SPSS Statistics.pptx
Version 1 Analytics
 
PPTX
Hardware(Central Processing Unit ) CU and ALU
RizwanaKalsoom2
 
PDF
Generic or Specific? Making sensible software design decisions
Bert Jan Schrijver
 
PDF
Linux Certificate of Completion - LabEx Certificate
VICTOR MAESTRE RAMIREZ
 
PDF
Open Chain Q2 Steering Committee Meeting - 2025-06-25
Shane Coughlan
 
PPTX
Agentic Automation: Build & Deploy Your First UiPath Agent
klpathrudu
 
PPTX
Home Care Tools: Benefits, features and more
Third Rock Techkno
 
PDF
AI + DevOps = Smart Automation with devseccops.ai.pdf
Devseccops.ai
 
PPTX
Why Businesses Are Switching to Open Source Alternatives to Crystal Reports.pptx
Varsha Nayak
 
PPTX
Transforming Mining & Engineering Operations with Odoo ERP | Streamline Proje...
SatishKumar2651
 
PPTX
Human Resources Information System (HRIS)
Amity University, Patna
 
PDF
Digger Solo: Semantic search and maps for your local files
seanpedersen96
 
Wondershare PDFelement Pro Crack for MacOS New Version Latest 2025
bashirkhan333g
 
SciPy 2025 - Packaging a Scientific Python Project
Henry Schreiner
 
Build It, Buy It, or Already Got It? Make Smarter Martech Decisions
bbedford2
 
Change Common Properties in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
vMix Pro 28.0.0.42 Download vMix Registration key Bundle
kulindacore
 
Tally_Basic_Operations_Presentation.pptx
AditiBansal54083
 
[Solution] Why Choose the VeryPDF DRM Protector Custom-Built Solution for You...
Lingwen1998
 
Migrating Millions of Users with Debezium, Apache Kafka, and an Acyclic Synch...
MD Sayem Ahmed
 
Help for Correlations in IBM SPSS Statistics.pptx
Version 1 Analytics
 
Hardware(Central Processing Unit ) CU and ALU
RizwanaKalsoom2
 
Generic or Specific? Making sensible software design decisions
Bert Jan Schrijver
 
Linux Certificate of Completion - LabEx Certificate
VICTOR MAESTRE RAMIREZ
 
Open Chain Q2 Steering Committee Meeting - 2025-06-25
Shane Coughlan
 
Agentic Automation: Build & Deploy Your First UiPath Agent
klpathrudu
 
Home Care Tools: Benefits, features and more
Third Rock Techkno
 
AI + DevOps = Smart Automation with devseccops.ai.pdf
Devseccops.ai
 
Why Businesses Are Switching to Open Source Alternatives to Crystal Reports.pptx
Varsha Nayak
 
Transforming Mining & Engineering Operations with Odoo ERP | Streamline Proje...
SatishKumar2651
 
Human Resources Information System (HRIS)
Amity University, Patna
 
Digger Solo: Semantic search and maps for your local files
seanpedersen96
 
Ad

Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL

  • 1. Beyond Event Sourcing May 2024 Embracing CRUD for Wix's High-Growth Platform
  • 2. Beyond Event Sourcing Hi, I’m Natan Backend Infra Tech Lead @Wix Yoga enthusiast Speaker Blogger natansilnitsky www.natansil.com @NSilnitsky
  • 3. Beyond Event Sourcing @NSilnitsky
  • 4. Beyond Event Sourcing @NSilnitsky ~4B Daily HTTP Transactions 4000± Microservices in production ~70B Kafka messages a day
  • 5. Beyond Event Sourcing @NSilnitsky Agenda Event sourcing & CQRS Framework for CRUD services Dev velocity 1 Scalability 2 Performance 3 Resilience 4 * stores
  • 6. Beyond Event Sourcing @NSilnitsky Event Sourcing & CQRS Wix Stores Example
  • 7. Beyond Event Sourcing @NSilnitsky Add/Update product QueryProduct Product Catalog
  • 8. Beyond Event Sourcing @NSilnitsky WriteProduct Event sourcing and CQRS Product 123: Product Created 1 Product Changed (price) 2 Product Changed (description) 3 Product Changed (stock-level) 4 ReadProduct Name Price Description Stock-level Append-Only Events Snapshot
  • 9. Beyond Event Sourcing @NSilnitsky Event Store CreateProduct: Catalog Write API Event sourcing and CQRS Product Created
  • 10. Beyond Event Sourcing @NSilnitsky Event sourcing and CQRS Product 123: Product Created 1 Product Changed (price) 2 Product Changed (description) 3 Product Changed (stock-level) 4 Event Store CreateProduct: Catalog Write API Product Created
  • 11. Beyond Event Sourcing @NSilnitsky Replay GetProduct Catalog Read API Event sourcing and CQRS Replay events Product 123: Product Created 1 Product Changed (price) 2 Product Changed (description) 3 Product Changed (stock-level) 4 Event Store CreateProduct: Catalog Write API Product Created
  • 12. Beyond Event Sourcing @NSilnitsky Event sourcing and CQRS – Advantages Debug with “time travel” GetProduct Catalog Read API Replay events Product 123: Product Created 1 Product Changed (price) 2 Product Changed (description) 3 Product Changed (stock-level) 4 Event Store CreateProduct: Catalog Write API Product Created
  • 13. Beyond Event Sourcing @NSilnitsky Product 123: Product Created 1 Product Changed (price) 2 Product Changed (description) 3 Product Changed (stock-level) 4 ….. 5 Product Changed (stock-level) 30 Event Store Event sourcing and CQRS
  • 14. Beyond Event Sourcing @NSilnitsky Product 123: Product Created 1 Product Changed (price) 2 Product Changed (description) 3 Product Changed (stock-level) 4 ….. 5 Product Changed (stock-level) 30 Event Store Product 123 Snapshot Snapshot Repository Event sourcing and CQRS
  • 15. Beyond Event Sourcing @NSilnitsky Event sourcing and CQRS - Advantages Catalog Read API Inventory snapshot Product Snapshot Product Created Product Changed (price) 2 Product Changed (description) 3 Product Changed (stock-level) Product 123: 1 4
  • 16. Beyond Event Sourcing @NSilnitsky Event sourcing and CQRS - Disadvantages Product DB Create/Read Product Catalog CRUD Event Store CreateProduct: Catalog Write API Product Created Product 123 Snapshot Snapshot Repository Catalog Read API
  • 17. Beyond Event Sourcing @NSilnitsky Event sourcing and CQRS - Disadvantages Product Created (price 4$) 1 Product Changed (price 6$) 2 Product 123: Snapshot Repository Delayed Product snapshot Consumer Catalog Write API
  • 18. Beyond Event Sourcing @NSilnitsky Event sourcing and CQRS - Disadvantages Product 123: Snapshot Repository Product Created (price 4$) 1 Product snapshot Consumer Catalog Write API Product Changed 2 Product Created (price 4$) 1 Product Changed (price 6$) 2 Delayed
  • 19. Beyond Event Sourcing @NSilnitsky Event sourcing and CQRS - Disadvantages Product Changed (descriptionA) 3 Product Changed (descriptionB) 4 Product 123: Snapshot Repository Product Created (price 4$) 1 Product Changed (descriptionB) 2 Catalog Write API Product Changed (descriptionA) 3 Product Created (price 4$) 1 Product Changed (price 6$) 2 Delayed Product snapshot Consumer
  • 20. Beyond Event Sourcing @NSilnitsky Event sourcing and CQRS - Disadvantages Product Changed (descriptionA) 3 Product Changed (descriptionB) 4 Product 123: Snapshot Repository Product Created (price 4$) 1 Product 123 Snapshot Product Changed (descriptionB) 2 Product 4$ DescriptionA Product Changed (descriptionA) 3 Catalog Write API Product Created (price 4$) 1 Product Changed (price 6$) 2 Delayed Product snapshot Consumer
  • 21. Beyond Event Sourcing @NSilnitsky Read your own writes Event sourcing and CQRS - Disadvantages
  • 22. Beyond Event Sourcing @NSilnitsky Event sourcing and CQRS - Disadvantages Confetti Cannon events: Product Changed (price -1$) Read your own writes Catalog Write API Event Store
  • 23. Beyond Event Sourcing @NSilnitsky Event sourcing and CQRS - Disadvantages Confetti Cannon events: Snapshot Repository Confetti Cannon Snapshot Physical Item 3$ DescriptionA Product Changed (price -1$) Read your own writes Catalog Write API Event Store
  • 24. Beyond Event Sourcing @NSilnitsky Event sourcing and CQRS - Disadvantages Confetti Cannon events: Snapshot Repository Confetti Cannon Snapshot Physical Item 3$ DescriptionA Product Changed (price -1$) Read your own writes Catalog Write API Event Store Product Changed (price -1$) +
  • 25. Beyond Event Sourcing @NSilnitsky Product DB Update Product Catalog CRUD Event sourcing and CQRS - Disadvantages Read your own writes
  • 26. Beyond Event Sourcing @NSilnitsky Read your own writes Event sourcing and CQRS - Disadvantages
  • 27. Beyond Event Sourcing Event sourcing and CQRS - Disadvantages Complexity Eventual consistency only Massive scale Corrupted snapshot Read your own writes
  • 28. Beyond Event Sourcing @NSilnitsky APIs + Standardization
  • 29. Beyond Event Sourcing @NSilnitsky RPC Product Catalog API Cart Service Internal Wix Developer Open Platform - API First * Center 4000, clear, focused, comprehensive
  • 30. Beyond Event Sourcing @NSilnitsky HTTP/SDK Product Catalog API Internal Wix Developer PoS App External App Developer Open Platform - API First
  • 31. Beyond Event Sourcing @NSilnitsky JavaScript method Product Catalog API Internal Wix Developer Custom Filter External App Developer External Wix Site Developer (Velo) Open Platform - API First
  • 32. Beyond Event Sourcing @NSilnitsky Product Catalog API Internal Wix Developer External App Developer External Wix Site Developer (Velo) Open Platform - API First * CRUD on ES, consistent, hard in standard way. Users fast experience
  • 33. Beyond Event Sourcing @NSilnitsky Stores Bookings Events Forms Loyalty Rewards Tickets Policies Checkout Time Slots Schemas Sub missions Guests Coupons Calendar Orders Waitlist Cart Catalog Programs Open Platform - API First Internal Wix Developer External App Developer External Wix Site Developer (Velo)
  • 34. Beyond Event Sourcing @NSilnitsky Wix’s Open Platform CRUD Event sourcing Was Independent “startups” Now Single Open Platform
  • 35. Beyond Event Sourcing @NSilnitsky Wix’s Open Platform CRUD Event sourcing API First APIs - TDD + FE driven Was Independent “startups” Now Single Open Platform
  • 36. Beyond Event Sourcing Framework for CRUD services Open Platform API Schema Validations & Permissions Scaffold Persistence + Event publishing Data projections (Queries)
  • 37. Beyond Event Sourcing @NSilnitsky CreateProduct Product Document Store Catalog API Product Catalog - CRUD ReadProduct UpdateProduct DeleteProduct Unified!
  • 38. Beyond Event Sourcing @NSilnitsky CreateProduct ReadProduct UpdateProduct DeleteProduct Catalog API API First - platformized CRUD
  • 39. Beyond Event Sourcing @NSilnitsky CreateProduct ReadProduct UpdateProduct DeleteProduct Catalog API API First - platformized CRUD
  • 40. Beyond Event Sourcing @NSilnitsky CreateProduct ReadProduct UpdateProduct DeleteProduct Catalog API service ProductService { option (service_entity).message = "...v3.Product"; rpc CreateProduct (CreateProductRequest) returns (CreateProductResponse) ... rpc GetProduct (GetProductRequest) returns (GetProductResponse) ... rpc UpdateProduct (UpdateProduct) returns (UpdateProduct) ... … } message Product { option (entity) = {fqdn: "...v3.product"}; google.protobuf.StringValue id = 1; google.protobuf.Int64Value revision = 2; ... repeated Inventory inventory = 25; ... } API First - platformized CRUD
  • 41. Beyond Event Sourcing @NSilnitsky API First - platformized CRUD CreateProduct ReadProduct UpdateProduct DeleteProduct Catalog API service ProductService { option (service_entity).message = "...v3.Product"; rpc CreateProduct (CreateProductRequest) returns (CreateProductResponse) ... rpc GetProduct (GetProductRequest) returns (GetProductResponse) ... rpc UpdateProduct (UpdateProduct) returns (UpdateProduct) ... … } message Product { option (entity) = {fqdn: "...v3.product"}; google.protobuf.StringValue id = 1; google.protobuf.Int64Value revision = 2; ... repeated Inventory inventory = 25; ... }
  • 42. Beyond Event Sourcing @NSilnitsky API First - platformized CRUD
  • 43. Beyond Event Sourcing @NSilnitsky API First - platformized CRUD
  • 44. Beyond Event Sourcing @NSilnitsky Event Driven Architecture Automatic Domain Events FTW
  • 45. Beyond Event Sourcing @NSilnitsky EDA - Domain Events CreateProduct UpdateProduct DeleteProduct Product Created Product Updated Product Deleted Product Document Store Catalog Service * DE describes…
  • 46. Beyond Event Sourcing @NSilnitsky EDA - Domain Events CreateProduct UpdateProduct DeleteProduct Product Created Product Updated Product Deleted Catalog Service Product SDL * SDL is document based. no direct SQL
  • 47. Beyond Event Sourcing @NSilnitsky EDA - Domain Events CreateProduct UpdateProduct DeleteProduct Product Created Product Updated Product Deleted Catalog Service Product SDL * SDL is document based. no direct SQL sdl.insert(request.getProduct.mapTo[ProductDomain])
  • 48. Beyond Event Sourcing @NSilnitsky EDA - Domain Events CreateProduct UpdateProduct DeleteProduct Product Created Product Updated Product Deleted Product SDL Catalog Service Product SDL sdlBuilder = _.withDomainEventsEnabled(_.mapTo[Product])
  • 49. Beyond Event Sourcing @NSilnitsky EDA - Domain Events Data warehouse/Lake CreateProduct UpdateProduct DeleteProduct Product Created Product Updated Product Deleted Catalog Service Product SDL * debugging corruption
  • 50. Beyond Event Sourcing @NSilnitsky EDA - Domain Events ebay-bridge Service CreateProduct UpdateProduct DeleteProduct Catalog Service Product Created Product Updated Product Deleted Product SDL
  • 51. Beyond Event Sourcing @NSilnitsky EDA - Domain Events CreateProduct UpdateProduct DeleteProduct Product Created Product Updated Product Deleted Catalog Service Product SDL
  • 52. Beyond Event Sourcing @NSilnitsky Data consistency in Wix’s EDA Resilient Producers and consumers
  • 53. Beyond Event Sourcing @NSilnitsky Make DB Update & Event Producing Atomic Catalog Service Ebay Bridge Service * atomic, otherwise
  • 54. Beyond Event Sourcing @NSilnitsky Produce event to S3 Resilient Producer Catch Unsent Events Catalog Service
  • 55. Beyond Event Sourcing @NSilnitsky Produce to Kafka Poll Produce event to S3 Resilient Producer Fallback to S3 and Heal Catalog Service Healer Service
  • 56. Beyond Event Sourcing @NSilnitsky Consumer retries + DLQ Make DB Update & Event Producing Atomic Catalog Service Ebay Bridge Service
  • 57. Beyond Event Sourcing @NSilnitsky Alternative - use outbox pattern and/or CDC Transaction Outbox Table Insert Product Table Insert Update Delete Database Instant read-your-own-writes consistency in Catalog service Write to database CDC Read from Outbox Table Kafka Connect Debezium connector Publishes messages to brokers Kafka Broker Eventually consistent data exchange with Ebay Bridge Service Catalog Service Ebay Bridge Service
  • 58. Beyond Event Sourcing @NSilnitsky Data Projection & query optimization Materializer
  • 59. Beyond Event Sourcing @NSilnitsky Query latency - naive CreateProduct ReadProduct DeleteProduct Catalog Service Product SDL FilterProductWithInventory Inventory Service Inventory SDL RPC 1 2
  • 60. Beyond Event Sourcing @NSilnitsky Multi-step Query latency - naive CreateProduct ReadProduct DeleteProduct Catalog Service Product SDL FilterProductWithInventory Inventory Service Inventory SDL RPC price < 100 and stock > 4 2 1
  • 61. Beyond Event Sourcing @NSilnitsky Query latency - DB join CreateProduct ReadProduct DeleteProduct Catalog Service Product SDL FilterProductWithInventory Inventory Service Inventory SDL DB level Join
  • 62. Beyond Event Sourcing @NSilnitsky Query Latency - Materializer Product + Inventory Materializer Inventory Inventory updated Event Catalog Service Inventory Service FilterProductWithInventory
  • 63. Beyond Event Sourcing @NSilnitsky Simplicity Onboarding new team member Write performance Read performance consistency Audit log/time machine Projections/queries Comparing Event sourcing to Wix’s CRUD based solution Event Sourcing CRUD SDL+Domain Events Materializer
  • 64. Beyond Event Sourcing @NSilnitsky Simplicity Onboarding new team member Write performance Read performance consistency Audit log/time machine Projections/queries Comparing Event sourcing to Wix’s CRUD based solution Event Sourcing CRUD SDL+Domain Events Materializer
  • 65. Beyond Event Sourcing @NSilnitsky Simplicity Onboarding new team member Write performance Read performance consistency Audit log/time machine Projections/queries Comparing Event sourcing to Wix’s CRUD based solution Event Sourcing CRUD SDL+Domain Events Materializer
  • 66. Beyond Event Sourcing @NSilnitsky Simplicity Onboarding new team member Write performance Read performance consistency Audit log/time machine Projections/queries Comparing Event sourcing to Wix’s CRUD based solution Event Sourcing CRUD SDL+Domain Events Materializer
  • 67. Beyond Event Sourcing @NSilnitsky Simplicity Onboarding new team member Write performance Read performance consistency Audit log/time machine Projections/queries Comparing Event sourcing to Wix’s CRUD based solution Event Sourcing CRUD SDL+Domain Events Materializer * no consistency
  • 68. Beyond Event Sourcing @NSilnitsky Simplicity Onboarding new team member Write performance Read performance consistency Audit log/time machine Projections/queries Comparing Event sourcing to Wix’s CRUD based solution Event Sourcing CRUD SDL+Domain Events Materializer
  • 69. Beyond Event Sourcing @NSilnitsky Simplicity Onboarding new team member Write performance Read performance consistency Audit log/time machine Projections/queries Comparing Event sourcing to Wix’s CRUD based solution Event Sourcing CRUD SDL+Domain Events Materializer
  • 70. Beyond Event Sourcing @NSilnitsky Summary Wix successfully shifted its vast distributed system entirely to CRUD-based microservices, moving away from a CRUD/event sourcing hybrid. . . .
  • 71. Beyond Event Sourcing @NSilnitsky Summary Wix successfully shifted its vast distributed system entirely to CRUD-based microservices, moving away from a CRUD/event sourcing hybrid. This transformation was driven by a commitment to standardization, managed infrastructure with automated code generation, and a decoupled architecture.
  • 72. Beyond Event Sourcing @NSilnitsky Summary Advanced tools were also implemented to boost development speed, ensure system resilience, and optimize for scale and performance. Domain Events Resilient Producer Materializer Simple Data Layer
  • 73. Beyond Event Sourcing Q & A Thank you natansilnitsky www.natansil.com @NSilnitsky 👉 slideshare.net/NatanSilnitsky