Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

thiago scs

Lógica para aplicação realtime

Recommended Posts

Boa noite galera,

estou desenvolvendo uma aplicação e agora preciso implementar notificações em tempo real.

 

Bom minha estrura de banco de dados é a seguinte:

 

Publicações

Imagens da publicação

Comentário das publicações

Comentário das imagens

Tabela de usuários

Tabela de tags

...

 

Bom, eu criei uma view para informar todos os dados referentes a uma publicação, usuário e tag.

 

A lógica é a seguinte:

Um usuário cria uma publicação com images e também pode vincular uma tag para aquela publicação.

 

Outros usuários podem manter contato com essa publicação e assim recebem notificações sobre atualizações, novos comentários, novas pessoas que estão vinculadas a essa publicação.

 

Meu maior problema é em enviar essas notificações para os usuários vinculados.

 

Fiz um exemplo de notificações utilizando long polling ajax + php, mas a verificação leva +/- 3 segundos para verificar a primeira vez e depois que entra em cache retorna em +/- 50ms.

 

Como eu faço essa verificação a cada 1seg, para todos os usuários que estão logados na aplicação, estou tendo uma latência muito grande no banco de dados e causando muita lentidão na aplicação.

 

Fiz um script pra saber se o usuário está com minha aplicação ativa no navegador e também se ele tem mais de uma aba aberta enviar somente pra aba aberta.

 

Mas mesmo assim ta me causando muita lentidão.

 

Minha pergunta é, Como que eu posso estruturar melhor essa lógica?

 

Na view eu trago sempre a ultima data da ultima coisa que aconteceu para aquela publicação.

Tenho uma tabela separada onde tem a data da ultima vez que o usuario acessou aquela publicação.

 

Quem puder ajudar agradeço e muito

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde Paulo,

 

o problema de eu usar node para esse caso é o seguinte:

 

Imagine uma situação em que tenho 1000 usuários logados na aplicação e um deles faz um novo comentário.

Dispararia um evento para os usuários logados no site checando se de alguma forma o conteúdo pertence a ele, tipo (se ele fez a publicação que teve um comentário adicionado ou se o usuário está mantendo contato com essa publicação).

Teria que consultar no banco de dados se ele tem algum relacionamento com a publicação e ai depois fazer uma consulta para saber o total de notificações não lidas.

 

Imagine que o usuário também tenha aberta 5 abas no navegador dele com minha aplicação aberta. Com o node teria que fazer esse processo de requisição para essas 5 abas.

 

Derrubaria o servidor :(

 

Já fiz esse teste.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, bom, vamos resolver isso então.

Vou assumir que você conhece sockets e já trabalha com node, como você já fez testes, qualquer coisa me avise se esse não for o caso. Vamos lá:

 

1 - 1000 usuarios não é nada para o node.

 

 

Dispararia um evento para os usuários logados no site checando se de alguma forma o conteúdo pertence a ele, tipo (se ele fez a publicação que teve um comentário adicionado ou se o usuário está mantendo contato com essa publicação).

Teria que consultar no banco de dados se ele tem algum relacionamento com a publicação e ai depois fazer uma consulta para saber o total de notificações não lidas.

 

 

Sobre isso, da forma que eu entendi, a pessoa faz um comentário em determinada publicação e então você dispara um evento para todo mundo checkar se esse comentário pertence a ele ou não. Aqui você poderia disparar eventos apenas para quem este comentário já pertence. A checkagem acontece no momento da criação do comentário e não depois.

 

Quando eu faço algo com node(não trabalho muito com ele, somente por curiosidade), eu costumo salvar todos os clientes que estão logados em arrays, dessa forma, consigo acessa-los facilmente. Quando determinado cliente executa uma ação contra o servidor, eu trato essa ação e caso seja o caso, percorro essa array de usuarios logados e envio as respostas para os que delaprecisam. No meu caso, os indices dessas arrays são os proprios ids dos usuarios, dessa forma, vamos para o seu caso:

 

Cliente -> novo comentário:

-> Servidor: Recebe e grava o comentario no banco.

-> Servidor: Seleciona todos os ids dos usuarios que estão acompanhando a publicação/post.

-> Para cada id selecionado, ele manda a resposta para o cliente.

 

Dessa forma, se você tiver 10, 100, 1000 ou 100000 usuários, vai ficar leve para o seu servidor gerenciá-los.

 

Agora, sobre isso:

 

 

Imagine que o usuário também tenha aberta 5 abas no navegador dele com minha aplicação aberta. Com o node teria que fazer esse processo de requisição para essas 5 abas.

 

Isso usando pooling. Se você utilizar sockjs(não use socket.io), quem possui navegador atualizado ja vai eliminar o pooling e utilizar websocket, ainda que as requisições do pooling sejam super leves(embora escrotas e ineficientes xD).

 

Ah, olha isso:

stackoverflow.com/questions/5695107/socket-io-how-many-concurrent-connections-can-websockets-handle

Compartilhar este post


Link para o post
Compartilhar em outros sites

boa tarde Paulo, vamos lá,

Eu ja tenho alguma pratica com node.js e socket.io. Uso hoje essa estrutura para envio de mensagens, bate-papo, etc...

 

Minha aplicação irá rodar na AWS EC2 da amazon mesmo, instância pequena.

 

Hoje eu to usando node com php, só incluo o js de conexão no html e faço todo tratamento com jquery e transporto os dasdos em json.

 

Já tenho um vetor com ids e socket dos usuários mesmo quando eles abrem uma nova aba da aplicação.

 

Eu acho que o único problema que terei será quando um usuário estiver online e aparecer a notificação para ele e logo na sequência o usuário que fez o comentário apagar o comentário.

 

Eu resolvi usar o pooling pq ele já resolveria isso para mim e como mencionei, eu tenho um controle que sei qual é a aba ativa que o usuário está na aplicação, ou seja, quando o usuário muda de aba ou minimiza o browser, eu interrompo o polling.

 

O problema não é somente o comentário, tenho outras ligações tipo se eu mencionar um usuário nesse comentário eu tenho que enviar a notificação para ele também.

 

A aplicação vai funcionar parecido com o facebbok. E como li que o face também faz polling para reduzir a latência do servidor resolvi usar polling sem sucesso.

 

Vou tentar fazer uns testes do jeito que você mencionou e ver se consigo uma boa melhora.

 

Valew amigo

Compartilhar este post


Link para o post
Compartilhar em outros sites

estamos fugindo do mysql :D

 

 

Eu acho que o único problema que terei será quando um usuário estiver online e aparecer a notificação para ele e logo na sequência o usuário que fez o comentário apagar o comentário.

 

 

Você pode colocar o comentario em um timeout de uns 30 segundos, por exemplo, e dentro do callback ver se ele foi deletado ou não.

 

Mas ainda que ele clique no comentario apagado basta exibir a mensagem que o mesmo não mais existe.

 

Não vejo necessidade de interromper pooling(ie só roda com ele), ainda não sei porque ficou lento o seu sistema de updates, provavelmente muitas queryes contra o mysql. Da logica que mencionei acima essas queryes seriam eliminadas em sua maioria.

 

 

Eu ja tenho alguma pratica com node.js e socket.io. Uso hoje essa estrutura para envio de mensagens, bate-papo, etc...

 

Antes de você se aprofundar no socket.io, da uma olhada nisso, que interfere justamente no pooling

https://github.com/LearnBoost/socket.io/issues/996

 

https://github.com/learnboost/socket.io/issues/438 <-- li tudo, nada...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.