Die häufigsten Fallstricke bei der Skalierbarkeit von Websites


8

Wir entwerfen eine Website / Webanwendung, auf der wir eine hohe Benutzeranzahl und im Allgemeinen eine hohe Nutzung erreichen möchten. Insbesondere beabsichtigen wir, PHP als Programmier- / Skriptsprache und MySQL als Start für die relationale Datenbank zu verwenden. Wir haben noch nicht herausgefunden, ob wir eine NoSQL-Datenbank verwenden sollen oder nicht.

In diesem Zusammenhang möchten wir die Skalierbarkeit berücksichtigen. Was sind die häufigsten Fallstricke bei der Skalierbarkeit von Websites? Was sind die Schlüsselbereiche, die wir berücksichtigen müssen, damit das System leicht skalierbar ist?


Welche Hosting-Plattform erwägen Sie?
mhoran_psprep

1
Das fühlt sich an wie eine Liste / Litanei-Frage.
Michael Brown

Skalierbarkeit mit PHP? Viel Glück. Verwenden Sie besser Zend.
Jordanien

@ Jordan: Es gibt mehrere Websites, auf denen PHP ausgeführt wird und die monatlich Milliarden von Seitenaufrufen ausführen. (Netlog, Wikipedia, Facebook, Tumblr, Flickr)
Joeri Sebrechts

1
Ja, und jeder von ihnen verfügt entweder über eine große Infrastruktur, um dies zu unterstützen, oder im Fall von zumindest Facebook und Tumblr, um es insgesamt zu umgehen.
Jordanien

Antworten:


11

Ich würde noch etwas hinzufügen: Optimieren am falschen Ort. Ich habe unzählige Artikel gesehen, in denen es um Nanosekundenunterschiede bei PHP-Syntaxkonstrukten geht, aber noch weniger darum, wie die Caching-Infrastruktur für eine Anwendung richtig gestaltet werden kann. Also, wie schon bemerkt, testen. Aber nicht nur testen - Profil und herausfinden was genauist langsam - ist es CPU-gebunden? E / A gebunden? Speicher gebunden? Sind es Datenbankabfragen, die Sie zum Absturz bringen, lesen Sie die Dateien, sind es Berechnungen? Können Sie das beseitigen oder wiederholen, damit es schneller funktioniert? Beginnen Sie nicht mit "Verwenden wir NoSQL, weil es schneller ist". Beginnen Sie mit "Wir wollen dies und das tun, was wären die Engpässe? Wie beseitigen wir sie? Wie würde es sich verhalten, wenn wir mal 100 Benutzer bekommen?" Ohne mehr über die Arbeitslast und die App zu wissen, ist es schwierig, etwas Konkretes zu sagen, aber ich würde zunächst darüber nachdenken, was Sie zwischenspeichern können und wie Sie das Dateisystem / die Datenbank / etc. Reduzieren können. Zugriffe und insbesondere Änderungen (da diese auch die Caches ungültig machen würden).


6

Die häufigste Gefahr für die Skalierbarkeit besteht darin, Lasttests nicht frühzeitig durchzuführen. Wenn Sie zu Beginn der Entwicklung Tests einrichten, die etwas simulieren, das mit Ihrer erwarteten Last vergleichbar ist, können Sie technologische oder architektonische Hindernisse für die Skalierbarkeit erkennen und korrigieren, bevor sie zu teuer werden, um sie zu beheben.


5

Einige gute Beispiele für die Skalierung mit PHP: Tumblr , Flickr , Netlog

Die allgemeinen Hinweise zur Skalierbarkeit:

  • Halte es einfach!
    Überentwickeln Sie sich nicht und kaufen Sie keine ausgefallenen herstellerspezifischen Lösungen.
  • Shared-Nothing-Architektur
    Behalten Sie Ihren Status in der Datenbank und außerhalb Ihrer Anwendungsserver bei (vermeiden Sie sogar Sitzungsdaten auf dem Server). Auf diese Weise können Sie bei Bedarf problemlos zusätzliche App-Server hinzufügen.
  • Fokus auf Front-End-Caching (statische Datei)
    Verwenden Sie einen Reverse-Proxy und später ein CDN. Was nicht vom App-Server bedient werden muss, ist auf diesem Server weniger belastet.
  • Messen Sie das reale System
    Integrierte Überwachung, damit Sie wissen, wo Ihre Engpässe liegen. Stellen Sie sicher, dass Sie die zukünftige Belastung anhand von Wachstumskurven vorhersagen können.
  • Achten Sie auf Ihr DB-Design
    Optimieren Sie Ihre Abfragen, verwenden Sie memcached, um Abfragen zu vermeiden, und teilen Sie Ihre Daten instanzübergreifend auf, wenn Sie auf einer DB-Instanz keinen Platz mehr haben (überwachen Sie dies, um dies im Voraus zu wissen).

Einige Fallstricke:

  • NoSQL vs SQL ist ein roter Hering.
    Alle großen Leute betreiben ihren Kern in SQL-Datenbanken. Verwenden Sie NoSQL, wenn Sie sicher sind, dass es sinnvoll ist, aber verwenden Sie es nicht, vorausgesetzt, es löst Ihre Skalierungsprobleme. Das wird es nicht.
  • Seien Sie vorsichtig mit ORMs.
    Sie sind auf dem App-Server zustandsintensiv (widerspricht der Shared-Nothing-Architektur) und erfordern, dass Sie nicht nur verstehen, wie SQL-Abfragen optimiert werden, sondern auch, wie der ORM über den SQL-Abfragen optimiert wird (mit anderen Worten, sie) Vereinfachen Sie die Dinge nur, wenn die Leistung keine Rolle spielt. Bevorzugen Sie stattdessen handgefertigte Abfragen und die großzügige Verwendung von Memcached.
  • Schwere Templating- / Routing-Systeme auf dem Server. Halten Sie den Server-Stack bewusst leicht.
  • Sorgen Sie sich nicht um die zeilenweise Codeleistung.
    Sie können später jederzeit Hotspots reparieren (verwenden Sie xdebug oder ähnliche Profiling-Tools). Eine skalierbare Architektur ist VIEL wichtiger als die Codeleistung. Investieren Sie also Ihre Intelligenz entsprechend.

+1 für die Vorsicht bei ORMs. Das Hinzufügen eines ORM zu unserer vierfachen DB-Abfrage auf Anwendungsebene und die DB ist unser größter Engpass
CamelBlues

1

Der einzige wirkliche Weg, um festzustellen, ob Sie Probleme mit der Skalierbarkeit haben, besteht darin, diese zu testen. Testen Sie sie daher frühzeitig und häufig, wie Michael Borgwardt sagt .

Abgesehen davon ist ein häufiger Grund, warum Systeme nicht skaliert werden, ein Ressourcenkonflikt. Und das zeigt sich normalerweise in der Datenbank - beim Versuch, gleichzeitig zu lesen und zu schreiben. Vielleicht möchten Sie einen CQRS-Ansatz verwenden , der die Leseseite (Abfrageseite) von der Schreibseite (Befehlsseite) trennt.


1

Sei bereit, alles zu zerbrechen. Wenn Sie es auf mehrere Hosts verteilen können, sind Sie dem Erstellen von skalierbaren Elementen viel näher.

Entwerfen Sie auch für den Fall einer Million Benutzer und verkleinern Sie es. Entwerfen Sie nicht für 1.000 Benutzer und skalieren Sie.

Ehrlich gesagt, PHP und MySQL wären nicht meine Wahl, dies zu tun. Der Versuch, Sharded-Daten in MySQL zu erstellen, ist ein Schmerz im Nacken.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.