Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Der beste Weg, um Parallelitätsprobleme zu behandeln

Donnies Antwort (Umfrage) ist wahrscheinlich Ihre beste Option - einfach und funktioniert. Es wird fast jeden Fall abdecken (es ist unwahrscheinlich, dass eine einfache PK-Suche die Leistung beeinträchtigen würde, selbst auf einer sehr beliebten Website).

Der Vollständigkeit halber und wenn Sie Abfragen vermeiden möchten, können Sie ein Push-Modell . Es gibt verschiedene Möglichkeiten, die im Wikipedia-Artikel beschrieben sind. Wenn Sie einen Write-Through-Cache unterhalten können (jedes Mal, wenn Sie den Datensatz aktualisieren, aktualisieren Sie den Cache), dann können Sie die Datenbanklast fast vollständig eliminieren.

Verwenden Sie jedoch keine Zeitstempelspalte „last_updated“. Bearbeitungen innerhalb derselben Sekunde sind keine Seltenheit. Sie könnten damit durchkommen, wenn Sie zusätzliche Informationen (Server, der die Aktualisierung durchgeführt hat, Remote-Adresse, Port usw.) hinzufügen, um sicherzustellen, dass Sie den Unterschied erkennen können, wenn zwei Anfragen zur selben Sekunde an denselben Server eingehen. Wenn Sie jedoch diese Genauigkeit benötigen, können Sie auch ein eindeutiges Revisionsfeld verwenden (es muss nicht unbedingt eine inkrementierende Ganzzahl sein, sondern nur innerhalb der Lebensdauer dieses Datensatzes eindeutig sein).

Jemand erwähnte dauerhafte Verbindungen – dies würde die Einrichtungskosten der Polling-Abfragen reduzieren (natürlich verbraucht jede Verbindung Ressourcen auf der Datenbank und dem Host-Computer). Sie würden eine einzelne Verbindung (oder so wenige wie möglich) die ganze Zeit (oder so lange wie möglich) offen halten und diese verwenden (in Kombination mit Caching und Memoization, falls gewünscht).

Schließlich gibt es SQL-Anweisungen, mit denen Sie UPDATE oder INSERT eine Bedingung hinzufügen können. Mein SQl rostet wirklich, aber ich denke, es ist so etwas wie UPDATE ... WHERE ... . Um dieses Schutzniveau zu erreichen, müssten Sie vor dem Senden der Aktualisierung Ihre eigenen Zeilen sperren (und die gesamte Fehlerbehandlung und Bereinigung, die damit verbunden sein könnte). Es ist unwahrscheinlich, dass Sie das brauchen würden; Ich erwähne es nur der Vollständigkeit halber.

Bearbeiten:

Ihre Lösung klingt gut (Cache-Zeitstempel, Proxy-Abfrageanforderungen an einen anderen Server). Die einzige Änderung, die ich vornehmen würde, besteht darin, die zwischengespeicherten Zeitstempel bei jedem Speichern zu aktualisieren. Dadurch bleibt der Cache frischer. Ich würde beim Speichern auch den Zeitstempel direkt aus der Datenbank überprüfen, um zu verhindern, dass sich aufgrund veralteter Cache-Daten ein Speicher einschleicht.

Wenn Sie APC zum Caching verwenden, ist ein zweiter HTTP-Server nicht sinnvoll - Sie müssten ihn auf derselben Maschine ausführen (APC verwendet Shared Memory). Dieselbe physische Maschine würde die Arbeit erledigen, aber mit dem zusätzlichen Overhead eines zweiten HTTP-Servers. Wenn Sie die Abfrageanforderungen auf einen zweiten Server (in Ihrem Fall lighttpd) auslagern möchten, ist es besser, lightttpd vor Apache auf einem zweiten physischen Computer einzurichten und einen gemeinsam genutzten Caching-Server (memcache) zu verwenden, damit die Der lighttpd-Server kann die zwischengespeicherten Zeitstempel lesen und Apache kann die zwischengespeicherten Zeitstempel aktualisieren. Der Grund dafür, lighttpd vor Apache zu stellen, ist, wenn die meisten Anfragen Polling-Anfragen sind, um die schwerere Verwendung von Apache-Prozessen zu vermeiden.

Sie brauchen wahrscheinlich überhaupt keinen zweiten Server. Apache sollte in der Lage sein, die zusätzlichen Anforderungen zu verarbeiten. Wenn dies nicht möglich ist, würde ich Ihre Konfiguration erneut überprüfen (insbesondere die Direktiven, die steuern, wie viele Worker-Prozesse Sie ausführen und wie viele Anfragen sie bearbeiten dürfen, bevor sie beendet werden).