MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Projektowanie schematów MongoDB — czat w czasie rzeczywistym

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.

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

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

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



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Ustaw lokalizację magazynu MongoDB zainstalowanego w instancji AWS EC2 na magazyn EBS. I jak go odzyskać po zatrzymaniu/zakończeniu instancji?

  2. dopasowywanie pól wewnętrznie w mongodb

  3. Tablica Mongodb $push i $pull

  4. Zapytanie MongoDB z warunkiem „lub”

  5. Przykład dla transakcji w mongodb z GoLang