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:
- instancja Server 1 (szybki zegar) Zapisuje aktualizacji z czasem znaczek 1000.
- Klient prosi o aktualizacjach i znajdzie ten jeden aktualizację.
- Instancja serwera 2 (wolny zegar) zapisuje kolejną aktualizację z datownikiem 950.
- 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?
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 ;-) –
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. –