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?
web-development
php
web-applications
mysql
scalability
Schatten
quelle
quelle
Antworten:
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).
quelle
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.
quelle
Einige gute Beispiele für die Skalierung mit PHP: Tumblr , Flickr , Netlog
Die allgemeinen Hinweise zur Skalierbarkeit:
Überentwickeln Sie sich nicht und kaufen Sie keine ausgefallenen herstellerspezifischen Lösungen.
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.
Verwenden Sie einen Reverse-Proxy und später ein CDN. Was nicht vom App-Server bedient werden muss, ist auf diesem Server weniger belastet.
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.
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:
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.
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.
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.
quelle
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.
quelle
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.
quelle