2013-08-25 24 views
8

Jestem nowy zarówno w CouchDB, jak i PouchDB i używam go do utworzenia systemu zarządzania kontaktami, który synchronizuje się z urządzeniami mobilnymi i stacjonarnymi i może być używany w trybie offline. Widzę, że używanie PouchDB jest nieskończenie łatwiejsze niż pisanie podprogramu PHP/MySQL.Jak rozwiązywać konflikty z ciągłą replikacją

Używam go z powodzeniem, a gdy wprowadzam sprzeczne zmiany na urządzeniach offline, CouchDB używa algorytmu, aby arbitralnie wybrać zwycięzcę, a następnie poprawnie przekazuje go do wszystkich urządzeń.

Co chciałbym zrobić, to zaimplementować niestandardowy algorytm scalający rekordy konfliktów. Oto algorytm chciałbym używać:

  1. Jeśli rekord zostanie usunięty na jednego klienta, a jedynie aktualizowany na innym, zaktualizowanych wersji wygrywa, chyba że obie klienci zgadzają się na usunięcie.
  2. Rekord z najnowszym "zmodyfikowanym" znacznikiem czasu staje się wzorcem , a starszy rekord staje się drugorzędny.
  3. Wszystkie pola, które istnieją tylko w drugorzędnym (lub są puste w wzorcu ) są przenoszone do wzorca.
  4. Wersja główna jest zapisywana, a pomocnicza jest usuwana.

Przewodnik CouchDB ma dobry explanation, ale nie mam pojęcia, jak go wdrożyć za pomocą interfejsu API PouchDB podczas ciągłej replikacji. Według PouchDB API, istnieje opcja "onChange" w opcjach replikacji, ale nie rozumiem, jak go używać do przechwytywania konfliktów.

Jeśli ktoś mógłby napisać krótki samouczek zawierający przykładowy kod, ja i jestem pewien, że wielu innych użytkowników PouchDB doceniłoby to!

Odpowiedz

7

Pisząc artykuł z przykładami dokładnie jak zarządzać rozwiązywania konfliktów jest naprawdę dobry pomysł, może to być mylące, ale z braku jednej

pomysł jest dokładnie taki sam jak CouchDB, aby rozwiązać konflikty cię usuwać rewizje że zrobił zwycięstwo (i napisać nowy zwycięzca w razie potrzeby)

nr 1 jest to, jak couchdb prace rozwiązywania konfliktów i tak, więc nie musisz się martwić, że usunięte liście nie konflikt

function onChange(doc) { 
    if (!doc._conflicts) return; 
    collectConflicts(doc._conflicts, function(docs) { 
     var master = docs.sort(byTime).unshift(); 
     for (var doc in docs) { 
     for (var prop in doc) { 
      if (!(prop in master)) { 
      master[prop] = doc[prop]; 
      } 
     } 
     } 
     db.put(master, function(err) { 
     if (!err) { 
      for (var doc in docs) { 
      db.remove(doc); 
      } 
     } 
     });  
    }); 
    } 
} 

db.changes({conflicts: true, onChange: onChange}); 

ten będzie potrzebować strony z błędem ling itp. i mógłby być napisany o wiele ładniej, był tylko szybkim rysunkiem, na którym mógłby wyglądać kod:

+0

Dziękuję bardzo Dale! To bardzo pomaga. –