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.
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!