Ran tu napisał
Obiło mi się o uszy, ale nie do końca wiem o co chodzi. Mam nadzieje, że to na innym typie silnika było ;)
Raczej na każdym dostępnym, jak na 50k nie wywala to spróbuj na 70k, 100k itd itd.
To jest z powodu zapisywania itemów gracza w depo przy każdym login/logout. Wysyłanie zapytania do bazy danych zajmuje więcej niż 3,5,10,15 sekund aż w końcu dochodzi do timeoutu serwera. Z tego samego powodu tibia, żeby zapisać progress postaci i itemy w domkach, resetuje się raz dziennie.
Można przebudować pół silnika pod binary safe, ale i to nie daje gwarancji - a tylko zmniejszy obciążenie zapisu. Nie rozwiązuje to jednak problemu, bo tak jak wcześniej komuś wywalało się przy 50k, to teraz mu się wywali przy 150k - ale dalej zapis będzie wyłączał serwer, tylko przy większej ilości itemów.
Czy ma to wpływ na
normalnych graczy? Tak długo jak nie trzyma 50k itemów w depo (a uwierz mi, raczej nikt tyle nie ma, bo gra sobie RPG na serwerze), to nie. Jednak jest to pewien exploit, który pozwala na zbombardowanie bazy danych, a co za tym idzie - całego serwera.
Nie pomaga takiego zapytania rozdzielenie na kilka zapytań - bo dalej zapis musi się wykonać. Nie pomaga też rzucenie tego zapisu do innego wątku, bo wciąż gdy gracz się przeloguje, to musi jednocześnie wykonać zapis i odczyt - co jest fizycznie nie możliwe = memory access violation. Nie pomaga również przeniesienie zapisu na server save, bo wtedy przy większych ilościach itemów, ten save nie wykona się wcale.
Najlogiczniejszym rozwiązaniem jest przy starcie serwera sprawdzanie który z graczy w bazie danych ma za dużo itemów w depo i ładowanie takiego gracza bezpośrednio na serwer. Te dodatkowe 2 MB pamięci zajęte przez gracza nie wiele "kosztują" ze względu na dostępny w dzisiejszych czasach sprzęt.
Pozostaje kwestia logoutu, w przypadku kiedy gracz nazbiera te itemy i nie chce czekać na serwer save... No cóż, na to nie ma idealnych rozwiązań; bo możesz nie zapisywać tych itemów w ogóle (chyba najgorsze możliwe wyjście), możesz próbować ten zapis przerzucić na serwer save (ale wtedy gracz się do server save nie zaloguje)... itd itd.
Ja bym proponował, choć to rozwiązanie zostało parę razy odrzucone, zrobić na totalnym zadupiu, kordach 99999,99999,9 domek, do którego dostęp jest tylko adminowy.
Przy próbie zapisu takich itemów, itemy te przerzucać do SQMa w domku - z adnotacją/listem, do kogo te itemy należą. Gracz traciłby tymczasowo dostęp do itemów, ale mógłby logować się na postać. Jak to rozwiązuje problem?
No więc, save tych przedmiotów przerzucany jest po pierwsze na server save, czyli do momentu na którym na serwerze nie znajduje się żaden z graczy, a po drugie do zapisu domku - a nie depo, co zapisuje się nieco szybciej, bo dane przenosi do tabeli nielinkowowanych, i choć w relacyjnej bazie danych, to w kontekście nosqlowym.
Ale ja bym każdego usera, który przekroczył "dozwoloną" ilość (~50k) itemów sprawdzał ręcznie - czy to jest najbogatszy człowiek na serwerze, który kolekcjonuje wszystkie itemy ze śmietnika, czy może już desctructive behaviour, którego celem jest psucie serwera?
Gotowego rozwiązania nie podam, bo w świecie otsów jest warte cztero, a może i pięciocyfrową sumę, ale jak masz jakiegoś konkretne pytania na ten temat, możesz śmiało pisać PW - w miarę możliwości pomogę.
Zakładki