2009-12-11 3 views
13

Ich bin derzeit mögliche Lösungen für das Problem follwing Bewertung:Selektive Replikation mit CouchDB

Eine Reihe von Dateneingaben müssen zwischen mehreren Clients synchonized werden, wobei jeder Kunde nur Ansicht kann (oder sogar über die Existenz wissen) eine Teilmenge der Daten. Jeder Kunde "besitzt" einige der Elemente, und die Entscheidung, wer diese Elemente lesen oder ändern darf, kann nur vom Eigentümer getroffen werden. Um diese Situation noch zu komplizieren, muss jedes Element (und jede Elementrevision) eine eindeutige Kennung haben, die für alle Clients gleich ist.

Während letzteres für CouchDB eine perfekte Aufgabe zu sein scheint (und ein dokumentenbasiertes Datenmodell würde perfekt zu meinen Bedürfnissen passen), bin ich mir nicht sicher, ob das Authentifizierungs-/Autorisierungs-Subsystem von CouchDB mit diesen Anforderungen umgehen kann: Während es sein sollte Es ist möglich, den Schreibzugriff über Validierungsfunktionen zu beschränken. Es scheint keinen Weg zu geben, den Lesezugriff zu autorisieren. Alle Lösungen, die ich für dieses Problem gefunden habe, schlagen vor, alle CouchDB-Anfragen über einen Proxy (oder eine Anwendungsschicht) zu routen, der die Autorisierung übernimmt. Die Frage lautet also: Ist es möglich, einen Autorisierungs-Layer zu implementieren, der Anforderungen an die Datenbank filtert, so dass der Zugriff nur auf Dokumente gewährt wird, auf die der anfordernde Client Lesezugriff hat und weiterhin den Replikationsmechanismus von CouchDB verwendet? Vereinfacht würde dies eine Art "selektiver Replikation" sein, bei der nur einige Dokumente und nicht die gesamte Datenbank repliziert werden.

Ich wäre auch dankbar für Anweisungen zu einigen detaillierten Informationen darüber, wie die Replikation funktioniert. Das CouchDB-Wiki und sogar das Buch "Definite Guide" sind nicht besonders genau.

Antwort

5

dies bittet um Replikationsfilter. Sie filtern die ausgehende Replikation basierend auf den von Ihnen festgelegten Kriterien und geben dem Besitzer des Ziels uneingeschränkten Zugriff auf seine eigene Kopie.

Ich hatte nicht die Möglichkeit, direkt mit Replikationsfiltern zu spielen, aber die Idee wäre, dass jedes Dokument Informationen darüber enthält, wer Zugriff darauf hat und der Filtermechanismus dann die ausgehende Replikation nur dieser Dokumente zulässt auf die du Zugriff hast. Die Replikation vom Ziel zurück zum Master wäre uneingeschränkt möglich, sodass der Master eine Rollup-Kopie bleiben und möglicherweise Änderungen an überlappenden Datensätzen per Multicast übertragen werden kann.

+0

Vielen Dank (und andyuk, auch). Sieht so aus, als ob couchDB sich wirklich dazu bewegt, das zu werden, wonach ich suche. – FRotthowe

+0

Haben Sie ein funktionierendes Beispiel? Die gefilterte Replikation ist jedoch nicht sicher. Der Benutzer kann weiterhin über _all_docs auf alle Daten zugreifen und erhält 8 Jahre später – Kinesias

+0

? Ich fürchte nicht :) – kolosy

3

Was Sie suchen, sind Replikationsfilter. Laut Chris Anderson ist es eine 0.11-Funktion.

„Der aktuelle Zustand ist, dass es eine API zum Filtern des _changes Futter. Der Replikator in 0,10 Verbraucht die Änderungen füttern, so ist der nächste Schritt den Replikator Erhalten den Filter API zu verwenden.

Es wird gerade daran gearbeitet, so dass es sollte 011.

Siehe orginal post

1

der Tat, wie andere gesagt haben, Replikation Filter die Art und Weise sind für diese zu gehen. Here is a link mit einigen Informationen zur Verwendung von ihnen.

Ein Vorbehalt, den ich hinzufügen würde, ist, dass im Maßstab Replikationsfilter extrem langsam sein können. Weitere Informationen über diese und andere Nuancen über Couchdb finden Sie in diesem ausgezeichneten Blog-Post: "what every developer should know about couchdb".Für Systeme im großen Maßstab hat sich die Replikation in der Anwendungsschicht als schneller und zuverlässiger erwiesen.

+0

Link ist tot. bitte repariere. – Kinesias

+0

Ich konnte den zuvor erwähnten Link nicht finden, fügte also einen anderen hinzu und aktualisierte meine Antwort basierend auf neueren Erfahrungen. – Cory