Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Optymalizacja zapisywania danych do bazy danych przez AJAX
Forum PHP.pl > Forum > XML, AJAX > AJAX
rugby
Tworzę aplikację RIA, która działa w przeglądarce po stronie klienta i co jakiś czas zapisuje dane (np. położenie paneli) w wybranej tabeli w bazie danych, wysyłając je metodą POST przez AJAX. Biorąc pod uwagę, że równocześnie z aplikacji może korzystać kilkaset osób, jak zoptymalizować wydajność serwera WWW i bazy danych?

1. Tabela, do której zapisywane są dane, powinna mieć blokowanie na poziomie wiersza (a nie całej tabeli), zgadza się?
2. Trzeba zachować kolejność zapisywania, żeby pakiet, który został wysłany wcześniej, a dotarł później, nie nadpisał pakietu wysłanego w międzyczasie, tak?
3. Czy wywoływać zapis danych metodą POST w momencie zmiany położenia paneli (ludzie mogą bawić się panelami, generując dużo zapisów w jednym czasie), czy np. co 5 s. (niezależnie od tego czy użytkownik rusza panele są generowane zapisy)?
4. Na co jeszcze zwrócić uwagę?
melkorm
Może niemądry, ale napiszę co przyszło mi na myśl:
- Onbeforeunload - tutaj pojawia się pytanie jakie dokładnie chcesz przeglądarki obsługiwać, też by się przydało np: na wylogowanie + nie aktywność przez x - sekund i tylko wtedy gdy pozycje się zmieniły.
- Także trzeba rozpatrzeć czy naprawdę będziesz miał tyle user'ów że będzie to generować AŻ takie obciążenie, lub czy by na początek ni zrobić tego normalnie na AJAX'sie i później zobaczyć czy jest potrzeba przerabiania na bardziej wydajne rozwiązanie.
thek
Ustaw by ów AJAX działał tylko przy określonych zdarzeniach, lub określonym czasie. Nie ma sensu co chwilę wywoływać wysyłki. Zrób tak, że AJAX wywołuje się na chwilę przed zamknięciem okna, na chwilę przed opuszczeniem strony (ktoś może przypadkowo kliknąć jakiś link), na puszczenie w drag&drop. Każde z nich niech tworzy znacznik czasowy(czy tam setInterval). Ileś minut po owym znaczniku wywołuje się zapis automatyczny i ustawia on następny punkt zapisu w przyszłości. W ten sposób zapisy automatyczne nie będą (a przynajmniej nie powinny) ze sobą kolidować
erix
Zacznijmy od tego, czy POST rzeczywiście jest Ci tutaj potrzebny. Najprostszy GET wystarczy, nawet wywoływany przez fikcyjny obrazek.

Cytat
3. Czy wywoływać zapis danych metodą POST w momencie zmiany położenia paneli (ludzie mogą bawić się panelami, generując dużo zapisów w jednym czasie), czy np. co 5 s. (niezależnie od tego czy użytkownik rusza panele są generowane zapisy)?

Ja bym to zrobił inaczej: user zaczyna się bawić i odpalasz stoper (setTimeout). Jeśli w ciągu tych np. 5 sekund znowu poruszy, resetujesz stoper. I jeśli przestanie się bawić -> wówczas stoper się wykona, Ty zapisujesz dane do bazy i czekasz na kolejny ruch.

I teraz co i po co:
  • stoper: umożliwia zareagowanie na chwilową przerwę w zabawie widgetami; czas opóźnienia musisz dobrać wg testów
  • zerowanie - jeśli znowu zacznie się bawić, wtedy na czas drag'n'dropa zamrażasz odliczanie i czekasz aż przestanie się bawić
  • ondrop znowu start stopera i jeśli nie będzie się bawił, wtedy możesz spokojnie zapisać na serwerze

I teraz sprawa po stronie serwera: jeśli obciążenie jest naprawdę duże - zrób plik log-transakcyjny zamiast bezpośredniego zapisu do bazy.
cojack
A ja polecam książkę Head First AJAX.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.