2009-10-05 10 views
0

J'ai développé une application Web de discussion qui utilise une base de données SqlServer pour échanger des messages .Application de chat Asp.net utilisant la base de données pour la file d'attente de messages

tous les clients interrogent toutes les x secondes pour rechercher de nouveaux messages.

il est évident que cette approche consomme de nombreuses ressources, et je me demandais s'il y a une façon «moins chère» de le faire.

J'utilise la même approche pour "présence": vérifier qui est activé.

grâce

Yaron

Répondre

0

Pour quelque chose comme une application de chat en temps réel, je recommanderais un cache distribué avec un support SQL. Je suis comme memcached avec le fournisseur .NET Enyim, donc je ferais quelque chose comme ce qui suit:

  1. messages de l'utilisateur un message
  2. système écrit un message à la base de données
  3. système écrit un message à cache
  4. Tout cache de sondage des utilisateurs périodiquement pour les nouveaux messages

le support de base de données vous permet de précharger le cache dans le cas où le cache est effacé ou l'application redémarre, mais les bits fonctionnels comptent sur en Memor y cache, plutôt que d'interroger la base de données.

+0

Merci, je vais vérifier Ma raison me dit que si c'est une conversation en tête-à-tête, et je pollling seulement pour les nouveaux messages, alors je ne peux pas utiliser le cache (si c'était un chat de groupe, il Merci :) – Yaron

+0

Vous pouvez toujours utiliser un cache: dans l'idéal, vous conservez un objet index par utilisateur contenant une clé de cache pour chaque message de cet utilisateur, ainsi que le Votre code vérifie cet objet index pour les nouveaux messages ciblant l'ID (ou le groupe) de l'utilisateur interrogateur. – Chris

0

Si vous utilisez SQL Server 2005, vous pouvez consulter les services de notification. Accordé que cela vous verrouillerait dans SQL 2005 comme Notification Services a été supprimé dans SQL 2008 il a été conçu pour permettre à SQL Server d'informer les applications client des modifications de la base de données.

Si vous voulez quelque chose d'un peu plus évolutif, vous pouvez mettre quelques indicateurs binaires dans l'enregistrement des utilisateurs. Lorsqu'un message pour l'utilisateur arrive, changez le bit pour les nouveaux messages à true. Lorsque vous lisez les messages, changez-le à 0. Idem pour les personnes qui se connectent ou se déconnectent. De cette façon, vous lisez un très petit champ qui a une bonne chance d'être déjà dans le cache.

Est-ce que le flux de travail serait prêt le bit. Si c'est 1 alors allez chercher les messages de la table des messages. Si c'est 0, ne faites rien.

+0

Notification Services ne résout pas le problème de l'élimination de l'interrogation qui est au centre de ce problème. Je suppose que Yaron essaye de trouver une manière plus efficace et moins consommatrice de ressources de mettre à jour le client web des informations de chat/chatters. –

+0

Salut, l'accent de cette question n'est pas sur l'interrogation. Je sais que je peux utiliser "comète" (inverse-ajax) et éviter l'interrogation. Mon objectif est: est-il sage d'utiliser une table de base de données pour échanger des messages et de maintenir l'état des participants merci :) Yarin – Yaron

+0

Oui c'est. L'utilisation d'une table est le seul moyen de conserver les messages via un redémarrage du serveur ou du service afin de ne perdre aucun message. – mrdenny

1

Sans utiliser de plugin/extension de navigateur comme l'applet flash ou java, le navigateur est essentiellement un outil de communication à sens unique. La requête doit être lancée par le navigateur pour récupérer les données. Vous ne pouvez pas "pousser" les données vers le navigateur.

Nombreuses applications Web utilisant la méthode d'interrogation Ajax pour simuler un 'push' du serveur. L'astuce consiste à équilibrer la fréquence/taille des données avec la bande passante et les ressources du serveur.

Je viens de faire une simple observation pour gmail. Il effectue une interrogation HttpPost toutes les 5 secondes. S'il n'y a pas de changement d'état, la taille des données de réponse n'est que de quelques octets (n'incluant pas les en-têtes http). Bien sûr, google a d'énormes ressources serveur et de la bande passante, c'est pourquoi je mentionne: trouver un bon équilibre.

Cela signifie «Amélioration de l'expérience utilisateur par rapport aux ressources du serveur». Vous pourriez avoir besoin de sortir avec une stratégie créative de sondage, au lieu d'un sondage simple toutes les x secondes.

E.g. Si aucune activité de la partie A, interroger toutes les 3 secondes. Pendant que la partie A est en train de taper, interrogez toutes les 5 secondes. Ceci est juste une illustration, vous pouvez jouer avec les chiffres, ou en sortir avec un plus efficace.

Enfin, l'échange de données. Le défi consiste à trouver un moyen de transmettre des tailles de données minimales pour transmettre les mêmes informations.

mes 2 cents :)

+0

Je consulte l'état de la conversation. Ma question était aboubt - existe-t-il un autre moyen d'échanger des messages en plus d'utiliser une table dans la base de données. Les instructions "Sql Insert" sont "chères, et je me demande si j'ai besoin d'utiliser la base de données lors d'une conversation, y at-il une autre manière, moins chère Merci :) – Yaron

+0

Je vois, je suppose que j'ai mal compris la question. –

0

Dans ASP.NET 4.0, vous pouvez use the Observer Pattern with JavaScript Objects and Arrays à savoir: AJAX JSON appels avec jQuery et ou PageMethods.

Vous allez toujours avoir à frapper la base de données pour faire une analyse pour savoir s'il y a des données à retourner ou non. L'astuce consiste à rendre ces appels plus petits et à ne renvoyer des données que lorsque cela est nécessaire.

0

Il existe deux solutions connexes intégrés à SQL Server 2005 et toujours disponible dans SQL Server 2008:

1) Service Broker, qui permet aux abonnés d'afficher les files d'attente (lit sur la commande RECEVOIR avec ATTENDRE ..). Dans votre cas, vous voudriez envoyer votre message à travers la base de données en utilisant Service Broker Services en face de ces Files d'attente, qui pourraient ensuite être récupérées par les clients en attente. Il n'y a pas d'interrogation, les clients en attente sont simplement activés lorsqu'un message est reçu.

2) Query Notifications, qui permettent à un abonné de définir une requête, et les notifications de réception lorsque l'ensemble de données qui résulterait de l'exécution de cette requête changerait. Construit sur Service Broker, les notifications de requêtes sont un peu plus faciles à utiliser, mais peuvent aussi être un peu moins efficaces. (Not that Notifications de requête et leurs frères et sœurs, les notifications d'événements sont souvent confondues avec Notification Services (NS), ce qui cause des inquiétudes car NS est désengagé en 2008, cependant, les notifications d'événements sont toujours disponibles et même améliorées dans SQL Server 2008).

Questions connexes