Configuration Automation part 3.
This article is a continuation of the part 1 article on Configuration Automations and part 2 that
describes the syntax of the configuration templates. It describes the
process of finding and loading configurations.
Most application configurations are
composable. This means that they can be declared in separate files and can be
referenced one from the other. Configuration key values must be unique so that
their values are deterministic during the execution. Organization of files for
application configuration is subject to DevOps considerations and best
practices such as for minimizing the impact on changes to code or environment.
Application configuration files are local to
the application. The configuration is loaded from the local first before
resolving from remote. Remote configuration sources can include configuration
repositories such as with the operating system, remote store or others. They
can also include services that are injected as dependencies into the
application so that they can be read from a dedicated store that is not on the
same host as the application.
The process of resolving the configuration
keys is dependent on the system but the visibility into its final value at the
time of execution can be found from logs. Most applications will log their configurations
at least at the time of usage for diagnostics. This helps with determining
whether they were intended to be set but it does not provide a way to change
them. One way to change configuration keys is to store them in a repository
outside the application so that they can be fetched dynamically by a component
service of the application that was registered to be used at application
initialization time.
The use of dynamic retrieval of configuration
key values is a concept that allows the alteration of application behavior
without having to restart it. This is helpful to change the behavior on
subsequent requests to the application after initialization, but it does not
give any indication on the trigger that caused the configuration to change.
Audit is one way in which these changes can be effectively found but they
happen post-mortem.
Consequently, configuration services often use
a publisher-subscription method for listening to changes so that appropriate
handlers can take actions. This eliminates code or expensive and inefficient polling
services. Events are pushed through an Event Grid to subscribers. Common App
configuration event scenarios include refreshing application configuration,
triggering deployment or any configuration-oriented workflow. There is a
difference between polling mechanisms and event subscriptions where each has its advantage and can be seen with
the help of the size of the changes made to the configuration store. When the
changes are infrequent, but the scenario requires immediate responsiveness,
event-based architecture can be especially efficient. The publisher and subscribers get just the data
that has changed and as soon as the change happens which enables downstream
systems to be reactive and multiple subscribers to receive the notifications at once. They are also
relieved from implementing anything more than a message handler. There is also
the benefit that comes from the scope of the change that is passed down to the subscribers, so they get
additional information on just what configuration has changed. If the
changes become frequent, the number of notifications is large leading up to
performance bottleneck with variations in the queue size and delays in the
messages. Instead, when the changes span a lot of keys, it is best to get
those changes in bulk. A polling mechanism can get changes in batches over time
and then process through all those changes. It can even find only the updates
that were made from the time of the previous polling. This enables
incremental updates at the destination. Since a polling mechanism is a loop
that perpetually finds changes, if any, and applies them to the destination, it
can work in the background even as a single worker. A polling mechanism is a
read-only operation and therefore it does not need to fetch the data from the
store where the configuration is being actively updated. It can even fetch the
data from a mirror of the configuration store. Separation of the read-write
store from a read-only store helps improve the throughput for the clients that
update the configuration store. Read-only access is only for querying purposes
and with a store that is dedicated to this purpose, the configuration store can
deploy a suitable technology to host the read-only store that can assist with
queries. It is recommended that both the source and the destination of the
configuration store changes be made better suited to their purpose
No comments:
Post a Comment