is the name given, to the process of defining the components, parts, or modules into which a system or software can be divided.
- Ex: Breaking large monolithic applications into separate and smaller parts
- Scalability: It is better to have two applications at 40% than one at 80%.
- Agility: It is easier to respond to changes in the system (attention to coupling).
- Speed-to-market: Domain modules facilitate business changes in the system.
- Availability (Fault Tolerance): If one module fails, the others can continue to work.
- Deployability: More frequent deployments with less risk to the system (attention on coupling)
- Testability: It is easier and faster to test small modules thoroughly.
- Maintainability: Easy to add, change, and remove features. (ex: patches)
- The scalability and elasticity can suffer with increased communication between the services.
- With an increase in the number of modules, it is better to consider asynchronous communication.
- Asynchronous communication favors fault tolerance, scalability, and elasticity.