This document discusses key concepts for designing distributed scalable systems, including:
- Distributed systems cannot rely on consistency, reliability of networks, or transactional guarantees. Eventual consistency is key.
- Systems should be decomposed into bounded contexts and services that have loose coupling and can scale independently.
- Asynchronous messaging using messages/events is critical for communication between distributed components.
- NServiceBus is an example framework that supports concepts like messaging, sagas for long-running workflows, retries, and publishing/subscribing to events.
- Distributed systems aim for consistency within components but eventual consistency across the system overall. Examples like email achieve this kind of consistency at scale.