dobra aplikacja serverowa - watki i pocesy

0

Cześć piszę server dla graczy, który korzysta z bazy postgres. W dokumentacji znalazłem informację, że nie można forkować programu, przy otwartych połączeniach z bazą bo jest to niebezpieczne. Moim pierwszym pytaniem jest to czy mogę zrobić forka po podłączeniu się do gniazda i rozpoczęciu nasłuchu? Chodzi o to czy takie podejście jest bezpieczne. Jeżeli takie rozwiązanie jest bezpieczne to w moim mniemaniu program wyglądał by mniej więcej tak:

  1. Rozpoczęcie nasłuchu na gnieździe.
  2. fork() razy powiedzmy 10 albo więcej.
  3. Stworzenie listy np 20 połączeń do bazy.
  4. Funkcja accept() i pobranie soceta łączącego się klienta.
  5. Tworzenie nowego wątku dla połączonego klienta.
  6. Opakowanie wątków i listy połączeń do bazy semaforem uogólnionym powiedzmy do 12 lub 14.
    Czytałem, że ilość wątków w procesie nie powinna przekraczać 16. Co myślicie o takim podejściu? Zastanawiam się czy nie przekombinowałem. Może macie jakieś inne pomysły?
0

na 99% klient postgresa, którego używasz nie jest thread-safe. Oznacza to mniej więcej tyle, że nie powinieneś (możesz, ale czy się nie wykrzaczy to inna bajka) używać jednego połączenie między procesami. Generalnie rozwiązania są dwa - każdy proces ma własne połączenie albo jest jedno połączenie a proces dostaje je na własność na żądanie a w tym czasie pozostałe muszą czekać. Rozwinięciem rozwiązania drugiego jest grupowanie procesów dla połączenia - np. na każde 10 procesów przypada jedno połączenie i to połączenie jest wywłaszczane tylko w grupie tych 10 procesów.

Aby to sensownie rozwiązać musiał byś się zastanowić ile będzie jednocześnie podłączonych klientów, jak często klient będzie coś chciał od bazy, jakie są oczekiwane czasy odpowiedzi, jak długo klient może czekać przy jednym połączeniu do bazy, itd, itp. Optymalnie było by jakbyś zastosował rozszerzoną wersję drugą z możliwością dynamicznej regulacji procesów na połączenie w zależności od tego jak długo poszczególne procesy muszą czekać na swoją kolej

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