REST-Dienst mit load balancing
Ich habe angesichts der Vorteile von REST-Dienste, die ganze Staatenlosigkeit und session-affinity "Zeug". Was mir auffällt ist, dass wenn Sie mehrere Versionen bereitgestellt von Ihrem Dienst auf eine Reihe von Maschinen in Ihre Infrastruktur, und Sie wirken alle auf eine bestimmte Ressource, wo ist der Staat, der die Ressource gespeichert?
Wäre es sinnvoll, einen einzigen host in der Infrastruktur nutzt einen verteilten cache, und jedem Staat, der änderung innerhalb eines service, es ist einfach, holt/bringt der cache? Dies würde es erlauben, eine beliebige Anzahl von bereitgestellten Dienste für das laden von balancing-Gründen für alle den gleichen Zustand Ansichten von Ressourcen.
- Dies scheint sehr theoretisch, könnten Sie genauer beschreiben, was du versuchst zu erreichen?
- Staatenlosigkeit ist nicht spezifisch für den REST. Was meinst du über "session affinity"?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie entwerfen ein system für hohe Last (was in der Regel bedeutet eine hohe Zuverlässigkeit), mit einem single point of failure ist nie eine gute Idee. Wenn der service die Bereitstellung der konsequente Blick nach unten geht, am besten Ihre Leistung drastisch abnimmt, als die Datenbank abgefragt, für alles und im schlimmsten Fall Ihre gesamte Anwendung nicht mehr funktioniert.
In Ihrer Frage, Sie scheinen besorgt zu sein über die Konsistenz. Wenn es etwas zu lernen gibt, darüber eBay-Architektur, es ist ein trade-off zwischen Verfügbarkeit/Redundanz/performance vs Konsistenz. Sie können finden 100% Konsistenz ist nicht erforderlich, und Sie können sich mit ein wenig "chaos".
Einen verteilten cache (wie memcache) kann verwendet werden, als Unterlage für eine distributed hashtable, die in großem Umfang verwendet wurden zur Erstellung von skalierbaren Infrastrukturen. Wenn es richtig umgesetzt, caches redundant sein können und caches können beitreten und verlassen den ring dynamisch.
REST ist auch von Natur aus cacheable wie die HTTP-Schicht zwischengespeichert werden kann, mit dem richtigen Einsatz von überschriften (ETags) und software (z.B. der Squid-proxy als Reverse-proxy). Der einzige Nachteil der Angabe durch caching-Header ist, dass er sich auf dem client zu interpretieren und Sie zu respektieren.
Jedoch, in Anlehnung an Phil Karlton, caching ist schwer. Sie haben wirklich selektiv sein, über die Daten, die Sie speichern, wenn Sie cache und wie man Sie entkräften, dass die cache. Ungültig kann auf folgende Arten geschehen:
Ich bin teilweise zu den timer-basierten Ansatz einfacher zu implementieren und man kann sagen, mit ziemlicher Sicherheit, wie lange die veralteten Daten werden live in das system (z.B. Firmen details aktualisiert, 2 Stunden, Aktienkurse aktualisiert werden in 10 Sekunden).
Schließlich hohe Belastung hängt auch davon ab, Ihren Anwendungsfall und je nach der Anzahl der Transaktionen nichts davon gelten. Eine Methode (wenn man so will) können die folgenden sein:
Nachdem alle, können Sie nicht ein performance-problem in den ersten Platz, und Sie können in der Lage, Weg mit einer einzigen Datenbank und eine gute back-up-Strategie.
Ich denke, dass die eher traditionelle Ansicht von load-balancing von web-Anwendungen ist, dass Sie Ihre REST-Dienst auf mehreren Anwendungsservern, und Sie würden abrufen von Ressourcendaten aus einzelnen Datenbank-server.
Jedoch mit der Nutzung von hypermedia, REST-services können leicht vertikal partitionieren Sie die Anwendung so, dass einige Ressourcen von einer service-und einige von anderen Dienstes auf einem anderen server. Dies würde Ihnen ermöglichen, zu skalieren, in gewissem Maße, je nach domain, ohne einen einzigen datenspeicher. Offensichtlich ist mit dem REST würden Sie nicht in der Lage sein zu tun, Transaktions-updates über diese Dienste, aber es gibt durchaus Szenarien, in denen diese Aufteilung ist wertvoll.
Wenn Sie sind auf der Suche Architekturen, die brauchen, um wirklich zu skalieren, dann würde ich vorschlagen, Blick auf Greg Young stuff auf die CQS-Architektur ( video ), bevor versucht wird, auf die Bewältigung der Probleme eines verteilten Caches.