Join us for GraphQL Summit, October 10-12 in San Diego. Use promo code ODYSSEY for $400 off your pass.
Docs
Launch GraphOS Studio

Distributed caching for the Apollo Router

With GraphOS Enterprise


⚠️ This is an Enterprise feature of the Apollo Router. It requires an organization with a GraphOS Enterprise plan.

If your organization doesn't currently have an Enterprise plan, you can test out this functionality by signing up for a free Enterprise trial.

If you have multiple Apollo instances, those instances can share a Redis-backed cache for their query plans and automatic persisted queries (APQ). This means that if any of your instances caches a particular value, all of your instances can look up that value to significantly improve responsiveness.

For more details on query plans and APQ, see the article on in-memory caching.

To use this feature:

How it works

Whenever a instance requires a query plan or APQ query string to resolve a client :

  1. The instance checks its own in-memory cache for the required value and uses it if found.
  2. If not found, the instance then checks the distributed Redis cache for the required value and uses it if found. It also then replicates the found value in its own in-memory cache.
  3. If not found, the instance generates the required query plan or requests the full string from the client for APQ.
  4. The instance stores the obtained value in both the distributed cache and its in-memory cache.

Redis URL configuration

The distributed caching configuration must contain one or more URLs using different schemes depending on the expected deployment:

  • redis - TCP connected to a centralized server.
  • rediss - TLS connected to a centralized server.
  • redis-cluster - TCP connected to a cluster.
  • rediss-cluster - TLS connected to a cluster.
  • redis-sentinel - TCP connected to a centralized server behind a sentinel layer.
  • rediss-sentinel - TLS connected to a centralized server behind a sentinel layer.

The URLs must have the following format:

One node

redis|rediss :// [[username:]password@] host [:port][/database]

Example: redis://localhost:6379

Clustered

redis|rediss[-cluster] :// [[username:]password@] host [:port][?[node=host1:port1][&node=host2:port2][&node=hostN:portN]]

or, if configured with multiple URLs:

[
"redis|rediss[-cluster] :// [[username:]password@] host [:port]",
"redis|rediss[-cluster] :// [[username:]password@] host1 [:port1]",
"redis|rediss[-cluster] :// [[username:]password@] host2 [:port2]"
]

Sentinel

redis|rediss[-sentinel] :// [[username1:]password1@] host [:port][/database][?[node=host1:port1][&node=host2:port2][&node=hostN:portN]
[&sentinelServiceName=myservice][&sentinelUsername=username2][&sentinelPassword=password2]]

or, if configured with multiple URLs:

[
"redis|rediss[-sentinel] :// [[username:]password@] host [:port][/database][?[&sentinelServiceName=myservice][&sentinelUsername=username2][&sentinelPassword=password2]]",
"redis|rediss[-sentinel] :// [[username1:]password1@] host [:port][/database][?[&sentinelServiceName=myservice][&sentinelUsername=username2][&sentinelPassword=password2]]"
]

Distributed query plan caching

To enable distributed caching of query plans, add the following to your 's YAML config file:

router.yaml
supergraph:
query_planning:
experimental_cache:
redis:
urls: ["redis://..."]
timeout: 5ms # Optional, by default: 2ms

The value of urls is a list of URLs for all Redis instances in your cluster.

⚠️ You should specify your Redis URLs via environment variables and variable expansion. This prevents your Redis URLs from being committed to version control, which is especially dangerous if they include authentication information like a username and/or password.

Distributed APQ caching

To enable distributed caching of automatic persisted queries (APQ), add the following to your 's YAML config file:

router.yaml
apq:
router:
cache:
redis:
urls: ["redis://..."]
timeout: 5ms # Optional, by default: 2ms

The value of urls is a list of URLs for all Redis instances in your cluster.

⚠️ You should specify your Redis URLs via environment variables and variable expansion. This prevents your Redis URLs from being committed to version control, which is especially dangerous if they include authentication information like a username and/or password.

Previous
In-memory caching
Next
Logging
Edit on GitHubEditForumsDiscord