Executando verificação de segurança...
1

Websocket em um saas

Olá,
Estou desenvolvendo um saas em node com o uso de websockets (especificamente Socket.io) e me surgiu algumas dúvidas:

Como é um saas, haverão vários usuarios utilizando ao mesmo tempo e se conectando a diferentes namespaces/rooms no socket, quais as melhores práticas pra evitar problemas de performance no servidor?

As vezes sofro com um problema onde parece que o socket simplesmente para de enviar eventos, ai preciso atualizar a página e ele retorna a enviar normalmente. Alguem já passou por isso?

Carregando publicação patrocinada...
3

Fala Owner, tudo bem contigo?

Eu já desenvolvi algumas aplicações utilizando de WebSockets, também usando o socket.io, e uma delas inclui coisas parecidas com o que você está mencionando.

Era um jogo, exemplo Wordle, porém competitivo, um dependia do outro, projeto da faculdade mesmo. Todos os membros estão logados e quando eles faziam alguma ação, o socket precisava enviar isso para o servidor e existia um namespace para a sala, e todos os sockets com aquele namespace eram "broadcastados" sobre a nova medida.

Seu problema primeiramente: O que pode estar acontecendo contigo é um timeout da conexão, as vezes, o ws fecha num timeout, e existe uma propriedade chamada de heartbeat, que mantém o socket ativo mesmo com a demora do retorno, também tem o (ping e pong) no socket.io.

Agora vem minhas sugestões, eu utilizava um servidor no Express e relacionava a sessão do usuário com o socketio, via Redis, para guardar os estados sempre. Porém, localmente tudo funcionava certinho e eu hospedava numa plataforma (Cyclic) pelo que eu me lembro, que não permitia o uso do protocolo ws, portanto acabei usando um negócio chamado pooling, que simula um websocket, porém, ele gera muitos requests e minha conta foi para as alturas, foi incompetência minha, não tinha me ligado que estava com o pooling habilitado.

Melhor coisa que fiz, utilizei o redis-store no expressjs, fiquei meio perdido tentando relacionar sessão e socket via banco de dados por um tempo, mas valeu o apreendizado.

Abraço grande! Qualquer ajuda só mandar aqui, eu abro o tabnews com alguma frequência.

2

Muito obrigado pela resposta :)

Sim, o polling vai atualizar sucessivamente, correto?

Não entendi muito bem a parte da solução do timeout.

Basicamente quando o usuário logar ele vai se conectar ao socket (passando por um middleware, verificando se realmente está autenticado com o token e verificando se o id do tenant vinculado é igual ao namespace acessado).

Tenho um array onde armazeno o id do namespace sendo a chave e dentro dele outro array contendo:
id do usuario (chave) => socket id do usuário (valor)
Pra conseguir recuperar o id do socket de cada usuário caso precise enviar um evento em específico.

Quando você menciona que relaciona sessão do usuário e socket, seria o mesmo que "buscar" o usuário dentro do socket (como por exemplo eu fiz no middleware)?

1

Sim, o pooling atualiza sucessivamente, mas o ideal é usar o protocolo WS mesmo.
O heartbeat é bem como o nome diz, é como se fosse uma batida de coração que independente do usuário estar ativo (mexendo na aplicação) o socket continua vivo.

Bom, esse definitivamente é um approach, esse teu do array, só que: Eu ainda prefiro o Redis, por ser independente, ele nem é pesado.

Exato, como se fosse assim mesmo como você mencionou na sua ultima resposta!

Você linka o socket id e o user id dessa maneira via o Redis, ou via seu array.

Essa resposta foi meio corrida. Boa sorte, a melhor maneira para fazer funcionar é começando hehehehe, e pelo jeito você já começou! Tmj Owner, qualquer coisa manda mensagem +48 996351055

Para que eu possa te ajudar mais e talvez te mandar aquele meu projeto (tenho que ver se acho, faz tempo e na época nem sabia do tal do github)

1

O problema do Redis é que ai eu teria que configurar tanto na stack (uso docker swarm) quanto no server, monitorar e acredito que seria um bom consumo de recursos a mais né?