Blog>
Snippets

Implementing Exponential Backoff Strategy

Code example illustrating how to implement an exponential backoff strategy for query retries in React Query, helping to manage server load during high demand or outages.
import { QueryClient, QueryClientProvider } from 'react-query';

// Function to implement exponential backoff
function exponentialBackoff(retryAttempt = 1, baseDelay = 1000) {
  // Calculate the delay with a random factor to avoid 'thundering herd' effect
  const delay = Math.min(baseDelay * 2 ** retryAttempt, 30000); // Cap at 30 seconds
  return delay * (0.5 + Math.random() * 0.5);
}

// Create a new QueryClient instance
const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      // Use the retry function for adjusting the attempt
      retry: (failureCount, error) => {
        // You might want to check for specific errors to not retry
        //if (error.status === 404) return false;
        const delay = exponentialBackoff(failureCount);
        console.log(`Retrying after ${delay}ms`);
        // Implement delay
        return new Promise(resolve => setTimeout(resolve, delay));
      }
    }
  }
});
This code defines a function to calculate the delay for each retry attempt using an exponential backoff algorithm. It then creates a new QueryClient instance from React Query and customizes its retry strategy to use this function. This helps manage server load by progressively increasing the delay between retries in case of failures. It includes a cap on the delay to ensure it doesn't exceed a reasonable threshold. The usage of randomness in the delay calculation helps to avoid synchronized retries from multiple clients (the thundering herd problem).