This is going to be a series of posts exploring my revelations stemming from last couple of years designing a SaaS solution for IT organizations.
Probably like most startups, or even most new product developments we set out to deliver the features. Scalability was one of the desired quality attributes, but considering how prioritizing one attribute affects all the others, it wasn’t on top. Moreover, knowing about experiences at places like MySpace, it’s a given that we’ll end up rewriting some parts of the system with every other increase in the order of magnitude of user transactions. As our understanding of our domain and our users improves, as the usage metrics become available we’ll figure out what needs to change to get the next x10.
With this in mind, we set out to work with these priorities for the code:
- Small and easy to maintain
- RAD-supported, rich UI with dynamic query capabilities
- Low friction data access
- Low coupling between interacting bits
Simple. No Scalability here. Leaving aside Security, this is what it translated into:
- Lightweight, POCO domain model with Root Aggregates
- Unit tests and Continuous Integration
- Silverlight with 3rd party controls and RIA services
- An ORM and SQL Server backend
- Message passing with guaranteed delivery
Here is where it gets interesting, with some of the patterns we used in implementation:
- A Repository capable of carrying out dynamic queries
- Unit of work
- Dependency injection
- Lightweight service bus with publisher/subscriber
At this point we’re in our second or third month of development, with the staging environment getting ready for testing on EC2. Every developer has a complete system running on their machine. We handle the entire projected load while running on a single virtual machine and we haven’t even had to make any sacrifices or do anything in terms of optimizations.
These may or may not seem impressive, but if felt good to get some stuff done and done right. All along the features are the focus and we can handle several concurrent users and hundreds of data entities.
Next I’ll talk about our first Scalability endeavour and how relatively small an effort that was for x100 gain.