Azure
Functions:
This is a
continuation of a series of articles on Azure services from an operational
engineering perspective with the most recent introduction to Azure Functions
with the link here. This article
continues to discuss Azure Functions’ best practices with focus on organization
and scalability.
Performance and scalability concerns are clearer
with serverless function apps. Large long-running functions can cause
unexpected timeout issues. Bloating of an application is noticeable when there
are many libraries included. For example, a Node.js function application can
have dozens of dependencies. Importing dependencies increases load times that
result in unexpected timeouts. Dependencies tree can be of arbitrary breadth
and length. Whenever possible, it is best to split the function applications
into sets that work together and return responses fast. One way of doing this
involves HTTP trigger function to be separate from a queue trigger function
such that the HTTP trigger returns an acknowledgement while the payload is
placed on the queue to be processed subsequently.
Scalability is also improved when functions are
stateless. When the state is combined with the data, the functions become
stateless. For example, an order might have a state so that repeated processing
of the order transitions it from one state to another while the functions
remain stateless.
When a solution comprises of multiple functions,
they are often combined into a single function app, but they can also run-in
separate function applications. Multiple function applications can also share
the same resources by running in the same plan if the Premium and dedicated
hosting plan has been selected. Each
function has a memory footprint. When there are many functions in the same
application, they might cause the function to load more slowly than for single
function applications. Different functions might also have disproportionate
requirements and those with excessive usage can be put in their own dedicated
function application. Grouping of functions in a function application can also
be motivated by load profiles. If one gets frequent messages and another is
more resource intensive, then they can be put in separate function applications.
Function applications have a host.json file which
can be used to configure advanced behavior of function triggers, and the Azure
Functions runtime. Changes to this file can apply to all functions in the
application. Organizing different functions based on this configuration will
alleviate the operational concerns.
Functions can also be organized by privilege.
Connection strings and other credentials stored in application settings need
not be given access to all. Those that use them can be put in one function
application.
Function scaling depends a lot on managing
connections and storage accounts. It is best to avoid sharing storage accounts.
Test and production code need not be mixed in the same function app. It is
preferable not to have verbose logging in production code because it affects
performance.
No comments:
Post a Comment