1. Integration as an Integral Part of Architecture: Modern applications are composed of decoupled components that must communicate effectively. Integration is no longer an afterthought but a fundamental aspect of application architecture.
2. Coupling and Decoupling: Coupling between components can lead to issues; however, it's not binary. The right amount of coupling depends on control over the components and the specific context (like programming languages or run-time dependencies).
3. Control Flow and Flow Control:
Understanding the difference between data flow and control flow is crucial for designing asynchronous systems. Properly managing the two can optimize performance and resilience.
4. Message Order and Delivery Semantics: The use of FIFO queues and message groups can help maintain message order when processing. However, achieving global order can be complex, particularly when scaling.
5. Error Handling and Replay: Systems should be equipped to handle transient failures and implement strategies such as dead-letter queues to manage "poison pill" messages.
6. Automation and Cloud: Effective cloud architecture requires automation through tools such as AWS CDK, which allows for the expression of complex designs in an understandable and manageable way.
1. It's never just two boxes and a line!
2. The best way to make systems loosely coupled is by not connecting them.
3. The appropriate level of coupling depends on the level of control you have over the endpoints.
4. Loose coupling is better than lousy coupling.
5. Queues invert control flow but require flow control.
6. Pushing messages at the arrival rate is called "denial of service attack".
7. If you are synchronous, you aren't resilient!
8. Nothing has brought down more systems than retry logic.
9. System designers love in-order delivery, but everyone waiting in line hates it.
10. Exactly-once delivery is the painful path to a shared database.