Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Projekt serwera sieci rozproszonej - prośba o sprawdzenie poprawności
sweter
post
Post #1





Grupa: Zarejestrowani
Postów: 623
Pomógł: 11
Dołączył: 1.01.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Cześć!

Zabieram się za napisanie serwera sieci rozproszonej. Nigdy nie pisałem tak zaawansowanego projektu, w związku z tym chciałem prosić o zweryfikowanie mojego pomysłu przez osoby bardziej doświadczone. Serwer nie będzie pisany w PHP, więc dlatego zamieściłem go w tej kategorii ('Miejsca na dyskusje nie pasujące do innych for.").

Sieć ma być dostępna przez zwykłe połączenia socketowe oraz WebSocketowe (z przeglądarek). Każdy klient łączy się z jednym z losowo wybranym serwerem. Serwerów jest kilka. Wszystkie serwery mają nawiązane połączenie między sobą, do wymiany wiadomości.

Dodatkowo każdy serwer jest połączony z bazą danych w chmurze, która z perspektywy systemu jest jednym bytem wspólnym dla wszystkich serwerów.

Chciałem, aby serwery odbierały wiadomości od klientów i innych serwerów w postaci wiadomości podobnych do protokołu HTTP. W każdej wiadomości byłby nazwa zadania do wykonania (np. "dodaj produkt do koszyka") oraz dane, z którymi zostaje wywołane zapytanie (np. identyfikator produktu).

Myślałem jak rozplanować zarządzanie takim przepływam wiadomości. Chciałbym, aby serwer (ze względów wydajnościowych) był oparty o zdarzenia. I tak: istniałaby jedna główna kolejka, w której znajdowałyby się odebrane wiadomości do wykonania. Dodatkowo byłyby inne kolejki, służące do wysyłania zapytań do bazy danych, serwera plików lub jeszcze innych źródeł, jeśli przyjdzie taka potrzeba. Każda kolejka będzie osobnym wątkiem, którego zadaniem byłoby branie najstarszej wiadomości (lub operacji do wykonania) z listy oczekujących i wykonanie jej. Miałoby to działać jak hardware komputera: główna kolejka do procesora i pozostałe do urządzeń wej/wyj.

Gdyby jakieś zadanie wymagałoby wykonania zapytania do bazy danych lub zewnętrznego serwera, to nastąpiłoby jego "spauzowanie". Odpowiednia żądanie trafiałoby do kolejki bazy danych lub kolejki komunikacji z zewnętrznym serwerem. Dopiero gdyby takie żądanie zostałoby wykonane i zostały zwrócone jakieś dane, to zadanie trafiałoby z powrotem do głównej kolejki wiadomości, i gdy nadeszłaby jego kolej zostałoby ono "odpauzowane" od stosownego miejsca.
Po spauzowaniu zadania wątek głównej kolejki wziąłby kolejne zadanie z listy i zacząłby je wykonywać.

Co myślicie o tym rozwiązaniu. Jest ono poprawne? A jeśli nie to co należałoby zmienić? Gdzie widzicie słabe punkty?

Z góry dziękuję za odpowiedzi!
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Dejmien_85
post
Post #2





Grupa: Zarejestrowani
Postów: 251
Pomógł: 23
Dołączył: 23.04.2013

Ostrzeżenie: (0%)
-----


Cytat(sweter @ 17.12.2015, 22:51:46 ) *
Co myślicie o tym rozwiązaniu. Jest ono poprawne? A jeśli nie to co należałoby zmienić? Gdzie widzicie słabe punkty?


Najsłabszym punktem jest zdecydowanie brak jakichkolwiek ustaleń i celów. Napisałeś, że chcesz stworzyć sieć rozproszoną, która będzie utrzymywać połączenia socketowe i tworzyć kolejki do różnych zadań, które będą rosnąć w razie potrzeby. Jednym zdaniem jest to masło maślane.

Ale, aby rzucić na ten temat jakieś światło, to powiem tyle - sieci rozproszone nie powstają sobie od tak na życzenie. Każdy system rozproszony jest dobrze przemyślany. Często zaczyna się od jednego, monolitycznego systemu, który później po "urośnięciu" rozbija się na mniejsze systemy. Jest to temat rzeka, jedyne co Ci mogę zaproponować, to poczytanie o WebSerwisach i MicroSerwisach.

Ty musisz zrozumieć jedno - dopóki nie będziesz miał konkretnej wizji systemu, to będziesz się zastanawiał jak stworzyć samolot pasażerski, który będzie jeździł po torach kolejowych i rozwoził kanapki pracownikom stacji PKP. Stworzysz wtedy monstrum, które nie będzie miało żadnego sensu ani odniesienia do rzeczywistości.
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 8.10.2025 - 04:51