Slide 1

Slide 1 text

Feel free to share online. Functional Event Sourcing using Sekiban November 19, 2024 Solution2 C# Community Discord Conference. UTC 17:30 - .NET Foundation Youtube. 1 / 26

Slide 2

Slide 2 text

Feel free to share online. About Speaker Tomohisa Takaoka X: @tomohisa Github: @tomohisa Works at : J-Tech Creations, Inc. , J-Tech Japan. Inc. JTS Group - Japan Technical Software Inc. Microsoft MVP for Developer Technologies (Web Development, .NET) new from November 2024 - OSS: Sekiban - Event Sourcing and CQRS Framework ResultBoxes - Railway Oriented Programing Library. 2 / 26

Slide 3

Slide 3 text

Feel free to share online. Functional Event Sourcing using Sekiban 3 / 26 Agenda 1. What is Event Sourcing? 2. What is “Functional” Event Sourcing? 3. Sekiban - Event Sourcing and CQRS Framework. 4. Live Coding 5. Summary

Slide 4

Slide 4 text

Feel free to share online. 1. What is Event Sourcing? 4 / 26

Slide 5

Slide 5 text

Feel free to share online. 1. What is Event Sourcing? Event Sourcing is... “Event Sourcing is an architectural design pattern where changes that occur in a domain are immutably stored as events in an append-only log. This provides a business with richer data as each change that occurs within the domain is stored as a sequence of events which can be replayed in the order they occurred. This means you’re able to see more than just the current state of your domain - you can see what lead up to the current state.” - EventStore Blog 5 / 26 Add 1 Coffee Add 1 Orange Add 1 Tea Remove 1 Orange 1 Coffee Added 1 Coffee Added 1 Orange Added 1 Coffee Added 1 Orange Added 1 Tea Added 1 Coffee Added 1 Orange Added 1 Tea Added 1 Orange Removed 1. Can use removed data for the data analysis or adding features. 2. Can track histories of the data - audit and debug capabilities.

Slide 6

Slide 6 text

Feel free to share online. What is CQRS? CQRS stands for Command Query Responsibility Segregation. It was also proposed by Greg Young, who released the “CQRS Documents” around 2010 (ish). The key point is that when saving data with a Command, it uses the write model. When reading data with a Query, we use the read model. The read model can be a materialized view or a live projection. Event Sourcing is most likely used with CQRS; however, in many cases, CQRS is used without Event Sourcing. 1. What is Event Sourcing? 6 / 26 Client Command Handler (Function) Event Store Projection Query Events Workflow CQRS Event Sourcing Materialized View

Slide 7

Slide 7 text

Feel free to share online. Why Event Sourcing? ● Audit and History by Default. ○ By appending events without deleting old data, it becomes clear where data originates. This also makes debugging easier. ● Separation of Concerns for Writing and Reading. ○ Queries can sometimes get complex, but state sourcing forces developers to consider both reading and writing when designing tables. Event Sourcing allows developers to focus on writing first, with queries refined later. ● Scalability ○ We can adjust how data is stored and the infrastructure for events and each read model independently, making it easier to scale out an event-sourced system. ...etc 1. What is Event Sourcing? 7 / 26

Slide 8

Slide 8 text

Feel free to share online. 1. What is Event Sourcing? Common Questions. ● Can Event Sourcing and CQRS be applied to parts of a system? ○ YES! It can be applied to just one microservice or even a single type of aggregate. ● Is Event Sourcing only applicable to complex microservices? ○ NO! It can be used in small systems or even in monolithic architectures. ● Do Event Sourcing and CQRS systems always require streaming databases like Kafka or pub/sub streaming systems? ○ NO! Event Sourcing and CQRS do not necessarily require event-driven or streaming databases. However, for larger systems, event streaming can solve many challenges associated with microservices. ● Is the cost of infrastructure generally higher than traditional RDBMS-based systems? ○ NOT always! For one of our clients, we implemented an ES/CQRS system that was cheaper than an RDBMS-based system of similar scale. It really depends on how efficiently you utilize your events. ● Is Event Sourcing and CQRS difficult to learn? ○ MAYBE? We train our interns to build systems using Event Sourcing, and they often develop at the same speed or even faster compared to traditional approaches. 8 / 26

Slide 9

Slide 9 text

Feel free to share online. 2. What is “Functional” Event Sourcing? 9 / 26

Slide 10

Slide 10 text

Feel free to share online. 2. What is “Functional” Event Sourcing? 10 / 26 Functional Programming using C# ● Functional programming is a programming style that can be applied in nearly any language. It emphasizes a few key principles: ○ Pure Functions: Functional programmers focus on the idea that pure functions are predictable and reliable because they depend only on their inputs. ○ Immutability: Functional programming emphasizes immutability to avoid side effects, making code safer, especially in multithreaded or parallel processing scenarios. ○ Function Composition: Experienced functional programmers often use function composition as a way to create more readable and maintainable code by chaining simple functions together. ● Recent enhancements in C# make it easier for C# developers to leverage the power of functional programming. Some of these key improvements include: ○ Records: Introduced to create immutable data structures more easily. Records focus on value equality rather than reference equality, making them ideal for scenarios where data immutability and simple data structures are needed. ○ Pattern Matching: Extended pattern matching capabilities in C# allow for more concise and expressive code, enabling developers to decompose and match complex data structures seamlessly. This is particularly useful for implementing functional-style branching and control flow.

Slide 11

Slide 11 text

Feel free to share online. 2. What is “Functional” Event Sourcing? Non Functional - Procedural 11 / 26 Functional ● Not changing User state. ● Immutable for record and command ● Give action instead of log in the function to make function pure.

Slide 12

Slide 12 text

Feel free to share online. 2. What is “Functional” Event Sourcing? "Event sourcing is naturally functional—it's an append-only log of facts that have happened in the past. You can say that any projection, any state, is essentially a left fold over your previous history. It is a purely functional model, always intended to be functional, and it fits really, really well with functional code. You're going to start seeing more and more people doing functional programming on top of event-sourced systems." — Greg Young 12 / 26 Concept of Event Sourcing really matches functional programming style. “Domain Modeling Made Functional” book.

Slide 13

Slide 13 text

Feel free to share online. Decider Pattern 2. What is “Functional” Event Sourcing? Simple explanation, Command and Current state is input and “Decide” to produce event. State can “Evolve” by adding Event. 13 / 26

Slide 14

Slide 14 text

Feel free to share online. Railway Oriented Programming. ● Result Pattern : Always return Value OR Error. ● Railway Oriented Programming: Connecting Function that returns Result multiple times. In functional language like F#, with Pipeline. In C#, method chaign will be used. ● “Domain Modeling Made Functional” by Scott Wlaschin explains how developer can use functional programming to efficiently design domain. 2. What is “Functional” Event Sourcing? Error Value Type 2 Value Type 1 Function f1 return return Error Value Type3 Function f2 return return Bind Error Value Type 4 Function f3 return return Bind 14 / 26

Slide 15

Slide 15 text

Feel free to share online. 3. Sekiban - Event Sourcing and CQRS Framework. 15 / 26

Slide 16

Slide 16 text

Feel free to share online. 3. Sekiban - Event Sourcing and CQRS Framework. 16 / 26 Basics of Sekiban. ● Open Sourced in December 2023, now focus on SME. ○ Everything we use, you can use under Apache 2.0 ● Written in modern C#, Supports .NET 8 & .NET 9 new! ○ Can be used in C# and F# ● Multiple Infrastructure Support ○ Azure Cosmos DB ○ AWS Dynamo DB ○ Postgres ○ coming soon ... WASM Indexed DB, SQLite ● “Functional” style interfaces. ○ Command handler is “almost” pure function. ■ Returns Result, can return errors or event. ○ Event Handler is pure function ○ Workflow style usecases ● Github star makes us happy 🥹

Slide 17

Slide 17 text

Feel free to share online. 3. Sekiban - Event Sourcing and CQRS Framework. Command and Command Handler 17 / 26

Slide 18

Slide 18 text

Feel free to share online. 3. Sekiban - Event Sourcing and CQRS Framework. Event and Apply to the Aggregate 18 / 26

Slide 19

Slide 19 text

Feel free to share online. 3. Sekiban - Event Sourcing and CQRS Framework. Domain testing made easy. 19 / 26

Slide 20

Slide 20 text

Feel free to share online. 3. Sekiban - Event Sourcing and CQRS Framework. Web API generation (if you want) 20 / 26

Slide 21

Slide 21 text

Feel free to share online. 3. Sekiban - Event Sourcing and CQRS Framework. Sekiban + Aspire 9 = 󰗨 ● Database: Postgres, Cosmos DB can be used with Aspire and Sekiban. ○ Cosmos DB Emulator is not working with Apple Silicone. ○ We use Postgres on local and deploy Postgres or Cosmos DB. ● Azure Blob Storage can be used for the Snapshots. ○ Small Testing can be done without Blob Storage. ● Sekiban has own Aspire (cosmos) integration ○ Aspire 9.0.0 - can be used for .NET 8 or 9 ● .NET 9 Open API ● Simple Blazor frontend can be used for testing. ○ Good developer experience. ● Deployment can be done. ○ We have not tested yet. 21 / 26

Slide 22

Slide 22 text

Feel free to share online. 4. Live Coding. 22 / 26

Slide 23

Slide 23 text

Feel free to share online. 4. Live Coding 23 / 26 Menu. ● Aspire Starter Template ○ Add Postgres ● Simple Domain ○ Aggregate ○ Command and Handler ○ Event ● Generate Web API ● Change Frontend Blazor ● Add Test ... if time allows

Slide 24

Slide 24 text

Feel free to share online. 5. Summary 24 / 26

Slide 25

Slide 25 text

Feel free to share online. 5. Summary ● Event Sourcing can be gradually adopted in specific parts of your system. ● Functional programming is possible with C#, allowing you to focus on individual functions and reduce complex bugs. ● Event Sourcing is naturally functional by design. ● Sekiban leverages the power of functional programming within Event Sourcing and CQRS. ● Add Sekiban or Event Sourcing in your Toolbox! 25 / 26

Slide 26

Slide 26 text

Thank You 26 Sekiban Github https://github.com/J-Tech-Japan/Sekiban Resultbox Github https://github.com/J-Tech-Japan/ResultBoxes Today’s Sample https://github.com/tomohisa/Solution2_202411 19_Sample J-Tech Creations, Inc Website. https://www.jtechs.com English Blog https://tomohisa.hashnode.dev