Interactions: The question of how to describe interactions is crucial for architecture analysis and for considering a system’s behavior.
Contextual Design: Architectural design is system design. System design is contextual design – it is inherently about boundaries (what’s in, what’s out, what spans, what moves between), and about tradeoffs. It reshapes what is outside, just as it shapes what is inside.
Design Across Time: System design is design across boundaries, and across (and over) time. It’s integrative. The system itself shapes the possibilities and probabilities of sociotechnical adaption.
IPC: The choice of Inter-Process Communication mechanism is an important architectural decision that can impact application availability.
Data Consistency: To solve the complex problem of maintaining data consistency in a microservice architecture, an application must use a different mechanism that builds on the concepts of loosely coupled, asynchronous services.
Distributed Tracing: Another way of understanding the behavior of a microservices-based application.
Architectural Characteristics (ACs): Effectiveness, maintainability, user friendliness, etc.
CAP Theorem: A requirement to maintain an eventually consistent replica of some data in order to implement a query.
MVP, POC, and Prototyping:
Building a Minimum Viable Product (MVP) is a great first step to ensure that a team understands the constraints and requirements of the microservices style.
Visualize Your Architecture: A whole-team whiteboard session is often a useful exercise for reviewing the overall architecture as it evolves. Focus on key quality attributes that drive out your architectural vision (scalability, performance, usability concerns, etc.).
Heuristic Questions: Use leading questions like “who?”, “what?”, “when?”, “why?” to organize information and see the situation from a different angle.
Trial and Error: Perceive each mistake as an experience that will help in making correct decisions in the future.
Lifecycle Analysis: It’s sometimes beneficial to introduce time in the analysis of an element/subsystem.
Create a practical toolbox and use it during the processes of design, refactoring, and other activities.
Use flash cards with questions and principles and use them repeatedly in checklists and design stages.