|
| 1 | +# Service-zu-Service-Kommunikation |
| 2 | + |
| 3 | +- Verteilte Systeme basieren auf Netzwerken |
| 4 | + - Dadurch werden sie inhärent komplex |
| 5 | + - Netzwerke sind unzuverlässig |
| 6 | + - Fehler und Latenz sind normal |
| 7 | + |
| 8 | +- Spektrum an Kommunikation |
| 9 | + - Direkte Aufrufe bis zu entkoppelten Nachrichten |
| 10 | + - Es gibt keinen "richtigen" oder "falschen" Ansatz |
| 11 | + - Eher: Es gibt "passende" und "unpassende" Ansätze |
| 12 | + - Jeder Ansatz zieht Trade-Offs nach sich |
| 13 | + |
| 14 | +- Synchrone Kommunikation |
| 15 | + - Request-Response |
| 16 | + - Direkter Aufruf, direktes Ergebnis |
| 17 | + - Enge Kopplung bezüglich Zeit und Verfügbarkeit |
| 18 | + - Vorteile |
| 19 | + - Einfach |
| 20 | + - Ergebnis liegt "sofort" vor |
| 21 | + - Einfache Fehlerbehandlung |
| 22 | + - Nachteile |
| 23 | + - Zeitliche Kopplung und Verfügbarkeit |
| 24 | + - Latenzen summieren sich |
| 25 | + |
| 26 | +- Asynchrone Kommunikation |
| 27 | + - "Fire and forget" / "Eventual Response" |
| 28 | + - Kein direkter Aufruf, kein direktes Ergebnis |
| 29 | + - Lose Kopplung bezüglich Zeit und Verfügbarkeit |
| 30 | + - Message-Queues als Vermittler |
| 31 | + - Vorteile |
| 32 | + - Zeitliche Entkopplung und Möglichkeit der Nicht-Verfügbarkeit |
| 33 | + - Bessere Resilienz |
| 34 | + - Nachteile |
| 35 | + - Höhere Komplexität |
| 36 | + - Ergebnis liegt nicht "sofort" vor |
| 37 | + - Aufwändigere Fehlerbehandlung |
| 38 | + |
| 39 | +- CAP-Theorem |
| 40 | + - Consistency vs Availability im Falle einer Partition |
| 41 | + - Synchron ist CP, asynchron ist AP |
| 42 | + - Die Frage nach CP vs AP ist *keine* technische Frage! |
| 43 | + - Sondern eine Business-Frage (Risiko und Wahrscheinlichkeit) |
| 44 | + |
| 45 | +- Latenz berücksichtigen |
| 46 | + - Latenz ist unvermeidbar |
| 47 | + - Netzwerk-Technologie, geografische Distanz, Netzwerk-Hops, Verarbeitungszeit |
| 48 | + |
| 49 | +- Timeouts (bei synchroner Kommunikation), um Latenz zu kontrollieren |
| 50 | + - Darf nicht zu kurz sein, ansonsten erhält man (vermeintliche) Fehler |
| 51 | + - Darf nicht zu lang sein, ansonsten verschwendet man Ressourcen und Zeit |
| 52 | + - Vorsicht |
| 53 | + - A -> B (mit Timeout von 30s) |
| 54 | + - A -> B -> C (jeweils mit Timeout von 30s) |
| 55 | + - A-B braucht einen längeren (!) Timeout als B-C |
| 56 | + |
| 57 | +- Fehler sind die Regel, nicht die Ausnahme |
| 58 | + - Denn in einem verteilten System können jederzeit Komponenten / Services ausfallen |
| 59 | + - Partielle Ausfälle vs Totalausfall |
| 60 | + |
| 61 | +- Protokolle für synchrone Service-zu-Service-Kommunikation |
| 62 | + - HTTP als Standard-Protokoll für synchrone Kommunikation |
| 63 | + - HTTP/2 und HTTP/3 als Alternativen |
| 64 | + - gRPC als High-Performance-Alternative |
| 65 | + |
| 66 | +``` |
| 67 | + Entkoppeln von API und Fachlichkeit |
| 68 | + | |
| 69 | + v |
| 70 | +Client -> API (HTTP) --> Fachlogik |
| 71 | + -> API (gRPC) --> |
| 72 | +``` |
| 73 | + |
| 74 | +- Protokolle für asynchrone S2S-Kommunikation |
| 75 | + - Message-Queues, zB AMQP, MQTT, … |
| 76 | + - At-least-once vs at-most-once |
| 77 | + - Push vs Pull |
| 78 | + |
| 79 | +- Push vs Pull |
| 80 | + - Service A braucht Informationen von Service B |
| 81 | + - Option 1: Service A *fragt* Service B |
| 82 | + - Pull, synchron |
| 83 | + - Fördert Autorität |
| 84 | + - Favorisiert CP |
| 85 | + - Option 2: Service B *schickt proaktiv* Daten zu Service A |
| 86 | + - Push, asynchron |
| 87 | + - Fördert Autonomie |
| 88 | + - Favorisiert AP |
| 89 | + |
| 90 | +``` |
| 91 | +Service X |
| 92 | + POST /register-webhook { url: 'http://...', ... } |
| 93 | +
|
| 94 | +1. Kommunikation: Registrieren -> synchron |
| 95 | +2. Kommunikation: Callback (per HTTP) -> synchron |
| 96 | +
|
| 97 | +oder |
| 98 | +
|
| 99 | +1. Kommunikation: Registrieren -> Callback -> asynchron |
| 100 | +2. Kommunikation: Callback (per HTTP) -> synchron |
| 101 | +``` |
| 102 | + |
| 103 | +- Was macht man, wenn ein Aufruf schiefgeht? |
| 104 | + - Retry-Pattern |
| 105 | + - Fehler durch Wiederholen versuchen zu beheben |
| 106 | + - Idempotenz als (weiche) Voraussetzung |
| 107 | + - Kurze Retry-Zeiten, aber zufällig gestreut, um Spitzen zu vermeiden |
| 108 | + - Retry-Zeiten mit exponenziellem Backoff, also zB 100ms, dann 200ms, dann 400ms, dann 800ms, … |
| 109 | + - Aber gecappt (Obergrenze)! |
| 110 | + |
| 111 | + - Circuit-Breaker |
| 112 | + - Automatische Abschaltung bei wiederholten Fehlern |
| 113 | + - Drei Zustände |
| 114 | + - Closed (Normal) |
| 115 | + - Open (Blockiert) |
| 116 | + - Half-Open (Testet, ob Verbindung wieder möglich ist) |
| 117 | + |
| 118 | + - Bulkhead-Pattern |
| 119 | + - Isolation von Ressource-Nutzung |
| 120 | + - Durch Namespaces, durch Limits, durch Pools, … |
| 121 | + - Anschauliches Beispiel |
| 122 | + - Prozess-Isolation von Tabs im Browser |
| 123 | + |
| 124 | +- Idempotenz |
| 125 | + - Mehrfache Ausführung führt zum gleichen Ergebnis |
| 126 | + - Unter Umständen kritisch für Retry-Logik |
| 127 | + - Eigentlich will man Exactly-Once |
| 128 | + - Da Exactly-Once nicht möglich ist |
| 129 | + - Weicht man in der Regel auf At-Least-Once aus |
| 130 | + - Das heißt, Nachrichten kommen eventuell doppelt |
| 131 | + - Das Ziel ist, Nachrichten zu deduplizieren |
| 132 | + - Eine Möglichkeit ist, mit idempotenten Aktionen zu arbeiten |
| 133 | + - Eine andere Möglichkeit ist, mit Message-IDs zu arbeiten |
| 134 | + |
| 135 | +- USE und RED |
| 136 | + - USE |
| 137 | + - Utilization |
| 138 | + - Misst die Auslastung von CPU, Memory, Disk, … |
| 139 | + - ZB "CPU-Last liegt bei 80%" |
| 140 | + - Saturation |
| 141 | + - Die Überlastung, wie viel Arbeit gerade nicht erledigt werden kann |
| 142 | + - ZB "50 Threads warten auf CPU-Zeit" |
| 143 | + - Errors |
| 144 | + - RED |
| 145 | + - Rate |
| 146 | + - Der Durchsatz des Services (wird der Service genutzt) |
| 147 | + - ZB "1000 Requests/s" |
| 148 | + - Errors |
| 149 | + - Duration |
| 150 | + - Ist mein Service schnell genug? |
| 151 | + - ZB "700ms pro Request" |
| 152 | + - Vergleich |
| 153 | + - USE misst interne Faktoren des Services ("Warum?") |
| 154 | + - RED misst externe Faktoren des Services ("Was?") |
| 155 | + |
| 156 | +- Chaos Engineering |
| 157 | + - Netflix Chaos Monkey |
0 commit comments