5

Mam listę użytkowników, którzy mogą zobaczyć tylko administratorzy (= niewiele czyta). Ta lista wyświetla również liczbę użytkowników w magazynie danych. Ponieważ lista może wzrosnąć o więcej niż 1000, moją pierwszą myślą było uniknięcie normalnego liczenia(), a zamiast tego użycie zignorowanego licznika.Jak zbudować elastyczny licznik z ponad 1000 wierszy, ale niewielu czyta w Google App Engine?

Problem polega jednak na tym, że administratorzy mają również dostęp do różnych filtrów wyszukiwania (w GUI), takich jak tylko przeglądanie użytkowników płci męskiej/żeńskiej i tak dalej. Ważne jest, aby liczba odzwierciedlała te filtry, aby mogły one uzyskać liczbę kobiet, użytkowników płci męskiej i mnóstwo innych kombinacji.

Z tego powodu, sharded counters i high concurrency counters bez shardingu nie wydają się dobrym pomysłem, ponieważ musiałbym utworzyć licznik dla każdej kombinacji filtrów wyszukiwania.

Czy powinienem po prostu utworzyć pętlę zliczania() metod, takich jak opisane here lub jest to bardzo złe praktyki? Jak mógłbym to zrobić inaczej?

Należy zauważyć, że ten licznik jest przeznaczony dla interfejsu administratora i ma bardzo ograniczoną liczbę odczytów. To jest naprawdę przypadek, w którym chciałbym poświęcić trochę wydajności odczytu dla elastyczności i dokładności. Chociaż powinno być w stanie przekroczyć 1000, nie powinno wzrosnąć więcej niż 10 000.

Odpowiedz

2

"Pętla zliczeń" jest powolna, ale obecnie można ją ulepszyć dzięki cursors. Normalnie zaleciłbym denormalizowanie wszystkich potrzebnych "filtrowanych" liczników, ale spowalnia to dodawanie i usuwanie użytkownika (i prawdopodobnie również zmiany demograficzne), więc biorąc pod uwagę twój konkretny przypadek użycia z bardzo małą ilością odczytów, prawdopodobnie uciec z "pętlą zliczeń" (plus kursorami ;-).

+0

Dzięki za odpowiedź! Tak, jestem pod wrażeniem tego podejścia, biorąc pod uwagę, że będę miał bardzo mało czytań i nie jestem nawet pewien, czy lista przekroczy 1000. Kiedy mówisz o kursorach, masz na myśli, że powinienem użyć kursorów, aby zdecydować o następnej pozycji zliczania()? – Aneon

2

Próbowałem dwóch podejść:

1) napisać własny zadanie, które odpytuje składnicę danych (kwerenda jest kluczowym zapytania malejąco) z ustalonym limitem jednostek (powiedzmy 50). Następnie kolejkuje kolejne zadanie, aby rozpocząć sprawdzanie, gdzie zostało przerwane. Każde zadanie powoduje zapisanie następnego, przekazując mu dwa parametry (miejsce, w którym kończyło się tak jak kursor i sumę liczb wyświetlanych elementów).

2) Takie podejście jest znacznie łatwiejsze - i polega na użyciu biblioteki mapreduce udostępnianej przez Google dla aplikacji. Działa całkowicie w przestrzeni użytkownika, więc wystarczy pobrać i zbudować bibliotekę i dołączyć ją do projektu. Zasadniczo poradzi sobie on z iteracją wszystkich podanych jednostek i pozwala napisać procedurę obsługi dla każdego z nich (jak inkrementacja licznika). Zobacz szczegóły tutaj: mapreduce.appspot.com - mają nawet przykładową aplikację, która robi dokładnie to, o co prosisz. Jedynym problemem jest to, że wyniki pojawią się w przeglądarce i niekoniecznie zostaną zapisane w magazynie danych, chyba że zrobisz to sam.

+0

Drugie podejście opisane tutaj, przy użyciu mapreduce do regularnego przeliczania wszystkich ważnych statystyk, wydaje się najlepszym podejściem. –

+0

Och, nigdy wcześniej nie słyszałem o MapReduce, będę musiał się nad tym zastanowić. Czy to podejście da mi pełną dokładność, czy też będzie musiała być okresowo aktualizowana (np. Wysokie liczniki współbieżności bez shardowania, które używa kolejki zadań)? I czy wymaga to ustawienia wszystkich możliwych kombinacji filtrów, które chcę móc zliczyć ręcznie? – Aneon

+0

Jeśli liczba obiektów, które zmieniasz podczas zmniejszania mapy, te obiekty nie będą liczone. Zmniejszenie mapy zasadniczo zajmuje migawkę w określonym momencie. IN NIE da ci liczby w czasie rzeczywistym liczby jednostek, które masz w danym momencie.Używam go do tworzenia statystyk na koniec każdego dnia. – aloo