2017-10-15 3 views
0

Je crée une application de chat et je voudrais ajouter la fonctionnalité de montrer un symbole en ligne/hors ligne à côté des utilisateurs. Comment est-ce que je peux faire ceci de manière fiable avec le nombre minimum de demandes de srever et d'écritures de base de données? Un moyen que j'ai trouvé était de mettre à jour un champ lastSeenAt dans le document utilisateur chaque fois que l'utilisateur demande une page et l'utiliser pour indiquer si l'utilisateur est en ligne ou hors ligne. Une autre méthode consiste à envoyer une commande ping au serveur du côté client à des intervalles de temps fixes, puis à mettre à jour le champ lastSeenAt.Comment puis-je montrer si un utilisateur est en ligne dans express?

Ces deux moyens nécessiteraient beaucoup d'écritures de base de données et/ou de requêtes de serveur. Y a-t-il un moyen de le faire plus efficacement?

Répondre

0

Regardez dans Express.io où vous pouvez combiner des appels HTTP avec des sockets. (la meilleure méthode pour la communication en temps réel est Sockets).

1

Vous devez envoyer les données de votre serveur aux clients en cas de modification, avec quelque chose comme des connexions Web ou des événements envoyés par le serveur. socket.io est un outil populaire pour la mise en œuvre de manière fonctionnelle. Avec socket.io ou spécifiquement websockets vous pouvez suivre si un client est connecté ou non et avoir un drapeau dans la base de données qui suit chaque fois qu'un client se connecte ou déconnecte (gardez à l'esprit, le client peut avoir plusieurs connexions (plusieurs périphériques, ou même des onglets de navigateur), donc si une connexion se déconnecte il peut encore être en ligne

En supposant que vous aurez plusieurs serveurs Web sans état (pratique courante), puis une fois qu'un client se connecte ou se déconnecte, vous voulez en informer d'autres Pour les clients intéressés, vous devez utiliser un modèle pubsub pour notifier les autres serveurs qui notifieront respectivement leurs clients connectés.Il y a beaucoup d'implémentations telles que Redis, zeromq, SNS AWS, GCP Cloud Pubsub Vous pouvez même utiliser MongoDB with tailable cursors comme votre pubsub. Cependant, cela peut signifier beaucoup de connexions constantes à votre serveur, ce qui peut nuire à votre évolutivité. Si cela s'avère trop cher pour vous alors votre approche lastSeenAt avec quelques interrogations saines. Vous pouvez trouver ce qui fonctionne le mieux avec votre configuration en exécutant quelques expériences.

Si la base de données écrit et demande des soucis, vous pouvez toujours y lancer plus de serveurs. Vous pourriez avoir un microservice spécifiquement pour cela afin que votre serveur principal ne soit pas affecté beaucoup et vous pourriez également avoir une base de données spécifique pour cela. Si les performances vous inquiètent, vous pouvez utiliser une base de données en mémoire.

Vous pouvez également avoir une mise en cache sur vos serveurs avec une simple validation basée sur le temps ou vous pouvez synchroniser les données en ligne/hors ligne entre vos serveurs avec un modèle pubsub.

Je suggérerais d'essayer de rendre votre configuration aussi simple que possible, et vous pouvez lancer des expériences pour voir comment il gère votre trafic attendu.