Witam
Od jakiegoś czasu borykam się z problemem optymalizacji mojego systemu do serwera gry (L2jServer).
System ten to prosta Aukcja pozwalająca np: wyszukiwać przedmioty.
Problem polega na tym iż przy wywołaniu zapytania na tabeli rzędu 1 000 000 rekordów, serwer laguje na kilka sekund.
Całość oparta jest o obiektowy model java. Zapytania aktualizujące pojedyncze rekordy wydają sie nie powodować rzadnych lagów.
Problem pojawia się przy wyszukiwarce aukcji, dla podanych preferencji.
Zakładając że wyszukiwarka moze zostać użyta przez conajmniej 1000 użytkowników w jednej chwili, oraz
dodatkowo każdy przedmiot ma conajmniej 5 własciwości po których można wyszukiwać lub sortować.
Całość jest na 1 komputerze wiec zasoby są dzielone przez bazę danych, i server java.
Pomysł:
-
Przy podaniu preferencji wyszukiwania, wyślij zapytanie do bazy, i zwróć listę wybranych przedmiotów.
(rozwiązanie może być skrajnie nie optymalne ze wzgledu na dużą liczbę rekordów (1 000 000) i duża liczbę użytkowników (1 000)). -
Korzystanie z modelu obiektowego (model utworzony, lecz na razie brak pomysłu na posortowanie list).
*Utworzenie list przechowujących wszystkie przedmioty (obiekty).
*Każda lista musi być w jakiś sposób posortowana, ze względu na możliwość wyświetlania przedmiotów wg nazwy, ceny itp. (rosnąco lub malejąco).
*można np: utworzyć jakąś listę lub mapę FastMap przechowujacą id aukcji w porzadku nie malejącym, dodawanie nowej aukcji dodawało by ją w odpowiednie miejsce (INSERT(pozycja) <- czy taki mechanizm istenie w JAVA? np FastMap nie ma metody insert).
*Przy wielokrotnym wywołaniu wyszukiwania dla podanych preferencji, nie będzie to powodować lagów (np: wywołania asynchroniczne).
Podsumowując:
-
Pierwszy pomysł raczej odpada, więc czy 2 pomysł jest dobry?
Jeżeli tak to czy istnieją listy pozwalające na operację wstawiania do listy nowego elementu na danej pozycji (uwględnić tu należy ze lista jest cały czas przeszukiwana! tzn. 1 gracz dodaje/usuwa aukcję, co ma nie powodować przerwania dla innych graczy szukających w tym samym czasie, po tej samej liście).
Można zrobić wywołania asynchroniczne, co spowoduje rozłożenie obciążenia równomiernie dla 1000 graczy.
Ale czy to nie spowoduje destabilizacji działania pozostałych fukcji serwera? -
Czy należało by zmienić coś w bazie danych:
- obecna struktura to 1 tabela zawierająca listę aukcji, oraz tabele pomocnicze jak np: dane graczy, dane przedmoitów.
- edytować mogę TYLKO tabelę dotyczącą aukcji!
- dla pomysłu 2 struktura tabeli raczej nie ma dużego znaczenia, bo wszystkie dane są przechowywane w modelu obiektowym.
-
Inne pomysły? na razie brak, w serwisach jak allegro używany jest model wielo-warstwowy. Ja posiadam 1 komputer i interesuje mnie jakich metod użyć w języku JAVA, SQL by zrealizować tą funkcjonalność?
Za podpowiedzi z góry dziekuję ;)
Ewentualnie proszę o podanie jakiejś literatury odnoszącej sie do tematu (może być po angielsku).