2010-05-26 2 views
7

Während amq oder xmpp (Rabbitmq oder Ejabbered, die couchdb als Backends haben könnte) scheint eine gute Passform Echtzeit-Updates über Freund Zustand in einer Social-Gaming-Plattform, wo Updates sind klein, aber häufig, ich kann nicht helfen, aber denken Warum würde CouchDB nicht eine gute Plattform sein, um solche Updates zu liefern? Der Hauptvorteil, den ich mir vorstellen kann, ist die Fähigkeit, Updates basierend auf Freunden und der Verfügbarkeit von Änderungen zu filtern. Das macht die Entwicklung einer solchen Anwendung und deren Verwaltung (einschließlich Replikation) recht einfach im Vergleich zu ampq oder xmpp, wo Sie müssen Überlegen Sie, wie Sie die Pubsub-Knoten verwalten und wer sie zu irgendeinem Zeitpunkt abonniert hat.Warum sollte ich couchdb nicht für Nachrichtenübertragungen oder Echtzeit-Aktivitäten verwenden?

Allerdings kann ich nicht helfen, aber denke, das ist zu gut, um wahr zu sein, kann ich keine Informationen darüber finden, was Couchdb Mängel sind. Irgendwie fühlt es sich an, als würde man MySQL für die Nachrichtenübermittlung verwenden, weshalb ich zögere, es zu benutzen.

Hat jemand Erfahrung mit der Verwendung von Couchdb für solche Anwendungen? Würden Sie eine andere Plattform empfehlen?

Antwort

6

Hier sind einige Probleme mit "kleinen, aber häufigen" Updates und CouchDB.

CouchDB hat ein ausgezeichnetes MVCC-System für Dokumentaktualisierungen. Jedes Update ändert die Revision und Sie können ein Dokument nicht aktualisieren, ohne die Revision zu übergeben, die Sie aktualisieren möchten. Dies bedeutet auch, dass, wenn Sie mehrere Clients haben, die das gleiche Dokument unglaublich häufig aktualisieren, diese Funktion in die Quere kommen wird, da selbst nach dem Änderungs-Feed eine kleine Netzwerkverzögerung nach Aktualisierungen auftritt. Ein anderes Problem, das Sie möglicherweise mit gefilterten Änderungen haben, ist, dass die Filterfunktion das Anfrageobjekt erhält, was bedeutet, dass es sich um einen separaten Aufruf des Viewservers für jedes Dokument multipliziert mit der Anzahl der Verbindungen handelt. Sie können stattdessen einen node.js- oder erlang-Server verwenden, um einen "channels" -Ansatz zu implementieren, um die Filterung zu ändern und sie auf einem einzelnen ungefilterten Änderungsfeed zu platzieren.

Zusammengefasst, was Sie tun möchten, wird gut funktionieren, wenn Sie nicht mehrere Clients versuchen, die gleichen Dokumente mit hoher Häufigkeit zu aktualisieren und wenn Sie einen Filter für die Änderung einer sehr großen Anzahl gleichzeitiger Clients nicht verwenden mit einer hohen Datenbankaktualisierungsfrequenz. Ansonsten wird es großartig funktionieren. @jchris hat eine Menge Echtzeit-Anwendungen gemacht, nur mit dem nackten Wechselgeld-Feed, und sie funktionieren großartig.

+0

also, wenn ich die Updates mit node.js aggregieren und couchdb regelmäßig aktualisieren würde (alle paar Minuten) mit Bulk-Updates nur mit dieser einzigen Instanz von Knoten.js, dann wäre das Aktualisieren nicht mein größtes Problem. Meine Sorge wäre dann, Filtern der Updates mit Ansichten für die vielen Clients Verbindung zu Couchdb. Dies könnte irgendwie gelindert werden, wenn ich eine Datenbank pro Benutzer auf Kosten des Speicherplatzes erstelle und einfach seine Aktualisierungen in diese Datenbank posten, so dass jeder Client ungefilterte Aktualisierungen erhält, wobei die Filterung tatsächlich durch Routing von Nachrichten an dbs –

+0

erfolgt Ja, das ist ein Weg. Sie können auch nur einen Knotenprozeß alle Änderungen abhören lassen und die Filterung der Änderungen bereitstellen, die alle zusätzlichen IO-Latenzzeiten für den Aufruf des View-Servers pro Änderung des Listeners entfernen würden. Es gibt auch Möglichkeiten, atomare Updates mit couchdb zu "fälschen", was die Revisionsprobleme lindern kann. http://www.mikealrogers.com/archives/737 – mikeal

+1

Ich denke, dass hier etwas Verwirrung über den Begriff "update" besteht. Es hört sich für mich so an, als würde der Fragesteller mehr über die Erstellung vieler Nachrichten reden, die nicht unbedingt alle aktualisieren. Der Einwand über "Jedes Update ändert die Revision" könnte daher hier nicht gelten. Vermutlich würde jede Nachricht ein neues "Dokument" erstellen, und alle nachfolgenden "Ansichten" würden diese Informationen nach Bedarf rendern. –

1

Ich kann mir einen sehr einfachen Grund vorstellen ... weil Datenbanken dafür nicht entwickelt wurden!

Eine Nachrichtenwarteschlange ist genau das, was diese Art von Workflow benötigt. Haben Sie sich einige AMQP-basierte Produkte oder Dienstleistungen angesehen? Dazu gehören RabbitMQ (lokal installiert) und StormMQ (Cloud-basierter Dienst). Mehr hier: http://www.amqp.org

2

Allerdings kann ich nicht helfen, aber denke, das zu gut ist, um wahr zu sein, kann ich nicht Informationen darüber, welche couchdb die Mängel finden. Irgendwie fühlt es sich mag MySQL für die Weitergabe von Nachrichten verwenden, weshalb ich zögerlich zu mit es.

Versuchen Sie zu sehen, warum Databases suck for Messaging Präsentation. Obwohl es hauptsächlich gegen Datenbanken wie MySQL gerichtet ist, kann es Ihnen einen größeren Überblick über dieses Thema geben.

+0

Ich bin mir nicht sicher, dass dies zutrifft. Er redet nicht von der Abfrage der Datenbank. CouchDB hat eine spezifische API für kontinuierliche Echtzeit-Benachrichtigungen. –

Verwandte Themen