© Excellent backgrounds/Shutterstock.com
Resiliente Microservices mit Spring Boot und Failsafe

Einstürzende Neubauten


Microservices sind nach wie vor das Thema. Mit einher geht in der Regel die Diskussion über Resilienz. Mit der Integration von Failsafe in Microservices kann man diese resilient gestalten.

Video: Microservices mit Spring Boot, Angular 2 und Docker

Stellen wir uns vor, wir sind Mitarbeiter eines Start-ups, das die Zahlungen für einen Onlineshop abwickelt, der Flip-Flops verkauft. Der Name unseres Start-ups ist Paymento. Da wir mit den neuesten Trends gehen, sind alle unsere Dienste als Microservices implementiert. Wenn ein Kunde im Shop einkauft und im Warenkorb den Button Jetzt bezahlen drückt, erhält unser System (Payment-Service) eine Anfrage, und wir übernehmen das Risiko für diese Zahlung, sobald wir die Anfrage positiv quittiert haben. Da das Risiko so gering wie möglich gehalten werden soll, rufen wir für jede erhaltene Anfrage einen weiteren Service auf (Solvency-Service), der die Solvenz des Kunden überprüft. Es kommt der Tag der Tage, und unsere Systeme kommen an ihre Grenzen. Da wir unsere Anwendungen in AWS betreiben, können wir entsprechend einfach skalieren. Während einer Lastspitze passiert es dann aber doch: der Solvency-Service bricht unter der Last zusammen und ist nicht mehr erreichbar. Wegen eines schlecht konfigurierten Time-outs im Payment-Service laufen alle Anfragen für 30 Sekunden, bis sie fehlschlagen. Es dauert nicht lange, und alle Threads des Payment-Service-Threadpools sind belegt. Sobald neue Instanzen des Solvency-Service starten, werden sie mit Anfragen bombardiert und brechen direkt wieder unter der Last zusammen. Uns bleibt nichts anderes übrig, als sämtlichen eingehenden Verkehr zu blockieren und genügend Instanzen des Solvency-Service zur Verfügung zu stellen. Das bedeutet zumindest kurzzeitig den Totalausfall, und unsere Kunden verlassen frustriert den Flip-Flop-Summer-Sale. Listing 1 zeigt exemplarisch den REST-Controller unseres Service, Listing 2 die Clientimplementierung für den Solvency-Service ohne jegliche Absicherung.

Listing 1: REST-Controller „payments“

@RestController @Slf4j @RequestMapping(value = "/payments") public class PaymentController { private PaymentProcessor processor; public PaymentController(PaymentProcessor processor) { this.processor = processor; } @PostMapping public ResponseEntity createPayment(@RequestBody final PaymentResource paymentResource) { log.debug("Processing payment {}", paymentResource); boolean processingResult = processor.processPayment(paymentResource); if(processingResult...

Exklusives Abo-Special

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang