This is a continuation of an article that describes operational
considerations for hosting solutions on Azure public cloud.
There are several references to best practices throughout the series of
articles we wrote from the documentation for the Azure Public Cloud. The
previous article focused on the antipatterns to avoid, specifically the busy database
antipattern. This one focuses on busy frontend antipattern.
This antipattern occurs when there are many background threads that can
starve foreground tasks of their resources which decreases response times to
unacceptable levels. There is a lot of advantages to running background jobs
which avoids the interactivity for processing and can be scheduled
asynchronously. But the overuse of this feature can hurt performance due to the
tasks consuming resources that foreground workers need for interactivity with
the user, leading to a spinning wait and frustrations for the user. It appears
notably when the foreground is monolithic compressing the business tier with
the application frontend. Runtime costs might shoot up if this tier is metered.
An application tier may have finite capacity to scale up. Compute resources are
better suitable for scale out rather than scale up and one of the primary
advantages of a clean separation of layers and components is that they can be
hosted even independently. Container orchestration frameworks facilitate this
very well. The Frontend can be as lightweight as possible and built on
model-view-controller or other such paradigms so that they are not only fast
but also hosted on separate containers that can scale out.
This antipattern can be
fixed in one of several ways. First the processing can be moved out of the
application tier into an Azure Function or some background api layer. If the
application frontend is confined to data input and output display operations
using only the capabilities that the frontend is optimized for, then it will
not manifest this antipattern. APIs and Queries can articulate the business
layer interactions. The application then uses the .NET framework APIs to run
standard query operators on the data for display purposes.
UI interface is designed for purposes specific to the application. The
introduction of long running queries and stored procedures often goes against
the benefits of a responsive application. If the processing is already under
the control of the application techniques, then they should not be moved.
Avoiding unnecessary data transfer solves both this antipattern as well as chatty I/O
antipattern. When the processing is moved to the business tier, it provides the
opportunity to scale out rather than require the frontend to scale up.
Detection of this antipattern
is easier with the monitoring tools and the built-in supportability features of
the application layer. If the frontend activity reveals significant processing
and very low data emission, it is likely that this antipattern is manifesting.
Examine the work performed by the Frontend in terms of latency and page
load times which can be narrowed down by callers and scenarios, may reveal just
the view models that are likely to be causing this antipattern
Finally, periodic assessments must be performed on the application tier.
No comments:
Post a Comment