So implementieren Sie eine dynamische Aktualisierung der Stimmenanzahl ähnlich wie bei quora: - Immer wenn ein Benutzer eine Antwort upvotet, wird diese automatisch für jeden angezeigt, der diese Seite anzeigt.
Ich bin auf der Suche nach einer Antwort, die folgende Adresse:
Die Antwort, nach der ich suche, ist vielleicht nicht genau so, wie quora es tut, aber vielleicht ist es so, dass dies mit verfügbaren Opensource-Technologien gemacht werden kann.
Es sind nicht die Details des Backend-Systems, über die Sie sich Sorgen machen müssen, sondern das Frontend. Dass die Verbindung immer offen ist, ist in jedem realen Maßstab unpraktisch. Stattdessen möchten Sie das Gegenteil - in der Lage zu sein, zu dienen und die Verbindung vom Back-End so schnell wie möglich zu schließen.
Websockets ist eine sexy Technologie, aber auch hier gibt es Probleme mit Proxies Wenn Sie etwas entwickeln, das auf einer Vielzahl von Bildschirmen (Desktop, Tablet, Handy) funktionieren sollte, könnte dies für Sie ein Problem darstellen. Selbst gute alte Umfragen funktionieren möglicherweise nicht durch Firewalls und Proxies.
Hier ist eine gute Nachricht: Ich denke
"polling upvote counts für jede Antwort"
ist in diesem Fall eine vollkommen gute Lösung. Berücksichtigen Sie Folgendes:
Hier ist, womit ich anfangen würde:
inc()/dec()
-Operation in memcached, beachten Sie, dass es aus Sicht der Racebedingungen sicher ist. Es ist auch eine sichere atomare Operation in MySQL UPDATE table SET field = field + 1 WHERE [...]
Aggressives Multilevel-Caching deckt Ihren read
-Pfad ab: Beachten Sie, dass diese HTTP-Abfrageanforderungen in Memcached und in allen HTTP-Caches auf der Kanten .
Um den langen Schwanz des unpopulären Themas zu kümmern - make http ttl für solche Antworten umgekehrt proportional zur Popularität.
Eine Leseanforderung wird nur selten zum Front-End-Server gelangen, wenn der HTTP-Cache abgelaufen ist und memcached ihn auch nicht hat. Wenn das immer noch ein Problem ist, fügen Sie memecached Server hinzu und erhöhen Sie die Ablaufzeit in memcached auf der ganzen Linie.
Nachdem Sie damit fertig sind, haben Sie alle reads
erledigt. Das einzige Problem, das Sie immer noch haben könnten, ist abhängig von der Skalierung eine hohe Rate von writes
, d. H. Der Fluss von Aufwärts- / Abwärtsstimmen. Hier kann es vorkommen, dass Ihre einzelne MySQL-Instanz einige Verzögerungen anzeigt. Fürchte dich nicht - gehe auf dem alten Pfad der Scharfschaltung deiner Instanzen vor oder füge einen NoSQL-Speicher nur für Counter hinzu.
Verwenden Sie kein Messaging-System, es sei denn, es ist absolut notwendig, oder Sie möchten eine Ausrede haben, damit zu spielen.
WebSockets, Server-gesendete Ereignisse (ich glaube, das haben Sie mit Push-Benachrichtigungen gemeint) und AJAX-Long-Polling haben den gleichen Nachteil - sie behalten die zugrundeliegende TCP-Verbindung für lange Zeit offen Die Frage ist also, wie viele offene TCP-Verbindungen ein Server handhaben kann. Grundsätzlich hängt es von seinem Betriebssystem, der Anzahl der Dateideskriptoren (einem Konfigurationsparameter) und dem verfügbaren Speicher ab (jede offene Verbindung reserviert einen Lese- / Schreibpuffer). Hier ist mehr dazu .
Wir haben einmal eine Möglichkeit getestet, 1 Million Websocket-Verbindungen auf einem einzigen Server offen zu halten (Windows 7 x64 mit 16 GB RAM, JVM 1.7 mit 8 GB Heap, mit Undertow-Beta , um Web-Anfragen zu bedienen. Überraschenderweise war der schwierigste Teil, die Last auf dem Server zu generieren) Es hat geschafft, 1M zu halten. Aber wieder hat der Server nichts Nützliches getan, nur Anfragen erhalten, Protokoll-Upgrade durchlaufen und diese Verbindungen offen gehalten. Es gab auch einige verlorene Verbindungen, aus welchen Gründen auch immer. Wir haben das nicht untersucht. Aber in der Produktion müssten Sie auch den Server anpingen und die Verbindung wiederherstellen.
Abgesehen davon, Websockets scheinen hier ein Overkill, SSE sind immer noch nicht weit verbreitet.
Also würde ich mit guten alten AJAX-Abfragen gehen, aber so viel wie möglich optimieren.
Funktioniert überall, einfach zu implementieren und zu optimieren, ohne auf ein externes System angewiesen zu sein (ich hatte mehrere Male schlechte Erfahrungen damit), Möglichkeiten zur Optimierung.
Beispielsweise könnten Sie Updates für alle geöffneten Artikel in einem einzigen Browser gruppieren oder das Aktualisierungsintervall entsprechend der Beliebtheit des Artikels anpassen.
Schließlich scheint es nicht so, als ob Sie hier Echtzeit-Benachrichtigungen benötigen.
klingt so, als könnten Sie ein Nachrichtensystem wie Kafka oder RabbitMQ oder ActiveMQ verwenden. Ihr Frontend würde Stimmen an einen Nachrichtenkanal senden und sie mit einem Listener empfangen, und Sie könnten ein Server-Side-Piece haben, das die Stimmen regelmäßig an die db weitergibt.
Sie können Ihre Aufgabe auch ausführen, indem Sie Ihre Datenbank abfragen, und indem Sie eine mit einem Post verknüpfte Nummer über ein gespeichertes Proc erhöhen / dekrementieren ... gibt es eine Reihe von Optionen hier und es hängt davon ab, wie viel Nebenläufigkeit Sie sein mögen gegenüber.
Tags und Links mysql architecture memcached design voting-system