Wenn Sie Webanwendungen für maximale Skalierbarkeit gestalten, dann wird Ihr Engpass letztendlich auf die Verwaltung koordinierter veränderlicher Zustände (d.h. die Teile Ihrer Datenbank, die eine Form von transaktionaler Semantik erfordern) zurückzuführen sein
Einige Punkte zum Nachdenken:
-
Statische oder nicht synchronisierte/daten transaktionsdaten können günstig auf vielen kleinen handelsüblichen Servern repliziert werden. Ihre NoSQL-Lösungen (CouchDB usw.) sollten dies gut handhaben, kombiniert mit einer der vielen großartigen Cache-Lösungen für statische Webdaten.
-
Lokale CPU-Verarbeitungskapazität (z.B. Verarbeitung einzelner Webanfragen) lässt sich einfach horizontal skalieren, indem Sie mehr Webserver-Knoten hinzufügen. Die CPU-Geschwindigkeit wird wahrscheinlich ohnehin nicht Ihr Engpass sein, angesichts der modernen Prozessorgeschwindigkeiten - die meisten Webanwendungen benötigen nicht wirklich viel CPU-Leistung.
-
Die transaktionale Aktualisierung von Daten ist jedoch ein sehr komplexes Problem. Lesen Sie über das Problem der byzantinischen Generäle, wenn Sie die theoretische Erklärung wissen möchten, aber im Grunde genommen ist es unmöglich, Transaktionen in einem verteilten System zuverlässig zu koordinieren. Sie müssen einige Kompromisse eingehen, basierend darauf, was Ihnen am wichtigsten ist (Datenintegrität? Leistung? Skalierbarkeit? Ausfallsicherheit? Kosten? Latenz?).
-
Betriebssysteme usw. machen nicht wirklich einen großen Unterschied - der Overhead ist so gering und es beeinträchtigt nicht wirklich die Skalierbarkeitsüberlegungen. Verwenden Sie, worin Sie Fähigkeiten haben und/oder was Sie am einfachsten zu verwalten finden. Persönlich verwende ich Ubuntu auf Amazon EC2.
Angesichts der Art von Anwendungen, mit denen Sie es zu tun haben, würde ich wahrscheinlich mehr zu den NoSQL-Lösungen tendieren, da es wichtiger zu sein scheint, große Volumina effizient zu verarbeiten als viele transaktionsbezogene Daten zu haben. Sie können immer eine PostgreSQL-Box für die begrenzte Teilmenge von Daten behalten, die eine transaktionale Semantik erfordern (Benutzerkonten? Master-Referenzdaten? bestimmte Workflow-Zustände?)
Der andere (klassischere) Ansatz wäre, eine typische große Datenbank (z.B. Oracle, DB2) zu verwenden und einen teuren Cluster von High-End-Datenbank-Maschinen zu kaufen. Haben Sie dann viele günstige, replizierte Webserver, die den größten Teil der Arbeit erledigen und bei Bedarf auf den Datenbank-Cluster zugreifen, wenn sie Transaktionen ausführen müssen. Dies kann bis zu dem Punkt extrem gut funktionieren, an dem der Datenbank-Cluster überlastet wird, was dann zu einem teuren Engpass werden kann… aber wenn Sie so viel Last bekommen, können Sie es sich wahrscheinlich leisten. Ich würde diesen Weg gehen, wenn Sie z.B. eine Finanzdienstleistungs-App erstellen.
Wenn Sie nur einen Prototyp erstellen oder anfangs mit kleineren Lasten rechnen, können Sie anstelle eines teuren Datenbank-Clusters eine einzelne handelsübliche PostgreSQL-Maschine verwenden. Dies ist wahrscheinlich die einfachste / günstigste Option zur Einrichtung. Und wenn Sie den Datenbankzugriff auf ein Minimum beschränken (viel Caching, sorgfältiges Abfragedesign), kann dies tatsächlich ziemlich weit führen. Seien Sie sich einfach bewusst, dass es letztendlich Ihr Engpass wird, wenn Sie weiter wachsen.
p.s. Sie haben erwähnt, dass Sie sich Clojure ansehen, falls Sie dies noch nicht getan haben, empfehle ich dringend, dieses Video anzusehen: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey - eine sehr einzigartige Perspektive auf Nebenläufigkeit, die auch einige Einblicke in die Probleme der Verwaltung transaktionaler Daten in Nebenläufigen Umgebungen gibt.