![]() |
![]() |
![]() ![]()
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! |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 251 Pomógł: 23 Dołączył: 23.04.2013 Ostrzeżenie: (0%) ![]() ![]() |
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. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 8.10.2025 - 04:51 |