Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Our way to microservices

Pendekatan ke microservices dengan Domain Driven Design (DDD), Command Query Responsibility Segregation (CQRS), Event Sourcing (ES)

Our way to microservices

  1. 1. OUR WAY TO MICROSERVICES Supported By: DDD – CQRS - ES
  2. 2. Supported By: I’M ANDI PANGERAN @andi_pangeran cybercoding.wordpress.com
  3. 3. Supported By:
  4. 4. Not that way… Supported By:
  5. 5. What we need right now is.. Supported By:
  6. 6. Refactoring our logic Supported By:
  7. 7. AGENDA  DOMAIN DRIVEN DESIGN  COMMAND QUERY RESPONSIBILITY SEGREGATION  EVENT SOURCING  AMQP MESSAGING  PROFT OF CONCEPT, SPRING BOOT + AXON FRAMEWORK Supported By:
  8. 8. DOMAIN DRIVEN DESIGN Supported By: Introduction
  9. 9. Supported By: DOMAIN DRIVEN DESIGN • .. For most software projects, the primary focus should be on the domain and domain logic.
  10. 10. Supported By: DOMAIN DRIVEN DESIGN
  11. 11. Supported By: DOMAIN DRIVEN DESIGN DESIGN STRATEGIC DESIGN TACTICAL DESIGN
  12. 12. Supported By: DOMAIN DRIVEN DESIGN DESIGN STRATEGIC DESIGN  Bounded Context  Ubiquitouse Language  Context Map
  13. 13. Supported By: DOMAIN DRIVEN DESIGN Bounded Context General Ledger Account Payable Account Recieveable Assets Management InventoryBudget Control Accounting Application
  14. 14. Supported By: DOMAIN DRIVEN DESIGN Ubiquitous Language DOMAIN EXPERT Developer
  15. 15. Supported By: DOMAIN DRIVEN DESIGN Context Map Context mapping is a design process where the contact points and translations between bounded contexts are explicitly mapped out. Focus on mapping the existing landscape, and deal with the actual transformations later. ?Relation General Ledger Account Payable
  16. 16. Supported By: DOMAIN DRIVEN DESIGN Shared Kernel
  17. 17. Supported By: DOMAIN DRIVEN DESIGN Relation Pattern  Open House Services  Customer – Supplier  Anti Corruption Layer
  18. 18. Supported By: DOMAIN DRIVEN DESIGN Strategic Design
  19. 19. Supported By: DOMAIN DRIVEN DESIGN DESIGN  Entity  Value Object  Aggregates  Domain Events  Layered Architecture TACTICAL DESIGN
  20. 20. Supported By: Entity & Value Object Entity… An object fundamentally defined not by its attributes, but by a thread of continuity and identity. Value Object… An immutable object that describes some characteristic or attribute but carries no concept of identity.
  21. 21. Supported By: Aggregate … Cluster of associated objects that are treated as a unit for the purpose of data changes. … Aggregate enforce concictency Order Line Items Customer Shipping Address Aggregate Root
  22. 22. Supported By: Domain Events … Something meaningful that happened in the Domain … Communicating state changes of Aggregates … Immutable Value Objects
  23. 23. Supported By: Layered Architecture Domain Application Infrastructure Entity Value Object Repository
  24. 24. Supported By: DOMAIN DRIVEN DESIGN Tactical Design
  25. 25. Refactoring ? Supported By:
  26. 26. CQRS Supported By: Introduction
  27. 27. Supported By: CQRS Pioneered by Greg Young & Udi Dahan In this context, » Commands = Writes » Queries = Reads Command/Query Responsibility Segregation (CQRS) is the idea that you can use a different model to update information than the model you use to read information.
  28. 28. Supported By: CQRS
  29. 29. Supported By: Why Is CQRS needed ? Read vs Write Capacity… Scale read operations differently from write operations Split the concerns… Simplicity in domain model by separating read and writes. Decreased COMPLEXITY… Write need validation and consequential logic. Read have many representation model, and storage mechanism (polyglot storage)
  30. 30. Supported By: How Does CQRS work ? Persistent View Model schema matches UI view model Scale out as many copies as needed Command captures the intent of the user Commandbus deliver command to command handler A queue can be utilized to optimize write performance After database is updated, publish result to view model via eventbus
  31. 31. Supported By: How Does CQRS work ? Command  Commands encapsulate the user’s intent but do not contain business logic, only enough data for the command.  Command message handled by command handler.  Just once command handler / command message.  Command handler can reject a command, validation / bussines rules violation
  32. 32. Supported By: How Does CQRS work ? Event  Events describe changes in the system state.  An Event Bus can be utilized to dispatch events to subscribers.  Events primary purpose update the read model  Events can also provider integration with external systems  CQRS can also be used in conjunction with Event Sourcing.
  33. 33. Event Sourcing Supported By: Introduction
  34. 34. Supported By: Traditional systems store current state INSERT INTO charging_stations VALUES (“CP001”, “Acme Corp.”, “Widget B”); INSERT INTO charging_stations VALUES (“CP003”, “ABC Widgets”, “Model-1”); UPDATE charging_stations SET model = “Widget A” WHERE identity = “CP001”;
  35. 35. Supported By: Traditional systems store current state
  36. 36. Supported By: Traditional systems store current state keeping only the current state… lot of valuable historic data is lost, e.g. the information about the time a state change happened, who invoked the change, and so on. This historic data may remind you of something called an audit log. conceptual model… there is no single model that could be used universally for every possible case that the system needs to address. Moreover, the structure of the application data tends to change overtime..
  37. 37. Supported By: Store the sequence of events that led up to the current state.
  38. 38. Supported By: populate the application state via projection
  39. 39. Supported By: Snapshoting SNAPSHOT
  40. 40. CQRS Supported By: Back to
  41. 41. Supported By: How Does CQRS work ? Persistent View Model  Read model can be denormalized RDBMS, document store, etc.  Optimize read model with different data storage technologies for different kinds of data (polyglot)  Eventually Concistence
  42. 42. Supported By: How do we apply the Concepts ?
  43. 43. Supported By: CORE
  44. 44. Supported By: CORE
  45. 45. Supported By: CORE
  46. 46. Supported By: CTM CORE
  47. 47. Supported By: CORE
  48. 48. Supported By: CTM CORE
  49. 49. Supported By: CORE
  50. 50. Advanced Message Queuing Protocol (AMQP) Supported By: Introduction
  51. 51. Supported By: AMQP IN A NUTSHELL A producer is a user application that sends messages A exchange is message router that routes message to queue. There is Direct, Fanout, Topic Exchange A queue is a buffer that stores messages A consumer is a user application that receives messages.
  52. 52. Supported By: Fanout Exchange A fanout exchange routes messages to all of the queues that are bound to it and the routing key is ignored. If N queues are bound to a fanout exchange, when a new message is published to that exchange a copy of the message is delivered to all N queues. Fanout exchanges are ideal for the broadcast routing of messages.
  53. 53. Supported By: Direct Exchange A direct exchange delivers messages to queues based on the message routing key
  54. 54. Supported By: Topic Exchange Topic exchanges route messages to one or many queues based on matching between a message routing key and the pattern that was used to bind a queue to an exchange.
  55. 55. Supported By: Sample Spring AMQP Configuration
  56. 56. Axon Framework Supported By: Introduction
  57. 57. Supported By: Why Axon Framework Compatibility with CQRS and ES … Axon Framework is a Java Framework for scalable and high performance applications and being focused on making life easier for developers that want to create applications based on the CQRS principles and concepts, i.e. commands, events, aggregates, entities, sagas, etc. On top of that, it also supports event sourcing. Integrability… It supports the Spring Framework's configuration and dependency injection. It also uses Java annotations for building the domain model and event listeners without being tied to the Axon's specific logic. Active development and support… the latest version at the time of writing this was 2.4.4. It is actively developed, a new major version 3 is a work in progress. It has nice and detailed documentation and a sample project to showcase the code. The authors also provide commercial services such as support contracts, training, and consultancy. Popularity… The code repository on GitHub has more than 300 stars and 100 forks. The user community is active on the mailing lists and on the issue tracker.
  58. 58. Supported By: Axon Framework CommandBus SimpleCommandBus… It does straightforward processing of commands in the thread that dispatches them. After a command is processed, the modified aggregate(s) are saved and generated events are published in that same thread. AsynchronousCommandBus … It does processing of commands in new thread. After a command is processed, the modified aggregate(s) are saved and generated events are published in that same thread. DisruptorCommandBus … The DisruptorCommandBus takes a different approach to multithreaded processing. Instead of doing the processing in the calling thread, the tasks are handed off to two groups of threads, that each take care of a part of the processing. The first group of threads will execute the command handler, changing an aggregate's state. The second group will store and publish the events to the Event Store and Event Bus.
  59. 59. Supported By: Axon Framework SimpleCommandbus Configuration
  60. 60. Supported By: Axon Framework AsynchronousCommandBus Configuration
  61. 61. Supported By: Axon Framework DisruptorCommandBus Configuration
  62. 62. Supported By: Axon Framework EventBus SimpleEventBus … The SimpleEventBus just dispatches each incoming Event to each of the subscribed EventListeners sequentially. If an EventListener throws an Exception, dispatching stops and the exception is propagated to the component publishing the Event.. ClusteringEventsBus … The ClusteringEventsBus allows application developers to bundle EventListeners into Clusters based on their properties and non-functional requirements. The ClusteringEventBus is also more capable to deal with Events being dispatched among different machines. Contains two mechanisms: the ClusterSelector, which selects a Cluster instance for each of the registered EventListeners, and the EventBusTerminal, which is responsible for dispatching Events to each of the relevant clusters..
  63. 63. Supported By: Axon Framework SimpleEventBus Configuration
  64. 64. Supported By: Axon Framework ClusteringEventBus Configuration
  65. 65. Supported By: Axon Framework Event Store FileSystemEventStore… The FileSystemEventStore stores the events in a file on the file system. It provides good performance and easy configuration. Not a suitable implementation for production environments JpaEventStore … The JpaEventStore stores events in a JPA-compatible data source. Unlike the file system version, the JPAEventStore supports transactions. The JPA Event Store stores events in so called entries. To use the JpaEventStore, you must have the JPA (javax.persistence) annotations on your classpath.. JDBC Event Store … The JDBC event store uses a JDBC Connection to store Events in a JDBC compatible data storage. Typically, these are relational databases. Theoretically, anything that has a JDBC driver could be used to back the JDBC Event Store. MongoDB Event Store … Use mongodb to store Events.
  66. 66. Supported By: Axon Framework JdbcEventStore Configuration
  67. 67. Supported By: Axon Framework MongoDb EventStore Configuration
  68. 68. Supported By: Axon Framework Aggregate Repositories GenericJpaRepository… This is a repository implementation that can store JPA compatible Aggregates. It is configured with an EntityManager to manage the actual persistence, and a class specifying the actual type of Aggregate stored in the Repository. EventSourcingRepository … The EventSourcingRepository implementation provides the basic functionality needed by any event sourcing repository in the AxonFramework. HybridJpaRepository… The HybridJpaRepository is a combination of the GenericJpaRepository and an Event Sourcing repository. It can only deal with event sourced aggregates, and stores them in a relational model as well as in an event store. When the repository reads an aggregate back in, it uses the relational model exclusively..
  69. 69. Supported By: Axon Framework Sample Repository Configuration
  70. 70. Spring Boot + Axon Framework Supported By: Proft Of Concept
  71. 71. QUESTIONS ? Supported By:
  72. 72. Supported By: Recommended Reading
  73. 73. Thanks Supported By:

×