Użyłem Redis , NGINX i PHP-FPM dla mojego projektu czatu. Niezbyt elegancki, ale załatwia sprawę. Układanka składa się z kilku elementów.
-
Istnieje bardzo prosty skrypt PHP, który odbiera polecenia klienta i umieszcza je w jednej ogromnej LIŚCIE. Sprawdza również wszystkie LISTY pokojów i LISTY prywatne użytkowników, aby sprawdzić, czy są jakieś wiadomości, które musi dostarczyć. Jest to odpytywane przez klienta napisanego w jQuery i wykonywane co kilka sekund.
-
Istnieje skrypt PHP wiersza poleceń, który działa po stronie serwera w nieskończonej pętli, 20 razy na sekundę, który sprawdza tę listę, a następnie przetwarza te polecenia. Skrypt obsługuje kto jest w jakim pokoju i uprawnienia w pamięci skryptów, ta informacja nie jest przechowywana w Redis.
-
Redis ma LISTĘ dla każdego pokoju i LISTĘ dla każdego użytkownika, która działa jako kolejka prywatna. Ma również wiele liczników dla każdego pokoju, w którym znajduje się użytkownik. Jeśli licznik użytkownika jest mniejszy niż łączna liczba wiadomości w pokoju, otrzymuje różnicę i wysyła ją do użytkownika.
Nie byłem w stanie przetestować tego rozwiązania w warunkach skrajnych, ale przynajmniej z mojego podstawowego testu porównawczego prawdopodobnie poradzi sobie z wieloma tysiącami wiadomości na sekundę. Istnieje również możliwość przeniesienia tego na coś takiego jak Node.js w celu zwiększenia wydajności. Redis również dojrzewa i ma kilka interesujących funkcji, takich jak polecenia Pub/Subscribe, które mogą być interesujące, które prawdopodobnie usunęłyby odpytywanie po stronie serwera.
Przyjrzałem się rozwiązaniom opartym na Comet, ale wiele z nich było skomplikowanych, słabo udokumentowanych lub wymagałoby ode mnie nauki zupełnie nowego języka (np. Jetty->Java, APE->C), itp. Również dostarczanie i przechodzenie przez proxy może czasami być problemem z Comet. Dlatego utknąłem z ankietami.
Wyobrażam sobie, że możesz zrobić coś podobnego z MongoDB. Kolekcja na pokój, kolekcja na użytkownika, a następnie kolekcja, która obsługuje liczniki. Nadal będziesz musiał napisać demona lub skrypt zaplecza, aby obsłużyć zarządzanie tymi wiadomościami. Możesz także użyć "ograniczonych kolekcji" MongoDB, które utrzymują dokumenty posortowane i automatycznie usuwają stare wiadomości, ale może to być skomplikowane w utrzymaniu odpowiednich liczników.