ltbxd-actorle/docs/superpowers/specs/2026-04-05-tmdb-retry-design.md

46 lines
1.5 KiB
Markdown
Raw Normal View History

2026-04-05 21:37:37 +00:00
# TMDB Retry on Timeout / 5xx
**Date:** 2026-04-05
## Problem
During film import, `TMDBGateway` makes sequential HTTP calls to TMDB (one `searchMovie` + one `getMovieCredits` per new film). Under load, TMDB stops responding and Symfony's HttpClient raises an idle timeout exception, causing the film to be counted as failed.
## Goal
Retry TMDB requests automatically on transient failures (idle timeout, 5xx responses) without retrying on legitimate "not found" cases (empty search results).
## Solution
Use Symfony's built-in `RetryableHttpClient`, which wraps any `HttpClientInterface` and transparently retries on:
- Network/transport errors (including idle timeout)
- HTTP 5xx responses
With exponential backoff: retry 1 → ~1s → retry 2 → ~2s → retry 3 → fail.
If all retries are exhausted, the exception propagates to `ImportFilmsBatchMessageHandler` which counts the film as `failedFilms` — unchanged behavior.
## Implementation
**Only `config/services.yaml` is modified.** No PHP class changes.
```yaml
services:
app.http_client.tmdb:
class: Symfony\Component\HttpClient\RetryableHttpClient
arguments:
$client: '@http_client'
$maxRetries: 3
App\Gateway\TMDBGateway:
arguments:
$client: '@app.http_client.tmdb'
```
`RetryableHttpClient` is part of `symfony/http-client` which is already a project dependency.
## Out of scope
- Rate limiting (not the cause of the current issue)
- Batch/concurrent TMDB requests (TMDB has no batch endpoint)