So it all started with client's requirement to build a Minimum Viable Product (MVP). The backend of the product was written in python and involved processing of images using Computer Vision. We decided to host the backend in Azure.
There were lots of advantages of having the backend hosted in cloud instead of having an on-premise setup. The thing that attracted us the most was infrastructure scaling and availability of the system. We now dont have to bother about infrastructure, power consumption, system availability, system failures, etc.
We were in need of GPU machines to run the code in backend. We though of using N-Series Azure virtual machines for this purpose. We wanted to scale the machines horizontally to handle multiple requests. We booted up few more machines to handle the load. This is where Azure Load balancer came into picture. Since there were multiple instances of virtual machines, we needed someone to decide for us, which machine the request should go to. We connected all the machines to Azure load balancer and offloaded this decision making to it. Load balancer gave us the common endpoint to reach out to any of the server machines.
Soon we realised that this this, will not make the system fully scalable as we have to decide the number of instances that are connected to the load balancer. After some research, we came across Azure Virtual Machine Scale Sets. This was meant to solve the exact same problem.
Brief about Azure Virtual Machines Scale Sets (VMSS):
VMSS can be used to create a set of machines from the same image of OS. this image can be either public OS image from azure images store or a custom private image created by user with all the setup and packages needed.
VMSS has the ability to create a new VM instance from same image when certain condition is evaluated to true. These conditions has to be specified by the user. Example: When CPU reaches 75%, when RAM is 80%, when network inbound is x, etc.
Since VMSS is a set of machines grouped under same subnet of VNet and doing the same task, we need to add a load balancer to balance the network inbound to each of these machines. Azure provides load balancer as a service which can be used with VMSS. Load balancer has a public IP address associated with it, which can be used to make requests to the VMSS machines. Load balancer decides depending upon the load, which machine to send the request to.
Depending on the type of application, there can be multiple servers in the backend hosted on different machines/Azure services like webapp services, function apps, etc. In such cases we will end up having different base URLs to access different servers. This can be inconvenient for client applications. Also rate limiting of requests, monitoring the file upload sizes, adding custom authentication headers, etc becomes a bit of challenge in such cases.
Azure provides Application gateway as a service to solve these problems. Read more about application gateway and its application in this article.
Comments
Post a Comment