MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB Schema Design - Bate-papo em tempo real


Usei o Redis , NGINX e PHP-FPM para meu projeto de chat. Não super elegante, mas faz o truque. Há algumas peças no quebra-cabeça.

  1. Existe um script PHP muito simples que recebe comandos do cliente e os coloca em uma enorme LIST. Ele também verifica todas as LISTAS de salas e as LISTAS privadas dos usuários para ver se há mensagens que devem ser entregues. Isso é pesquisado por um cliente escrito em jQuery e é feito a cada poucos segundos.

  2. Existe um script PHP de linha de comando que opera no lado do servidor em um loop infinito, 20 vezes por segundo, que verifica essa lista e processa esses comandos. O script lida com quem está em qual sala e permissões na memória de scripts, essas informações não são armazenadas no Redis.

  3. O Redis tem uma LIST para cada quarto e uma LIST para cada usuário que funciona como uma fila privada. Ele também possui vários contadores para cada sala em que o usuário está. Se o contador de usuários for menor que o total de mensagens na sala, ele obtém a diferença e a envia para o usuário.

Não consegui testar essa solução, mas pelo menos pelo meu benchmark básico, ela provavelmente poderia lidar com muitos milhares de mensagens por segundo. Há também a oportunidade de migrar isso para algo como Node.js para aumentar o desempenho. O Redis também está amadurecendo e tem alguns recursos interessantes, como comandos Pub/Subscribe, que podem ser de interesse, que possivelmente removeriam o polling no lado do servidor.

Pesquisei soluções baseadas em Comet, mas muitas delas eram complicadas, mal documentadas ou exigiriam que eu aprendesse uma linguagem totalmente nova (por exemplo, Jetty->Java, APE->C), etc ... Também a entrega e a passagem por proxies às vezes podem ser um problema com o Comet. Então é por isso que eu fiquei com a votação.

Imagino que você possa fazer algo semelhante com o MongoDB. Uma coleção por sala, uma coleção por usuário e depois uma coleção que mantém contadores. Você ainda precisará escrever um daemon ou script de back-end para lidar com o gerenciamento de onde essas mensagens vão. Você também pode usar as "coleções limitadas" do MongoDB, que mantém os documentos classificados e também limpa automaticamente as mensagens antigas, mas isso pode ser complicado para manter os contadores adequados.