2013-08-16 17 views
5

Właśnie natknąłem następnym akapicie w AppEngine documentation for Query Cursors:Google AppEngine wystąpienie serwera zegar synchronizacja

Ciekawym zastosowaniem kursorów jest monitorowanie jednostek do niewidocznych zmian. Jeśli aplikacja ustawi właściwość znacznika czasu z bieżącą datą i godziną za każdym razem, gdy jednostka się zmieni, aplikacja może użyć zapytania posortowanego według właściwości znacznika czasowego, rosnąco, z kursorem Datastore , aby sprawdzić, kiedy elementy zostaną przeniesione na koniec lista wyników. Jeśli znacznik czasu jednostki zostanie zaktualizowany, zapytanie z kursorem zwróci zaktualizowaną jednostkę. Jeśli żadne jednostki nie zostały zaktualizowane od czasu ostatniego wykonania zapytania , żadne wyniki nie są zwracane, a kursor nie przesuwa się o .

Aby to działało niezawodnie, konieczne byłyby pewne gwarancje dotyczące synchronizacji zegara między różnymi instancjami serwera. W przeciwnym razie może pojawić się następujący scenariusz:

  1. instancja Server 1 (szybki zegar) Zapisuje aktualizacji z czasem znaczek 1000.
  2. Klient prosi o aktualizacjach i znajdzie ten jeden aktualizację.
  3. Instancja serwera 2 (wolny zegar) zapisuje kolejną aktualizację z datownikiem 950.
  4. Klient prosi o aktualizacje i NIE znajduje tej aktualizacji, ponieważ znacznik czasu nie wzrasta.

O ile zrozumiałem, nigdy nie było takich gwarancji synchronizacji zegara. Czy to się zmieniło?

Aktualizacja:

zdałem sobie sprawę, że nawet jeśli zegary były sync'ed idealnie, takie podejście może przegap wyników ze względu na ewentualną konsystencję zapytaniami. Jeśli późniejsza aktualizacja zostanie zatwierdzona przed wcześniejszą aktualizacją i przejdzie do równoczesnej kwerendy, a wcześniejsza nie, ukryje wcześniejszą aktualizację. Czy może czegoś brakuje?

+1

Nigdy nie znalazłem oficjalnego oświadczenia o synchronizacji zegara. na IRCu z gośćmi z Google powiedzieli, że rzeczy zostały zsynchronizowane i wierzę, że jednak ten post od gościa z Google jest prawdopodobnie dobrym wskaźnikiem stanu gry https://groups.google.com/forum/#!searchin/google-appengine/clock $ 20sync/google-appengine/XKLp5Uehhr8/MlsdgGwOB-wJ. Osobiście we wczesnych dniach aplikacji widziałem, jak zegar przekręca między instancjami> 30sekund. Ostatnim razem, gdy sprawdziłem, nie mogłem znaleźć żadnego znaczącego skosu ;-) –

+1

To jest naprawdę zły przykład na dokumentach, ponieważ jest wiele niepokojących przypadków, o które się martwisz (jak wspomniałeś). Nawet z doskonałą synchronizacją zegara i silną konsystencją, ustawienie pola datownika na teraz() i kiedy coś zostanie wysłane do Datastore może być opóźnione. –

Odpowiedz

0

Jedynymi dokumentami znalezionymi na zegarze i platformie Google Cloud Platform są here i here. Zgodnie z first link post wystąpienia są zsynchronizowane za pomocą usługi NTP i są wykonywane za Ciebie.

Powiązane problemy