An Introduction to Serverless Computing
As developers, we often agonize over the amount of time spent procuring resources, setting up environments, and performing all the other tasks that prevent us from doing what we love most: developing! While cloud-computing technologies have helped to address this problem by making it easy to acquire resources such as servers, computing power, and storage, the problem of setting up these complex application hosts still plagues us. To further compound the issue, maintaining these servers can be quite costly in terms of time and money. Fortunately, technology often rises to meet the needs of its users, and so we have our featured serverless architecture.
At a high level, the concept behind a serverless architecture is quite simple. Rather than forcing users to provision servers on which to run their code, vendors offer the ability for users to upload a function and the vendor takes care of the execution of that function. The vendor handles the acquisition of resources such as memory and computing power. These event-driven functions are ideal for asynchronous message processing. Furthermore, these functions can scale horizontally by instantiating additional copies of the code and running in parallel. In the Amazon Web Service (AWS) ecosystem, this Function as a Service (FaaS) offering is known as AWS Lambda. Integrated with other services, AWS Lambda offers developers a way to build a full web application without ever needing to spin up a server. Microsoft Azure has a parallel offering name Azure Functions that allow much of the same capability. Architectures that incorporate services like AWS Lambda and Azure Functions lend themselves to being micro-service oriented architectures, which offer many advantages.
From a developer perspective, the benefits are immediately apparent. However, from an enterprise point of view, how could a serverless architecture potentially be beneficial? From a cost perspective, serverless architectures can be significantly less expensive compared to the cost of keeping servers active in the cloud. For most if not all FaaS offerings, the number of function executions determines the majority of the computing cost. Consider a single component in an application that experiences limited usage, but is a necessary component. In a traditional cloud computing architecture, paying to maintain a server or more commonly a set of servers is likely a huge waste of money considering the application only uses the computing power sparsely. Often, applications primarily rely on server instances for mainly their computing power so logically it would be preferred and beneficial if the platform could abstract the details behind that acquiring that computing power.
However, as with all things in technology, serverless architectures are not without their own unique set of challenges and shortcomings. For example, the first real offerings of FaaS as we know them now only began appearing in 2015, making serverless computing a younger, less matured technology. Despite a growing community, the technology has not had the same amount of exposure for the in-depth support to exist. Serverless computing can also suffer from performance issues relating to slow initialization since the vendor needs to spin up resources for the function to run. Beyond performance issues, serverless architectures can be quite complex depending on the granularity of the functions. Debugging in a serverless architecture is quite challenging given the distributed nature of the application and furthermore, redesigning an existing application to make use of a serverless architecture is a non-trivial task. While these aforementioned challenges can be daunting, they are still very much conquerable.
Ultimately, serverless architectures have a lot to offer to existing and new applications. Despite its shortcomings, it an evolving technology that is gaining traction rapidly. Any developer looking to utilize a cloud environment should strongly consider incorporating a serverless architecture into their application design.