Problem · Design

LLM Provider Pool Failover

Learn this problem
MediumPerplexity AI logoPerplexity AIFULLTIMEPHONE SCREEN

Problem statement

You operate a prioritized pool of external LLM providers. The array providers lists their unique names from highest to lowest priority. Every provider is initially healthy.

Process the events in events from left to right:

  • ["DOWN", provider] marks provider unhealthy.
  • ["UP", provider] marks provider healthy.
  • ["REQUEST"] routes one request to the healthy provider with the smallest index in providers. If every provider is unhealthy, the result for that request is "UNAVAILABLE".

UP and DOWN events are idempotent. A recovered higher-priority provider is eligible for the next request immediately.

Return a string array containing the routed provider name, or "UNAVAILABLE", for every REQUEST event in event order. Health-change events do not add an output.

Function

routeRequests(providers: String[], events: String[][]) → String[]

Examples

Example 1

providers = ["openai","anthropic","gemini"]events = [["REQUEST"],["DOWN","openai"],["REQUEST"],["DOWN","anthropic"],["REQUEST"],["UP","openai"],["REQUEST"]]return = ["openai","anthropic","gemini","openai"]

The first request uses openai. After it goes down, anthropic is the highest-priority healthy provider. After anthropic also goes down, the next request uses gemini. Bringing openai back makes it the highest-priority choice again.

Example 2

providers = ["alpha","beta"]events = [["DOWN","alpha"],["DOWN","beta"],["REQUEST"],["UP","beta"],["REQUEST"]]return = ["UNAVAILABLE","beta"]

The first request arrives while both providers are down, so it produces "UNAVAILABLE". After beta recovers, the next request routes to beta.

Constraints

  • 1 <= providers.length <= 10^5
  • 1 <= events.length <= 10^5
  • Provider names are unique non-empty lowercase strings.
  • Every UP or DOWN event names a provider in providers.
  • Each event is exactly one of the three documented shapes, and at least one event is ["REQUEST"].
  • The total number of characters across provider names and events is at most 10^6.

More Perplexity AI problems

drafts saved locally
public String[] routeRequests(String[] providers, String[][] events) {
    // Write your solution here
}
providers["openai","anthropic","gemini"]
events[["REQUEST"],["DOWN","openai"],["REQUEST"],["DOWN","anthropic"],["REQUEST"],["UP","openai"],["REQUEST"]]
expected["openai", "anthropic", "gemini", "openai"]
checking account