2013-07-15 35 views
7

Mamy aplikację, która wykorzystuje Cloudant jako serwer zdalny. Mimo to Cloudant nie jest w pełni zgodny z ciągłymi replikacjami TouchDB z poprzednich doświadczeń. Zatem naszą alternatywą jest ręczne wywoływanie replikacji jednostrzałowych ze stałą częstotliwością. Niemniej jednak chcielibyśmy wiedzieć, czy to podejście będzie kosztowało nas więcej pieniędzy niż ciągłe replikacje, ponieważ ciągłe replikacje używają longpoll i nie muszą często wysyłać zapytania do serwera. Innymi słowy, czy replikacja ściągana jednym ujęciem z chmurą jako celem kosztowała nas żądanie GET?Koszt ciągłych replikacji w porównaniu z replikami jednorazowymi (przy użyciu TouchDB i Cloudant)

Dziękuję Pawła

+2

"Chmura nie jest kompatybilna z ciągłymi replikacjami TouchDB." Dlaczego nie? – garbados

+0

Mike odniósł się do kwestii niezgodności w swojej odpowiedzi. Jest to otwarty problem, który nie został jeszcze rozwiązany. Ani autorzy TouchDB, ani obsługa Cloudant nie byli w stanie określić, z jakiego źródła pochodzi problem, ale udało nam się go odtworzyć z względną łatwością. – airpaulg

Odpowiedz

8

Myślę, że problem jest odwołać się do [1]. Replikacja Cloudant jest w 100% kompatybilna z CouchDB. W tej instancji , dzienniki TouchDB wskazują stos sieciowy iOS przekazany na niekompletnym JSON do TouchDB. Nie jest jasne, kto w tym przypadku był winny za niepowodzenie replikacji.

[1] https://github.com/couchbaselabs/TouchDB-iOS/issues/241

Na pytanie kosztów, jednorazowym ciągnąć replikacja spowoduje dostać się do paszy _changes każdym razem to się dzieje, a także innych wniosków potrzebnych do powtórzeniach. To żądanie _changes zostanie policzone jako prośba HTTP o jasną na Twoje konto Cloudant.

Jednak to, czy działa to jako więcej czy mniej żądań, ogólnie zależy od liczby zmian, które przychodzą ze zdalnego serwera.

Ważne jest również, aby pamiętać, że liczba _changes połączeń są bardzo małe względem liczby zaangażowanych innych połączeń (np uzyskiwanie zawartości zmian sami, a szczególnie jeśli istnieje wiele załączniki).

Choć kwestia ta jest specyficzna dla TouchDB i wspominam konkretnych zachowań tym kodzie odpowiedź ta dotyczy wniosków zaangażowany w replikacji między dwoma dowolnymi systemami mówiących protokół CouchDB replikacji [2].

[2] http://www.dataprotocols.org/en/latest/couchdb_replication.html

Weźmy przykład contrived: 1 zmiana na 10 sekund okno źródłowa baza danych do replikacji, gdzie baza TouchDB jest celem. Weźmy 5-minutową ankietę a ciągłą replikację. Dla uproszczenia liczenia połączeń, pobierzmy także załączniki z obrazu . Przyjmujemy również, że urządzenie ma stałe połączenie sieciowe.

W przypadku pracy ciągłej co dziesiąta karta TouchDB będzie otrzymywać aktualizację w kanale dla kanału _changes. Powoduje to zamknięcie połączenia longpoll. TouchDB następnie przechodzi przez zmiany, żądając aktualizacji ze źródłowej bazy danych ; jedno lub więcej żądań GET na serwerze zdalnym. Podczas gdy tak się dzieje, TouchDB musi otworzyć kolejne longpoll żądanie do _changes.Tak więc w ciągu pięciu minut kończy się być może około 30 połączeń do _zmian, plus wszystkie połączenia, aby uzyskać dokumenty i zapisać punkty kontrolne .

Należy to porównać z replikacją jednorazową co pięć minut. Otrzymasz powiadomienie o 30 aktualizacjach w jednym ciągu danych _changes. TouchDB wdraża optymalizację [3] przy czym będzie to nazwać _all_docs dostać aktualizowane dokumenty dla 1- obrotach, więc może skończyć z jednym wezwanie, aby wszystkie 30 dokumentów (niemożliwe w przypadku ciągłego jak ty otrzymałem pojedynczą zmianę). Następnie masz dokumenty punktu kontrolnego do zapisania. W najlepszym razie mniej niż 5 wywołań HTTP, co najwyżej jedna trzecia z ciągłego przypadku, ponieważ uniknąłeś dodatkowych żądań _changes.

[3] https://github.com/couchbaselabs/TouchDB-iOS/wiki/Replication-Algorithm#performance

Wszystko sprowadza się do częstotliwości aktualizacji można oczekiwać, aby źródła bazie. Replikacja jednokrotna prawdopodobnie zapewni lepszą krzywą cenową, ponieważ daje lepszą kontrolę nad liczbą żądań.

Kolejne pytanie brzmi, jak często połączenia będą spadać z powodu rozłączenia sieci , które rozłączają się regularnie z urządzeniami mobilnymi. Ciągłe replikacje TouchDB będą odpalane za każdym razem, gdy użytkownik wejdzie na linię (jeśli zostanie dodany przez bazę danych _replicator). Jest to dodatkowe źródło nieprzewidywalnych kosztów.

Jednak korzyści z bardziej natychmiastowej widoczności zmian mogą z pewnością być warte niepewności.

+0

Dziękuję bardzo za bardzo szczegółową odpowiedź. Mimo to miałem wrażenie, że Longpoll tylko się zamknął, kiedy nastąpiła zmiana. Nie wiedziałem, że otrzymałem aktualizację informującą, że nie ma nic, co pociągnie za sobą, co zamknie długi longpoll. Przypominam, że testowałem ciągłe przyciąganie za pomocą proxy i wydawało mi się, że wyzwalało tylko żądania, kiedy rzeczywiście zmieniłem dane po stronie serwera, ale mogę się mylić. Innymi słowy, potwierdzasz, że co 10 sekund długi lot jest zamknięty, nawet jeśli nie ma nic do wyciągnięcia, zmuszając go do uruchomienia innego żądania GET, aby je ponownie otworzyć. – airpaulg

+1

Żądanie długiego ma limit czasu (domyślnie 60 s), po którym to czasie zostanie zresetowane, jeśli nie było żadnych zmian. Można to skonfigurować na zasadzie replikacji - patrz http://docs.couchdb.org/en/latest/changes.html. –

+0

W przypadku, gdy nie ma zmian co 10 sekund, czy to zmienia obliczanie kosztów na rzecz ciągłej replikacji, ponieważ limity czasu dla długich długich minut są dość długie? W praktyce, czy dłuższy czas oczekiwania nie spowoduje, że ciągłe replikacje będą tańsze? Jakie są negatywne aspekty dłuższych limitów czasu? – airpaulg