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 performance and reliability.
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.
State transitions and communications between multiple
functions must be managed by Durable functions and Azure Logic applications
otherwise a queue can be used to store messages for cross-function
communication. The main reason for this is that storage queues are cheaper and
much easier to provide than other storage options.
Individual messages in a storage queue are limited in size
to 64 KB. Azure Service Bus queues can queue messages up to 256KB in standard
tier and up to 100 MB in the premium tier. Use service bus topics when messages
need to be filtered. Event subs are useful to support high volume
communications.
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.
Idempotent functions are best recommended for use with timer
triggers. This enables retry behavior to be correct. If a function must run once
a day, then it can be written such that it can be run any time of the day with
the same results. The functions can exit, when there is no work for a
particular day. It can also resume if the previous run failed.
Defensive functions are built to handle exceptions. It
enables the function to continue from a previous fail point upon next run.
Processing that involves a large number of records from a database must handle
a variety of faults such as those coming from network outages or quota limits.
Tracking the progress of execution is especially helpful under such
circumstances.
No comments:
Post a Comment