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

Wie erhalte ich Live-Benachrichtigungs-Updates von mysql mit Websockets?

Live-Benachrichtigungen sind der Ort, an dem Websockets gedeihen und einen großen Vorteil gegenüber AJAX bieten.

Wie Sie wissen, wurde dies bereits vor beiden diskutiert, als über die Rolle von AJAX debattiert wurde (großartig für CRUD, nicht so sehr beim Polling) und beim Vergleich von Websocket-Leistung vs. AJAX-Leistung (Websockets sind immer schneller, wenn es um Live-Updates geht).

Ja ... Sie könnten Ressourcen sparen und die Leistung verbessern (sowie zukünftige Codewartungsprobleme), indem Sie on_update hinzufügen "hakt" an den Datenbankzugangspunkt.

Die Idee ist einfach:Immer wenn ein Funktionsaufruf die MySQL-Datenbank aktualisiert, wird die Aktualisierungsanforderung auch an einen Rückruf gesendet. Dieser Rückruf ist dafür verantwortlich, das Update im richtigen Kanal zu veröffentlichen.

Auf diese Weise fragen Sie die MySQL-Datenbank nicht ab.

Einige Datenbanken bieten Aktualisierungsrückrufe an, andere nicht. Ich denke, MySQL tut es. Ich vermeide jedoch diese datenbankverknüpften Rückrufe, da sie datenbankspezifisch sind. Es ist (IMHO) besser, den Rückruf zum Datenbankzugriffspunkt in der Anwendung hinzuzufügen, damit das Ersetzen einer Datenbank die Codebasis nicht beeinflusst.

Ich glaube nicht, dass AJAX ein guter Ansatz ist.

HTTP/2 hilft, die AJAX-Mängel abzumildern, aber es löst nicht alle.

Ich weiß nicht, wie viele Clients Sie erwarten, dass sie gleichzeitig verbunden sind, aber einen Client dazu zu zwingen, alle ein oder zwei Sekunden eine Anfrage zu senden, kommt einem selbst verursachten DoS-Angriff sehr nahe.

Bedenken Sie Folgendes:Wenn ein Client alle zwei Sekunden eine AJAX-Anfrage sendet, muss Ihr Server bei 2.000 gleichzeitigen Clients auf 1.000 Anfragen/Sek. antworten – dazu gehören Authentifizierung, Datenbankabfragen und all der Kram.

Auf der anderen Seite haben Sie bei Verwendung von Websockets mit 2.000 verbundenen Clients 2.000 dauerhafte Verbindungen, die nichts tun, bis eine Nachricht eintrifft. Keine CPU oder Arbeit erforderlich, nur der Speicher der Verbindung. Der Server wird nicht belastet, bis die tatsächlichen Daten übertragen werden.

Ja, sie sind komplexer zu implementieren, aber sie sind nicht so schwer, wenn Sie einmal angefangen haben. Außerdem gibt es viele Bibliotheken und Hilfswerkzeuge, die Ihnen einen Großteil der Arbeit abnehmen.

Häufige Probleme im Zusammenhang mit dem Websocket-Ansatz sind die Handhabung der horizontalen Skalierung (häufig durch Hinzufügen einer Pub/Sub-Datenbank oder eines Dienstes wie Redis), die Nachrichtenreihenfolge (die nach Möglichkeit besser ignoriert wird) und Bedenken hinsichtlich der Datenweitergabe (wann markieren wir Daten wie "gesehen"? Senden wir die gesamten Daten oder nur eine Benachrichtigung, dass Daten verfügbar sind? Wie viele Kanäle nutzen wir und wie teilen wir die Abonnements auf?).

Normalerweise sind die Antworten anwendungsspezifisch und hängen von der Funktion ab, die Sie ausrollen möchten, sowie von der erwarteten Größe Ihres Datensatzes (wenn jede Antwort, die ich auf SO gegeben habe, ein Kanal wäre, wäre es unrealistisch, sie zu pflegen).

Wie auch immer... Viel Glück!