Going Serverless

Posted in #serverless

Design patterns and server architecture change over time as technology changes. Advancements in cloud computing has created unprecedented opportunities for organizations large and small to leverage shared resources to create faster, more reliable application stacks. This allows organizations to better serve their customers with highly-available services tailored to the needs of narrower customer segments. With this new level of flexibility and power, organizations must choose how best to utilize these resources to maximize their efforts and provide the iteration capacity to adapt quickly in rapidly changing markets.

My current company has spent the last five years building software using industry best practices. Scalability, redundancy, and speed have been top of mind since the beginning. Years of iteration has created a traditional monolithic application with multiple dependencies. While this structure has served us well over the last 5 years, we're now executing on a new architecture that will continue our commitment to following best practices and push the boundaries of cloud computing. It's time for us to serverless.

Serverless Architecture is a relatively new concept, but stems from several cloud services that attempted to abstract hardware from the development process. Traditional cloud computing uses INSTANCES, which are self-contained virtual servers that do all the processing work of an application. For large scale applications there can be hundreds or thousands of instances all connected by load balancers and other methods of routing traffic to optimize server load. This process becomes expensive, time consuming, and rife with potential problems. Code changes must be deployed to all of these servers, monitoring must be in place, dedicated teams of DevOps engineers are responsible for maintaining, patching, and optimizing this type of infrastructure. Serverless architecture uses that same concept of shared hardware and virtual machines, but completely removes the requirement for deploying, maintaining, and monitoring virtual instances.

Serverless architecture uses an application design pattern know as Microservices. Essentially a microservice is a service that is restricted to performing a very specific and limited set of tasks. This might be as simple as adding, reading, updating, and deleting a user account, or it could be more complex in that it handles all of your organization's external email, sms, and push alert services. The point is that the microservice is small, flexible, and has fewer dependencies. This makes it more portable and reusable allowing for easier maintenance and better troubleshooting. Because these Microservices do "one thing well", their codebase is typically very small with few dependencies on other services or frameworks. These small packages can then be executed as standalone "functions" on virtual hardware instead of creating dedicated environments to run them. Amazon Web Services calls this their Lambda service, which they promise to be almost infinitely scalable.

I'm sure we'll run into all sorts of challenges and roadblocks as we make this transition. However, the promise of serverless computing seems well worth the effort.