Frage

Ich habe eine Chat -Webanwendung entwickelt, die eine SQLServer -Datenbank zum Austausch von Nachrichten verwendet.

Alle Clients befragen alle x Sekunden, um nach neuen Nachrichten zu suchen.

Es ist offensichtlich, dass dieser Ansatz viele Ressourcen verbraucht, und ich habe mich gefragt, ob es eine "billigere" Art zu tun gibt.

Ich benutze den gleichen Ansatz für "Präsenz": Überprüfe, wer an ist.

War es hilfreich?

Lösung

Für etwas wie eine Echtzeit-Chat-App würde ich einen verteilten Cache mit einer SQL-Unterstützung empfehlen. Ich mag Memcached mit dem Enyim .NET -Anbieter, also würde ich so etwas wie Folgendes tun:

  1. Benutzerpostnachricht
  2. System schreibt eine Nachricht in die Datenbank
  3. System schreibt eine Nachricht an Cache
  4. Alle Benutzer befragen Cache regelmäßig für neue Nachrichten

Mit der Datenbank-Sicherung können Sie den Cache vorladen, wenn der Cache gelöscht wird oder die Anwendungen neu gestartet werden. Die funktionalen Bits beruhen jedoch auf dem Memory-Cache, anstatt die Datenbank zu befragen.

Andere Tipps

Ohne ein Browser -Plugin/-erweiterung wie Flash oder Java Applet ist Browser im Wesentlichen ein Einweg -Kommunikationsinstrument. Die Anfrage muss vom Browser initiiert werden, um Daten abzurufen. Sie können Daten nicht in den Browser verschieben.

Viele Web -Apps verwenden eine AJAX -Polling -Methode, um einen Server 'Push' zu simulieren. Der Trick besteht darin, die Häufigkeits-/Datengröße mit den Ressourcen der Bandbreite und Server auszugleichen.

Ich habe gerade eine einfache Beobachtung für Google Mail gemacht. Es macht alle 5 Sekunden eine HTTPPOST -Umfrage. Wenn es keine "Status" -Anänderung gibt, beträgt die Antwortdatengröße nur wenige Bytes (ohne die HTTP -Header). Natürlich hat Google riesige Serverressourcen und Bandbreite, deshalb erwähne ich ein gutes Gleichgewicht.

Das heißt "Verbesserung der Benutzererfahrung gegen Serverressource". Möglicherweise müssen Sie eine kreative Möglichkeit zur Wahlstrategie ergeben, anstatt alle x Sekunden unkompliziert zu werden.

ZB keine Aktivität von Partei A, Umfrage alle 3 Sekunden. Während Party A tippt, befragen Sie alle 5 Sekunden. Dies ist nur ein Illustraton, Sie können mit den Zahlen herumspielen oder eine effizientere herauskommen.

Zuletzt der Datenaustausch. Die Herausforderung besteht darin, einen Weg zu finden, um Mindestdatengrößen zu übergeben, um dieselben Informationen zu übermitteln.

meine 2 Cent :)

Wenn Sie SQL Server 2005 verwenden, können Sie sich Benachrichtigungsdienste ansehen. Zugegeben, dies würde Sie in SQL 2005 einschließen, da die Benachrichtigungsdienste in SQL 2008 entfernt wurden. Es wurde so konzipiert, dass der SQL -Server Client -Anwendungen über Änderungen an der Datenbank benachrichtigt.

Wenn Sie etwas skalierbareres wünschen, können Sie ein paar Bit -Flags auf den Benutzerdatensatz setzen. Wenn eine Nachricht für den Benutzer kommt, ändern Sie das Bit für neue Nachrichten in true. Wenn Sie die Nachrichten lesen, ändern Sie sie auf 0, wenn sich die Leute ein- und ausschalten. Auf diese Weise lesen Sie ein sehr kleines Feld, das eine verdammt gute Chance hat, bereits im Cache zu sein.

Mach der Workflow das Stück bereit. Wenn es 1 ist, holen Sie die Nachrichten aus der Nachrichtentabelle. Wenn es 0 ist, mach nichts.

In ASP.net 4.0 können Sie Verwenden Sie das Beobachtermuster mit JavaScript -Objekten und Arrays IE: Ajax JSON ruft mit JQuery und oder Pagemethods an.

Sie müssen immer die Datenbank drücken, um Analysen darüber durchzuführen, ob Daten zurückgegeben werden müssen oder nicht. Der Trick besteht darin, diese Anrufe klein zu machen und bei Bedarf nur Daten zurückzugeben.

Es sind zwei verwandte Lösungen für SQL Server 2005 integriert und in SQL Server 2008 noch verfügbar:

1) Service Broker, was es Abonnenten ermöglicht, Lesevorgänge in Warteschlangen zu posten (der Empfangsbefehl mit Warten ..). In Ihrem Fall möchten Sie Ihre Nachricht über die Datenbank senden, indem Sie Service Broker -Dienste verwenden, die diese Warteschlangen ausstellen, die dann von den wartenden Clients abgeholt werden können. Es gibt keine Umfragen, die wartenden Kunden werden nur aktiviert, wenn eine Nachricht empfangen wird.

2) Abfragebrätigungen, die es einem Abonnenten ermöglichen, eine Abfrage zu definieren, und die Empfangsbenachrichtigungen, wenn sich der Datensatz aus der Ausführung dieser Abfrage ändern würde. Abfragebenachrichtigungen basieren auf dem Service Broker und sind etwas einfacher zu bedienen, können aber auch etwas weniger effizient sein. (Nicht, dass Abfragebriefungen und ihre Geschwister, Ereignisbenachrichtigungen häufig für Benachrichtigungsdienste (NS) verwechselt werden, was zu Besorgnis führt, da NS 2008 jedoch stillgelegt wird. Abfrage- und Ereignisbenachrichtigungen sind jedoch in SQL Server 2008 noch vollständig verfügbar und sogar verbessert).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top