2017-05-24 7 views
1

Sagen wir, ich habe mehrere Mikro-Dienste (REST API), das Problem ist, wenn ein Dienst nicht zugänglich ist (nennen wir Service "A") die Daten, die an Service "A" gesendet wurden, werden in der temporären Datenbank gespeichert . Und nachdem der Service funktioniert hat, werden die Daten erneut gesendet. Frage: 1. Sollte ich den Service erstellen, der alle 10 Sekunden an den Service "A" sendet, um zu wissen, ob der Service funktioniert oder nicht? Oder ist es möglich, es durch Aufgabenwarteschlange zu tun? Irgendwelche Vorschläge?Wie man Microservice-Fehler verwaltet?

+0

Warum Dienst 'A' nicht' ACK' sendet, damit Sie sicherstellen, dass er die Daten empfangen hat? – Xaqron

Antwort

0

Polling ist eine Verschwendung von Bandbreite. Sie möchten eine transaktionale-Warteschlange verwenden.

Werfen Sie alle ausgehenden Nachrichten in die Warteschlange und führen Sie einen anderen Prozess aus, um die Nachrichten zu verarbeiten.

Wie dies funktionieren wird, ist - nach dem Prozess aus der Warteschlange liest und versucht, den REST-Service zu senden:

  • Wenn es funktioniert, begehen die Transaktion (für die Warteschlange)
  • Wenn es funktioniert nicht, nicht begehen. Starten Sie eine Verzögerung (Minuten, Sekunden - Sie wissen es am besten), bis Sie erneut aus der Warteschlange lesen.
0

Ihre Frage hat mehrere Dimensionen. Zuerst möchten Sie eine Infrastruktur in Betracht ziehen, die Ausfallsicherheit bietet, und self healing. Dies bedeutet, dass Sie einen Cluster von Containern bereitstellen möchten, die alle Ihren Service A enthalten. Sie verwenden nun einen Load Balancer oder ein API-Gateway vor Ihrem Dienst, um Aufrufe/Ladevorgänge zu verteilen. Es wird auch regelmäßig auf die Gesundheit Ihres Dienstes überprüfen. Wenn festgestellt wird, dass ein Container nicht korrekt reagiert, kann der Container gelöscht und ein weiterer gestartet werden. Dies kann durch eine Container-Infrastruktur wie kubernetes/docker swarm usw. bereitgestellt werden.

Jetzt schützt dies Sie nicht vor dem Verlust von Anfragen. Im Falle eines Fehlverhaltens eines Containers bleibt zwischen dem Fehler und dem nächsten Gesundheitscheck noch eine kurze Zeit, in der die Anfragen möglicherweise nicht bedient werden. In vielen Anwendungen ist dies akzeptabel und die Client-Seite wird nur erneut anfordern und einen anderen (gesunden Container) treffen. Wenn Ihre Anwendung absolut keine Anforderungen verlieren muss, müssen Sie die Anforderung beispielsweise in einem API-Gateway zwischenspeichern und sicherstellen, dass sie so lange gespeichert wird, bis ein Dienst sie abgeschlossen hat (auch Circuit Breaker genannt). Eine Beispieltechnologie wäre Netflix Zuul mit Hystrix. Die Verwendung eines solchen Gatekeepers mit eingebauter Fehlertoleranz kann die Ausfallsicherheit noch weiter erhöhen. Als Randbemerkung - Die Verwendung eines API-Gateways kann auch Probleme mit zentraler Authentifizierung/Autorisierung, Routing und Überwachung lösen. Ein weiterer Ansatz zum Hinzufügen von Resilienz/Decouple ist die Verwendung einer schnellen Streaming-/Nachrichtenwarteschlange wie Apache Kafka zum Aufzeichnen aller eingehenden Nachrichten und deren Verarbeitung durch einen Nachrichtenprozessor. Der Trick besteht darin, die Nachrichten nur als verarbeitet zu markieren, wenn Ihre Anfrage vollständig geliefert wurde. Dies kann auch in Szenarien hilfreich sein, in denen Fehler aufgrund einer großen Anzahl von Anforderungen auftreten können, die vom Dienst nicht in Echtzeit verarbeitet werden können (Asynchronous Decoupling with Cache).

0

Sie können Circuit Breaker-Muster für z. Hystrix Leistungsschalter von Netflix.

Es ist möglich, die Leistungsschalterbasis bei einem Timeout zu öffnen, oder wenn der Serviceanruf fehlschlägt oder nicht erreichbar ist.

0

Der Dienst "A" sollte ein "Bereit" -Ereignis auslösen, sobald es verfügbar ist. Höre dir das an und sende deine Anfrage erneut.

Verwandte Themen