Microsoft Orleans is an implementation of the actor model, and many people have leveraged it to build highly scalable distributed systems while completely avoiding the pain of multithreaded programming.
The actor model is still not a very mainstream thing, and people who come across it are often confused about what it is and why it is useful.
In order to address this, .NET contractor Jakub Konecki (Twitter | GitHub) has kindly agreed to share with us how he has been using Microsoft Orleans in his own particular use case. You can also learn more about his project from the Orleans Virtual Meetups in which he presented (Meetup #1: Event Sourced Grains, and Meetup #12: Deploying Orleans).
DD: What is the problem you’re addressing with Microsoft Orleans?
JK: Currently I’m working for a company in the hospitality domain that manages bookings for a number of luxury resorts in the Caribbean.
I’m responsible for designing and delivering a greenfield system for a multi-tenant system for managing reservations.
The main features of the system are:
- ability to register resort accommodation,
- ability to manage pricing: rate plans, special offers,
- integration with third-party marketplace used by tour operators
- integration with third-party systems for flight searching and ticket purchasing
- integration with property management systems used by resorts
- a bespoke website that resort customers can use to search for and make their reservations.
The non-functional requirements include elastic scaling to allow for easy onboarding of new tenants and allow flexibility for existing tenants – for example the traffic may change drastically when special offers are introduced.
DD: How did Microsoft Orleans help you develop a solution?
The system is designed using DDD principles and benefits from event sourcing and event-driven architecture.
An actor framework is a good fit for this kind of system – mapping between actors and aggregate roots is natural, and implementation of event sourcing is quite straightforward and encapsulated by actors.
The Microsoft Orleans framework was selected as it was the most advanced actor framework implementation at the time that used technologies familier to the team (C#, Azure), was battle-tested, and was implicitly backed by Microsoft. Open-sourcing Orleans (and an active community that emerged shortly after) was another argument for using it.
DD: What benefits did Microsoft Orleans provide, and what challenges did you face?
JK: The most important benefits for using Orleans are scalability and programming model. Scaling an Orleans solution is as easy as moving a slider in the Azure portal. The ability to specify auto-scaling triggers in Azure means that changes in load can be handled with ease. We haven’t run into any problems related to scaling – there is no difference between running a cluster in Azure and a single node on local machine during development.
This brings me nicely to Orleans’ programming model, which makes development of distributed systems straightforward. Orleans handles a lot of complexity allowing developers to concentrate on business logic within essentially single-threaded grains. On the other hand Orleans doesn’t go to the other extreme and pretend the issues inherently related to distributed systems do not exist. That balance allows for rapid development – we’ve seen senior developers being able to pick up Orleans fundamentals and be productive within a day or two.