Heiko Maaß Software-Entwicklung und Elektronische Musik

TCP- und Http-Retries mit Apache Commons HttpClient (Teil 2)

Nachdem die Antwort des aufgerufenen Services erfolgreich angekommen ist, kommt die ServiceUnavailableRetryStrategy ins Spiel. Über dieses Interface kann der Apache HttpClient instruiert werden, den Request zu wiederholen.

Die DefaultServiceUnavailableRetryStrategy wiederholt einen Request bei Erhalt des Statuscodes 503 (Service Unavailable). Die maximale Anzahl der Retries sowie das Delay kann konfiguriert werden. Neben einem Retry bei HTTP 503 empfiehlt sich im Kubernetes-Umfeld auch ein Retry bei Erhalt eines HTTP 502 (Bad-Request), der auftreten kann, wenn der aufrufende Service neu deployed wurde, und noch eine persistente Connection zum bereits abgebauten Pod besteht. Hierzu muss man das ServiceUnavailableRetryStrategy Interface selber implementieren. Jedes Retry sollte geloggt werden, um beobachten zu können, wie häufig so Retry stattfindet.

Konfiguration im HttpClient

var httpClient = HttpClientBuilder.create()
  .setServiceUnavailableRetryStrategy(new DefaultServiceUnavailableRetryStrategy(3, 500))
  .build();

Zusammenfassung

  • Retries auf TCP-Ebene: Konfiguration eines HttpRequestRetryHandlers
  • Retries auf HTTP-Ebene: Konfiguration einer ServiceUnavailableRetryStrategy
  • Für den Einsatz in Kubernetes empfiehlt es sich, von der Standardimplementierung abzuweichen und eigene Retry-Konditionen zu definieren.