There are a lot of concepts and papers that have influenced the way I design and build software. One concept that certainly should be on the list is 'Autonomous Computing' as introduced by Pat Helland more than 20 years ago.
If you have never heard about this concept, I would recommend to first read this paper before you continue reading my blog post.
Back? Let’s continue.
In the paper Pat introduces the concept of Fiefdoms and Emissaries and Collaborations.
Fiefdoms refer to independent, autonomous components within a computing system. Each fiefdom is responsible for a specific aspect or function of the overall system. They operate independently and have their own decision-making capabilities.Emissaries are entities that facilitate communication and coordination between fiefdoms. They act as messengers, relaying information and requests between different components of the system. Emissaries enable fiefdoms to interact and collaborate without direct dependencies on each other.
A collaboration is an abstraction for a set of messages into and out of a fiefdom for a single long-running business operation.
Each of those concepts sound familiar to specific techniques I like to use when building software.
Technique 1 – The actor model
The actor model is a theoretical framework for concurrent computation that treats actors as fundamental units of computation. Actors are independent entities that communicate with each other by sending and receiving messages. Each actor has its own internal state and can perform actions in response to messages it receives.
In Helland's vision of autonomous computing, systems are composed of autonomous components that communicate asynchronously through message passing. This aligns with the principles of the actor model, where actors operate independently and communicate via message passing.
Both the actor model and Helland's concept emphasize decentralized, loosely-coupled systems where components can operate autonomously and reactively. By leveraging message passing and asynchronous communication, systems can be more scalable, resilient, and adaptable to changing conditions.
So an actor could be seen as a fiefdom.
Technique 2 – An anti-corruption layer
In Domain Driven Design, the anti-corruption layer is a design pattern used to isolate a bounded context from external systems or domains with different models or languages. It acts as a translation layer, ensuring that communication between different bounded contexts remains consistent and that the internal model of a context is protected from external influences.
Similarly, in Helland's concept of collaborations, the emissaries serve as intermediaries between autonomous components, facilitating communication and coordination. They ensure that interactions between fiefdoms are well-defined and consistent, helping to maintain the autonomy and integrity of each component.
Both the anti-corruption layer in DDD and collaborations in autonomous computing focus on managing interactions between different parts of a system to prevent conflicts, maintain autonomy, and enable interoperability. They provide mechanisms for managing complexity and ensuring that systems remain cohesive and adaptable as they evolve.
So an anti-corruption layer could be seen as an emissary.
Technique 3 – Sagas
In the context of distributed systems and event-driven architectures, a saga is a pattern used to manage long-lived transactions that span multiple (micro)services or components.
A saga represents a sequence of local transactions that are coordinated to achieve a global outcome. Each local transaction corresponds to a step in the saga and is responsible for making changes within its own bounded context. If a step fails, compensating actions are executed to undo the changes made by previous steps.
This aligns with the concept of a collaboration that is used to represent a single long-running business process.
So a saga could be seen as a collaboration.
Summary
Pat proposes a vision where computing systems are more autonomous, decentralized, and responsive. The techniques above can help you to realize that vision.
It certainly helped me to build better systems.
More information
Anti-corruption Layer pattern - Azure Architecture Center | Microsoft Learn