---
title: Mixer
overview: Architectural deep-dive into the design of Mixer, which provides the policy and control mechanisms within the service mesh.
order: 20
layout: docs
type: markdown
---
The page explains Mixer's role and general architecture.
## Background
Infrastructure backends are designed to provide support functionality that is used to build services.
They include such things as access control systems, telemetry capturing systems, quota enforcement
systems, billing systems, and so forth. Services traditionally directly integrate with these
backend systems, creating a hard coupling and baking-in specific semantics and usage options.
Mixer provides a generic intermediation layer between application code and infrastructure backends.
Its design moves policy decisions out of the app layer and into configuration instead, under operator control.
Instead of having application code integrate with specific backends, the app code instead does a fairly simple
integration with Mixer, and Mixer takes responsibility for interfacing with the backend systems.
Mixer is *not* designed to create a _portability layer_ on top of infrastructure backends. It's not about trying to
just define a universal logging API, universal metric API, universal billing API, and so forth. Instead, Mixer is designed to
change the boundaries between layers in order to reduce systemic complexity, eliminating policy logic from service code and giving control
to operators instead.
Mixer Traffic Flow
Mixer provides three core features: - **Precondition Checking**. Enables callers to verify a number of preconditions before responding to an incoming request from a service consumer. Preconditions can include whether the service consumer is properly authenticated, is on the service's whitelist, passes ACL checks, and more. - **Quota Management**. Enables services to allocate and free quota on a number of dimensions, Quotas are used as a relatively simple resource management tool to provide some fairness between service consumers when contending for limited resources. Rate limits are examples of quotas. - **Telemetry Reporting**. Enables services to report logging and monitoring. In the future, it will also enable tracing and billing streams intended for both the service operator as well as for service consumers. These mechanisms are applied based on a set of [attributes](./attributes.html) that are materialized for every request into Mixer. Within Istio, Envoy depends heavily on Mixer. Services running within the mesh can also use Mixer to report telemetry or manage quotas. (Note: as of Istio {{ site.data.istio.version }}, only Envoy can call Mixer.) ## Adapters Mixer is a highly modular and extensible component. One of it's key functions is to abstract away the details of different policy and telemetry backend systems, allowing Envoy and Istio-based services to be agnostic of those backends, which keeps them portable. Mixer's flexibility in dealing with different infrastructure backends is achieved by having a general-purpose plug-in model. Individual plug-ins are known as *adapters* and they allow Mixer to interface to different infrastructure backends that deliver core functionality, such as logging, monitoring, quotas, ACL checking, and more. Adapters enable Mixer to expose a single consistent API, independent of the backends in use. The exact set of adapters used at runtime is determined through configuration and can easily be extended to target new or custom infrastructure backends.Request Phases
## Scripting > This section is preliminary and subject to change. We're still experimenting with the concept of scripting in Mixer. Mixer's attribute processing phase is implemented via a scripting language (exact language *TBD*). The scripts are provided a set of attributes and are responsible for producing the adapter parameters and dispatching control to individual configured adapters. For common uses, the operator authors adapter parameter production rules via a relatively simple declarative format and expression syntax. Mixer ingests such rules and produces a script that performs the necessary runtime work of accessing the request's incoming attributes and producing the requisite adapter parameters. For advanced uses, the operator can bypass the declarative format and author directly in the scripting language. This is more complex, but provides ultimate flexibility.