Was kann ich tun, um eine stark frequentierte Website zu skalieren?


14

Welche bewährten Methoden sollten für eine Website angewendet werden, die skaliert werden muss, um die Kapazität zu bewältigen? Dies ist besonders wichtig, da die Leute über die Cloud nachdenken, aber möglicherweise die Grundlagen verpassen.

Ich bin an allem interessiert, was Sie als Best Practice betrachten, von Aufgaben auf Entwicklungsebene über die Infrastruktur bis hin zum Management.


1
Schauen Sie sich an: highscalability.com
Casebash

Kann jemand, der sich mit Windows Server App Fabric und Caching auskennt, hier etwas posten? Ich bin kein Experte auf diesem Gebiet und möchte mehr erfahren.
goodguys_activate

Was möchten Sie über AppFabric wissen?
Henrik

Es gibt einige Tipps zum Skalieren und Ausprobieren einer Website. Einschließlich: Front-End-Serverskriptebene Modell- und DB-Designebene Horizontale Skalierung des Servers, Sharding Weitere Informationen

Antworten:


16

Design für Parallelität

Das heißt, während Sie programmieren, planen Sie, dass mehrere Threads ausgeführt werden. Planen Sie den freigegebenen Status (häufig nur die Datenbank). Planen Sie mehrere Prozesse. Planen Sie die physische Verteilung.

Auf diese Weise können Sie Ihr System auf mehrere Computer und auf mehrere Prozesse mit Lastenausgleich verteilen. Auf diese Weise können redundante Prozesse im Fehlerfall ausgeführt werden. Wenn Sie das System an Ort und Stelle ändern müssen, müssen Sie nicht alle Dienste abbrechen, um dies zu tun.


13

Einige Dinge, die Sie in Betracht ziehen könnten:

  • Trennung von Lese- und Schreibseiten Ihres Datenspeichers.
    • CQRS / Event Sourcing
    • CQS
    • Message-Passing / Schauspieler
  • Gemeinsamen Prozess- und Thread-Status vermeiden
    • Vermeiden Sie daher das Sperren
    • Sie können dies durch das Typsystem vermeiden, indem Sie Ihre Klassen, Strukturen und anderen Datentypen so erstellen, dass sie unveränderlich sind, dh sich nach der Erstellung nicht ändern. Besonders bei komplexen abstrakten Datentypen funktioniert es überraschend gut (zB Implementierung von jQuery)
  • Webserver-Threads auf E / A werden nicht blockiert. Wenn Sie ASP.Net verwenden, verwenden Sie asynchrone Seiten / Aktionen mit dem APM-Muster / der taskparallelen Bibliothek (TPL).
  • Keine Speicherung von Statusmengen im Benutzersitzungswörterbuch
    • Dies muss zwischen Threads verschoben werden, wenn Threadmigrationen in IIS stattfinden.
    • Intelligentes Routing, sodass nicht gesicherte / statische Ressourcen nicht mit demselben Anwendungsframework (z. B. ASP.Net) bereitgestellt werden, das zusätzlichen Aufwand verursacht. Schauen Sie sich zum Beispiel verschiedene Webserver an.
  • Continuation-Passing-Code mit einem asynchronen Workflow-Muster schreiben (zB bind (haskell) /callcc/Tasks.ContinueWith/F#'s async)
  • Verwenden Sie die Warteschlangentheorie, um zu berechnen, wo Ihre Engpässe auftreten können
  • Verwenden Sie Push-Updates anstelle von Pull-Updates für Lesemodelle und andere Anwendungszustände. ZB über RabbitMQ / nServiceBus
  • Verwenden Sie den HTTP-Handler mit den wenigsten Funktionen.
  • Stellen Sie für statische Dateien E-Tags und Cache-Ablaufrichtlinien bereit, damit die Webinfrastruktur ordnungsgemäß funktioniert (z. B. mit Squid-Proxy).
  • (Beauftragen Sie mich, um Ihre Skalierungsprobleme zu lösen und Tutorials vor Ort zu erhalten;))

4

Share Nichts Architektur.

Aus diesem Grund sollten Sie nicht sofort zu einer Scale-out-Lösung wechseln, was Ihrer Meinung nach zuwiderläuft. Der Overhead außerhalb des Systems im Vergleich zu einem systeminternen Anruf sollte nicht unterschätzt werden. Beispielsweise dauert das Herstellen einer DB-Verbindung über eine Netzwerkschnittstelle viel länger als das Tätigen eines lokalen Anrufs. Geben Sie an, wie viel Zeit für Verwaltung, Leistung und Optimierung für die Skalierung erforderlich ist, im Vergleich zu den zusätzlichen Kosten für ein wirklich großes System.

Ungeachtet dessen ist es nach wie vor von großem Wert, Architekturen mit "Share nothing" zu nutzen, und Sie können Ihre Systeme zu gegebener Zeit schichten und skalieren.


0

Parallelisierung von Anfragen über mehrere Hostnamen

Teil des HTTP-Standards ist ein Abschnitt, der besagt, dass Webclients maximal 2 Sitzungen pro DNS-Host anfordern. Hier ist eine Lösung, bei der Sie und Alias ​​Ihre www.domain.com und eine höhere Anzahl von gleichzeitigen Anfragen erhalten, wodurch Ihre Seite schneller geladen wird:

/programming/3653609/how-do-i-code-my-asp-net-page-to-parallelize-downloads-across-hostnames

Grundsätzlich müssen Sie Ihren ASP.NET-HTTP-Handler bearbeiten, um die Zielhosts zu ändern, an die Sie Clients senden. Dabei ist jeder Host ein CNAME für "www".


1
Diese Antwort hat mehr mit der Leistung auf der Clientseite zu tun als mit der Skalierung auf der Serverseite.
Ken Liu

Ich dachte eher an eine Mittelschicht, die andere Datenquellen über HTTP aggregiert. Azure Table, OData sind nur einige Beispiele ... Ihrer Meinung nach ist es immer noch der Server, der dem Browser (Javascript) mitteilt, was zu tun ist.
goodguys_activate

0

Sicheres, schnelles und zuverlässiges DNS

Ich fand einige Websites mit hoher Kapazität, die den DNS-Server des Registrars verwendeten und keine SLA für die Verfügbarkeit oder Leistung hatten. Darüber hinaus befanden sich die Server in Indien, und die Latenz erhöht die Wahrscheinlichkeit, dass ein DNS-Spoofer den Cache Ihres Kunden oder eines zwischengeschalteten Internetdienstanbieters vergiftet. Dies würde dazu führen, dass sogar Ihr SSL-geschützter Datenverkehr umgeleitet wird, ohne dass dies jemand weiß.

Die DNS-Geschwindigkeit wirkt sich auch auf die anfängliche Ladezeit Ihres Servers aus, bevor die Datensätze zwischengespeichert werden.

Ich verwende DynDNS oder Neustar für die meisten meiner Kunden, da sie über eine ziemlich solide DNS-Infrastruktur verfügen (obwohl dies teuer ist und ich zu diesen Unternehmen keine andere Verbindung habe).


2
Äh ... ist DNS wirklich ein ernsthafter Engpass für Sie? Ich würde denken, dass dies eines der letzten Dinge ist, die optimiert werden müssen.
Fishtoaster

@Fishtoaster - Gerade bearbeiteter Teil in Fettdruck. Ich bin ursprünglich ein Sysadmin und die DNS-Sicherheit spielt eine große Rolle bei der SSL-Validierung. Es treten DNS-Konnektivitäts- und Leistungsprobleme auf, z. B .: BGP-Routingprobleme an die SOA, Probleme mit Anycasting (für CDNs), Latenzprobleme, Cache-Vergiftung und mehr. Ich habe ein DNS-Best-Practice-Scan-Tool (Kabelebene) geschrieben, das ich bald ins Internet stellen werde. Probieren Sie es einfach aus, da es viele der von mir erwähnten Konnektivitätsprobleme abdeckt. (oder
schreib

2
Ich sage nicht, dass es keine DNS-bezogenen Leistungsprobleme gibt, wie die, die Sie auflisten. Es scheint mir nur, dass wesentlich grundlegendere Probleme (Datenbankzugriff, Seiten-Caching, Komplexität der einfachen Codeschleifen, Lastausgleich von Serverprozessen, Auswahl von Hardware-Verteilungspunkten usw.) auftreten und in mehreren Größenordnungen gelöst werden müssten, während die Skalierung vor dem DNS erfolgt -bezogene Probleme wären ein Problem.
Fishtoaster

... Ich stimme vollkommen zu, dass es wichtigere Dinge gibt, über die man sich Sorgen machen muss, genau wie Sie es erwähnen. Vielleicht ist das der Grund, warum diese Idee eine Bewertung von Null hat :) .. aber andererseits bin ich der einzige, der diese Frage bisher beantwortet hat.
goodguys_activate

1
Die DNS-Leistung kann mit Sicherheit ein enormer Engpass sein - es gibt möglicherweise nicht viele ms Unterschied zwischen gut und schlecht, aber da DNS bei jedem Anruf (oder fast jedem Anruf) getroffen wird, kann sich dies sehr schnell summieren. Besonders, wenn Sie in moderne CDN-Stunts eintauchen.
Wyatt Barnett

0

Ich denke, dass der Schlüssel einfach sein wird:

Habe einfachen Code. Das bedeutet etwas, das du anschaust und verstehst. Wenn Sie Server erweitern und ändern, müssen Sie wissen, was gerade passiert. Möglicherweise müssen Sie auch Programmierer hinzufügen, die schnell verstehen müssen. Hooks und XML-Dateien, die nicht offensichtlichen Zufallscode aufrufen, sind sehr schlecht.

Dann können Sie die Probleme testen und finden.

Schauen Sie hier: http://blog.servint.net/2013/08/27/going-big-how-to-scale-a-website-part-1-infrastructure-that-scales/

Wir bei stellarbuild versuchen sicherzustellen, dass unsere Websites ohne Ausfallzeiten skaliert werden. Das bedeutet, dass Sie wissen müssen, was Ihr Code tut und wo er es tut. Selbst wenn Sie eine andere Maschine testen, kann die Skalierung nicht zu lange dauern. Die meisten Leute fangen erst an, wenn es leider fast zu spät ist. Sie können nur optimieren, wenn Sie das meiner Meinung nach tun.

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.