Production Readiness - und nicht bloß Feature Completeness

Fast jedes neue Software-System ist ein verteiltes System. Und Architekturkonzepte wie Micro Services verstärken diesen Trend. In hochgradig verteilten Systemen sind Fehler nicht die Ausnahme - sondern die Regel. Und die Fehler sind kaum vorhersagbar. Statt also immer weiter die Ausfallswahrscheinlichkeit zu minimieren - embrace failure - und stattdessen die Ausfallzeit minimieren bzw. die Auswirkungen des Fehlers reduzieren.

So lässt sich das trendige Schlagwort "Resilience" beschreiben, doch welche Konzepte und welche Patterns sind "resilient". Welche Komponenten liefert Java gleich mit? Und es wäre nicht Java, wenn es nicht bereits 2+ Bibliotheken gäbe.

Ein paar Pattern zum Konzept Latency Control:

  • Timeout: Der Caller wartet eine bestimmte Zeit auf die Response (Wait), und führt dann eine alternative Implementierung aus (Alternate Action). Seit Java 7 gibt es hier den ExectuorService.
  • Circuit Breaker: Ein Call wird im Fehlerfall nur begrenzt oft erneut abgesetzt, dann wechselt der Caller in einen Fehlermodus um schneller zu "failen" (Fail Fast). Hier unterstützen Bibliotheken wie Hystrix oder Spring Cloud.
  • Fan Out & Quickest Reply: Es werden parallel mehrere Calls abgesetzt. Die schnellste Antwort gewinnt. Hier ist ein Trade-Off zwischen Ressourcenaufwand und Antwortzeit gefragt. Dieses Pattern wurde bei Google entwickelt und beschrieben.
  • Bounded Queues: Anstatt Queues beliebig wachsen zu lassen, wird bei Erreichen einer bestimmten Länge ein alternatives Verhalten ausgeführt (parallele Queue starten, etc.). Hier bietet Java einen ThreadPoolExecutor, an dem ein PushbackHandler registriert werden kann.

Weitere Patterns mit Codebeispielen in Java gibt es auf folgenden Slides.