2009-10-08 11 views
6

Chcę napisać skrypt licznika trafień, aby śledzić trafienia na zdjęciach na stronie internetowej i początkowych adresach IP. Liczba wyświetleń przekracza setki tysięcy dziennie, więc liczniki będą zwiększane wielokrotnie na sekundę.Jak napisać skuteczny licznik trafień dla stron internetowych

Szukam prostej, samo-hostowanej metody (php, skrypty Pythona itp.). Myślałem o używaniu MySQL do śledzenia tego, ale domyślam się, że jest bardziej efektywny sposób. Jakie są dobre metody utrzymywania liczników?

Odpowiedz

-1

Cóż, jeśli zdarzy ci się pójść na trasę PHP, możesz użyć bazy danych SQLite, jednak MySQL jest całkowicie rozsądnym sposobem na przechowywanie tych informacji i zwykle (przynajmniej od tych, które widziałem) jest to, jak to się robi.

Jeśli nie chcesz przechowywać adresu IP i żadnych innych informacji, prosty plik w pliku tekstowym może działać.

+2

Jestem wielkim fanem SQLite i prostych plików tekstowych, ale oba nie nadają się do tego zadania. Załóżmy więcej niż jeden serwer, więcej niż jeden obraz, więcej niż jedno równoczesne trafienie, itp. – Dustin

7

Fascynujący temat. Inkrementowanie licznika, tak proste, jak tylko może być, po prostu ma na transakcję ... co oznacza, że ​​może zablokować cały DB dłużej niż ma to sens! -) Może to być wąskie gardło dla całego systemu.

Jeśli potrzebujesz rygorystycznie dokładnych liczników, ale nie potrzebujesz ich do natychmiastowej aktualizacji, moim ulubionym podejściem jest dołączanie informacji do dziennika do logu (przełączanie dzienników tak często, jak jest to konieczne do celów świeżości danych). Po zamknięciu logu (z licznymi możliwymi do policzenia zdarzeniami) skrypt może go odczytać i zaktualizować wszystko, co jest potrzebne w pojedynczej transakcji - może nie intuicyjnie, ale znacznie szybciej niż tysiące pojedynczych blokad.

Następnie są bardzo szybkie liczniki, które są tylko statystycznie dokładne - ale ponieważ nie mówisz, że taka niedokładność jest do przyjęcia, nie zamierzam ich dokładniej wyjaśniać.

+0

Większość serwerów WWW i tak dostarcza ten dziennik. Zobacz moją odpowiedź. – middus

+0

@middus, oczywiście, ale moim celem jest to, że (nawet jeśli to, na czym Ci zależy, nie jest rejestrowane, lub jesteś na hoście, który nie zapewnia dostępu do dzienników), możesz liczyć za pomocą dedykowanych dzienników własnych (przetwarzanie takich dzienników może być znacznie szybsze niż ogólne, ponieważ można je dostosować do potrzeb liczenia, można dość często aktualizować bazę danych, zamykając dzienniki liczników znacznie częściej niż ogólne, itd.). –

+0

Tak, oczywiście masz rację. Jednak w tym konkretnym przypadku, gdy masz do czynienia z obrazami, będziesz musiał przepuścić cały ruch przez jakiś skrypt, co jest dość dużym obciążeniem. (Przynajmniej nie widzę lepszej opcji). – middus

2

Istnieją dwa bardzo proste sposoby:

  1. analizować je z dzienników internetowych w partii.
  2. Przeprowadź hity przez beanstalkd lub gearmand i poproś robotnika, aby wykonał ciężką pracę w kontrolowany sposób.

Opcja 1 działa z gotowymi narzędziami. Opcja 2 wymaga tylko odrobiny programowania, ale zapewnia coś bliższego aktualizacjom w czasie rzeczywistym, nie powodując upadku w wyniku skoku natężenia ruchu (takiego, jaki znajdziesz w twoim bezpośrednim przypadku mysql).

0

Nie jestem pewien, czy to twoja aleja, ale AppEngine to całkiem fajna platforma do rozbudowy. Przykładowy kod, za pomocą którego można zbudować licznik za pomocą ich DataStore i transakcji, opisano tutaj: http://code.google.com/appengine/docs/python/datastore/transactions.html.

+0

Próbowaliśmy przechowywać wiele liczników w silniku aplikacji i okazało się, że jest to drogie w czasie procesora. Oznacza to, że kosztuje $$. – dfrankow

1

Jeśli dokładność jest ważna, można to zrobić nieco wolniej za pomocą MySql ... utwórz tabelę HEAP/Memory do przechowywania wartości liczników. To tabele w pamięci, które są niesamowicie szybkie. Możesz zapisywać dane w normalnej tabeli w odstępach czasu.

Na podstawie pomysłów na aplikację można użyć memcache jako tymczasowego sklepu dla licznika. Zwiększanie licznika memcache jest szybsze niż przy użyciu tabel sterty MySql (myślę). Raz na pięć lub dziesięć sekund można było odczytać licznik memcache i wpisać ten numer do swojej bazy danych.

4

Można pobrać dziennik dostępu do serwera WWW Access log (Apache: access.log) i oceniaj go wielokrotnie (cronjob) w przypadku, gdy nie potrzebujesz mieć danych pod ręką w momencie, w którym ktoś odwiedza Twoją witrynę.

Zazwyczaj dziennik dostępu jest generowany i zawiera żądany zasób, a także czas, datę i adres IP użytkownika. W ten sposób nie musisz przekierowywać całego ruchu przez skrypt php. Lean, średnia maszyna licząca.

0

Możesz użyć Redis - bardzo szybkiego przechowywania wartości kluczowej z obsługą przyrostów atomowych. Jeśli zajdzie taka potrzeba - zliczenia mogą być łatwo podzielone między wiele serwerów.

0

Zrobiłem coś bardzo podobnego, w podobnej skali (wiele serwerów, setki domen, kilka tysięcy odsłon na godzinę) i analiza plików logu była zdecydowanie do zrobienia. (Sprawdzał także trafności, ważył je według typu pliku i na czarnych listach adresów IP w zaporze sieciowej, jeśli składał zbyt wiele żądań, a jego celem było automatyczne blokowanie złych botów, a nie tylko licznik, ale liczenie było jego istotna część).

Brak wpływu na wydajność samego procesu serwera WWW, ponieważ nie wykonuje on żadnych dodatkowych prac, a ponadto można łatwo publikować okresowo aktualizowane liczby trafień, wprowadzając je do bazy danych witryny co minutę/5 minuty/100 trafień/cokolwiek, bez konieczności blokowania odpowiedniego wiersza/tabeli/bazy danych (w zależności od używanego mechanizmu blokującego) przy każdym trafieniu.

+0

To brzmi wspaniale, jakieś wskazówki, jak zacząć to tworzyć? Czy można to zrobić za pomocą PHP? – swt83

+0

@ swt83: Użyłem Perla, ale rozumiem, że PHP został rozszerzony do działania w środowiskach innych niż internetowe, więc powinno być możliwe. W przypadku prostego licznika jest to po prostu kwestia ustawienia zadania crona tak, aby działał co jakiś czas, sprawdzaj długi dostęp dla nowych trafień (za każdym razem rejestruj położenie końca pliku, aby następny bieg ten ostatni został przerwany zamiast ponownego przetwarzania całego dziennika) i przetwarzać/podsumowywać je, tak jak lubisz. Jeśli chcesz to w czasie rzeczywistym, zapisz go jako monitor typu "tail -f", który czyta z pliku tak, jak jest napisany (po prostu uważaj na rotację dziennika). –

2

Bez wątpienia Redis doskonale nadaje się do tego problemu. Wymaga to około minuty do instalacji i instalacji, obsługuje przyrosty atomowe, jest niesamowicie szybki, ma biblioteki klienckie dla Pythona i php (i wielu innych języków), jest trwały (migawki, dziennik, replikacja).

Zapisz każdy licznik na swoim kluczu. Wtedy po prostu

INCR key 
Powiązane problemy