Zapytania do wielu serwerów

0

Piszę plugin do minecraft'a, który ma na celu zebranie informacji od wszystkich pozostały serwerów o ich danych takich jak aktualne TPS (Ticks Per Second), liczba graczy itp., ale moim problemem jest to, że chciałbym to zrobić bez ingerencji proxy (czyli takiego serwera zarządzającego w sieciach minecraft, który przykładowo działa jak taki load balancer). Aktualnym sposobem, który stosowałem było ustawianie w plikach konfiguracyjnych np. 3 serwerów i adresów do ich REST API i jak plugin chciał zebrać dane to wysyłał po kolei do każdego http request i odczytywał odpowiedź i system taki się sprawdza, ale przy małej ilość serwerów, ale co zrobić jak będzie np. 20 serwerów i każdy będzie miał ten system do sprawdzania. W takim przyapdku musiałbym w 20 plikach konfiguracyjnych ustawić 19 adresów REST API co wydaje mi się bez sensu. A i system gdzie była by wspólna baza i serwery wtedy mogłyby o sobie nic nie wiedzieć odpada bo to by oznaczało, że muszę np co minutę aktualizować ją danymi, na każdym serwerze, a mi chodzi o dane aktualne. Myślałem nad jakimś systemem z kolejkami, ale nie wiem czy to dobry kierunek i potrzebuje pomocy.

0

Nie mam pojecia jaki masz problem z baza gdzie masz listę serwerów i datę ostatniego odprywatnią i na tej podstawie dobierasz kolejny serwer do odpytania. Musisz mieś tylko ogarnięte problem, że jakiś serwer nie odpowiada albo całkiem zdechł. No i to powinno latać asynchronicznie, bo przy dużej liczbie serwerów może ci braknąć czasu na przejście po wszystkich, a już trzeba będzie to z przodu kolejki odpytywać,

2

Co do samego konfigurowania to po prostu możesz mieć jakiś serwer ustawiony jako "rejestr" i w tym rejestrze każdy inny musi zgłosić swój adres.
Inne serwery biorą sobie potem adresy z tego rejestru.
Większy problem z tym, że " chodzi o dane aktualne" - w systemach rozproszonych nie ma czegoś takiego - fizyka nie pozwala.
Jak będziesz miał 20 serwerów do odpytania to może być tak, że po odpytaniu 20tego ten pierwszy już będzie miał inne dane.
Co gorsza przy 20 serwerach takie odpytanie to 20*19 żądań http - będzie roszło kwadratowo - jak będziesz miał dużo serwerów i często pytał to umrze sieć.

0

Ten plugin do minecrafta, to jest pluginem do serwera czy pluginem do klienta?

0

Przedstawię to jak ja to rozumiem: masz 20 serwerów i każdy z tych serwerów chce z osobna odpytać pozostałą 19 bez żadnego innego centralnego miejsca, które zbiera dane? Ten pomysł średni, bo zobacz jak liczba zapytań rośnie przy zwiększonej ilości serwerów.

HubiRto12 napisał(a):

A i system gdzie była by wspólna baza i serwery wtedy mogłyby o sobie nic nie wiedzieć odpada bo to by oznaczało, że muszę np co minutę aktualizować ją danymi, na każdym serwerze, a mi chodzi o

A czemu nie? Możesz zrobić to np. przy użyciu jakiejś bazy in-memory np. redisa wrzucając aktualizacje np. co sekundę albo częściej. Każdy serwer wrzuca swoje dane na bieżąco (request do redisa trwa bardzo szybko w okolicach milisekundy, problemem jest sieć) a jak któryś chce odczytać dane to można to zrobić jednym zapytaniem.

To działałoby tak, że każdy sewer wrzuca dane w pod takim kluczem server.pierwszy.ticks , server.drugi.fps itd. a jak chcesz to odczytać to walisz jedno zapytanie, które zwraca ci wszystkie klucze z przedrostkiem server.*

1

Jak czytam, że ktoś chce czegoś uniknąć i zastosować coś innego to z doświadczenia zapala mi się czerwona lampka i takie analogicznie porównanie, gdzie ktoś mechanikowi tłumaczy, że chcesz kwadratowe koła, bo mu okrągłe nie pasują i jak ktoś się zgodzi na takie coś to będzie tylko żałował, że próbował spełnić coś co jest bez sensu, ale da się tak zrobić.

Tak jak u góry pisali, jak każdy ma wiedzieć o każdym i nie ma jednego miejsca skąd się o tym mogą dowiedzieć, to muszą odpytać wszystkich co tylko niepotrzebnie ruch generują.

Najlepiej jeden serwer co się tym zajmuje i reszta zgłasza do niego informacje jak się coś zmieni + jakiś delay, lub buforowanie w kolejce zależy jak to wymyślisz.
Nawet mógłby być jeden z serwerów, jakiś master, a reszta slave.

Jeśli serwer ma ciągle tyle samo graczy, mapa się nie zmieniła itp. to co tam chcesz aktualizować?
Bez sensu marnujesz zasoby jak chcesz robić timer co jedną sekundę co będzie wysyłał.
Dość często widzałem takie rozwiązanie w pascalu/javascript, gdzie zamiast jakiegoś listenera dać, reagować na event, to ktoś wywołuje jakiś timer w regularnych odstępach czasu, ale po co, jak coś się zmieni to może callbacka uruchomić, dalej można jakieś reaktywne rozwiązanie dać i buforować żeby jak nastąpią zmiany były regularnie dostarczane, a jak nie będzie to nic nie uaktualni serwera.

W sumie pomysłów można mieć dużo jak to rozwiązać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1