Asp.net application de chat en utilisant la base de données pour la file d'attente de messages

StackOverflow https://stackoverflow.com/questions/1522935

Question

J'ai développé une application web de chat qui utilise une base de données SqlServer pour échanger des messages.

Tous les clients Interroger toutes les x secondes pour vérifier les nouveaux messages.

Il est évident que cette approche consomme beaucoup de ressources, et je me demandais s'il y a un moyen « moins cher » de le faire.

J'utilise la même approche pour la « présence »: la vérification qui est sur

.
Était-ce utile?

La solution

Pour quelque chose comme un temps réel application de chat, je recommande 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. les messages de l'utilisateur message
  2. système écrit un message à la base de données
  3. système écrit un message à cache
  4. Toutes les 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 le cache en mémoire, plutôt que l'interrogation la base de données.

Autres conseils

Sans l'aide d'un plug-in navigateur / l'extension comme Flash ou applet java, navigateur est essentiellement un outil de communication à sens unique. La demande doit être initiée par le navigateur pour récupérer les données. Vous ne pouvez pas les données « push » du navigateur.

De nombreuses applications Web en utilisant la méthode de sondage Ajax pour simuler un serveur « push ». L'astuce consiste à équilibrer la taille fréquence / données avec les ressources de bande passante et le serveur.

Je viens de faire une observation simple pour gmail. Il fait un sondage de HttpPost toutes les 5 secondes. S'il n'y a pas de changement « de l'État », la taille des données de réponse est seulement quelques octets (non compris les en-têtes http). Bien sûr Google ont d'énormes ressources de serveur et la bande passante, c'est la raison pour laquelle je mentionne: trouver un bon équilibre.

C'est « Améliorer l'expérience utilisateur vs ressources du serveur ». Vous pourriez avoir besoin de sortir d'une manière créative de la stratégie de vote, au lieu d'un vote direct toutes les x secondes.

par exemple. Si aucune activité de la partie A, sondage toutes les 3 secondes. Alors que la partie A est en train de taper, sondage toutes les 5 secondes. Ceci est juste un illustraton, vous pouvez jouer avec les chiffres, ou venez avec un plus efficace.

Enfin, l'échange de données. Le défi est de trouver un moyen de transmettre des tailles minimales de données pour transmettre la même information.

mes 2 cents:)

Si vous utilisez SQL Server 2005, vous pouvez consulter les services de notification. Accordé cela vous enfermer dans SQL 2005 Notification Services a été supprimé dans SQL 2008, il a été conçu pour permettre au serveur SQL de notifier les applications clientes de modifications à la base de données.

Si vous voulez quelque chose d'un peu plus évolutive, vous pouvez mettre un couple de drapeaux de bits sur le dossier Utilisateurs. Lorsqu'un message pour l'utilisateur vient à changer le bit de nouveaux messages sur true. Lorsque vous lisez les messages changent à 0. Même quand les gens vous sur et en dehors. De cette façon, vous lisez un très petit champ qui a une putain de bonne chance d'être déjà dans le cache.

Faites le flux de travail serait prêt le bit. Si c'est 1 alors allez obtenir les messages de la table des messages. Si c'est 0 ne rien faire.

Dans ASP.NET 4.0, vous pouvez utiliser le modèle d'observateur avec des objets et des tableaux JavaScript à savoir:. AJAX JSON appelle avec jQuery et ou PageMethods

Vous allez avoir toujours frapper la base de données pour faire une analyse sur l'existence de données à retourner ou non. L'astuce sera de rendre ces appels petits et seules les données de retour en cas de besoin.

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 (la commande RECEVOIR avec ATTENDRE ..). Dans votre cas, vous souhaitez envoyer votre message à travers la base de données en utilisant le service Broker services fronting ces Queues, ce qui pourrait ensuite être repris par les clients qui attendent. Il n'y a pas polling, les clients attendent que sont activées lorsqu'un message est reçu.

2) notifications de requête , qui permettent à un abonné de définir une requête, et les recevoir des notifications lorsque l'ensemble de données qui résulterait de l'exécution de cette requête changerait. Construit sur le service Broker, notifications de requête sont un peu plus faciles à utiliser, mais peut aussi être un peu moins efficace. (Non Query Notifications et leurs frères et sœurs, les notifications d'événement sont souvent confondus avec des services de notification (NS), ce qui suscite des inquiétudes car NS est désengagés en 2008, cependant, notifications de requêtes et événements sont encore entièrement disponibles et même améliorée dans SQL Server 2008).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top