2012-04-04 7 views
2

Zunächst einmal: Wir haben eine funktionierende Lösung für das Problem, das ich beschreiben werde, aber es fühlt sich einfach nicht richtig an.WCF Best Practice für Client/Server mit Benachrichtigungen

Wir haben eine Anwendung mit einem Anwendungsserver und etwa 30 - 100 Clients. Die Skalierung des Servers ist kein Problem. Am wichtigsten sind die Benachrichtigungen vom Server an die Clients, aber natürlich gibt es auch Service-Methoden, die vom Client zum Server aufgerufen werden.

Jetzt erstellen wir einen Servicevertrag mit einem Rückrufkanal, registrieren den Client im Dienst (d. H. Der Dienst enthält eine Liste aktiver Rückrufkanäle) und senden Benachrichtigungen über diese Rückrufkanäle.

Probleme mussten wir navigieren waren um:

  1. Timeouts der Verbindung - der Dienst enthält nun einige Keep-Alive-Methode, die
  2. von den Kunden über jede Minute pinged wird
  3. umklemmen Client nach Server- oder Netzwerkausfall - das ist der Hauptpunkt, um den ich besorgt bin. Im Moment haben wir ein lang laufendes Client-Objekt (Service-Referenz, geerbt von DuplexClientBase), um den Service und das Callback-Objekt aufzurufen, um empfangene Benachrichtigungen zu verarbeiten. Unter client.Faulted versuchen wir, den Client und das Callback-Objekt durch einen neu erstellten Client zu ersetzen, bis der Server wieder erreichbar ist. Dieser Ansatz beinhaltet eine ziemlich seltsame Ausnahmebehandlung ...

Frage: Wäre es besser, einen WCF-Dienst auf jedem Client zu starten und den Endpunkt eines jeden Client auf dem Server registrieren? Gibt es eine bessere Lösung für die beiden beschriebenen Probleme?

Edit: Der Punkt ist: Fehle ich etwas? - Ich glaube, dass die beschriebene Architektur ziemlich üblich sein sollte und ich suche nach dem "Standard", dem besten Weg, dies zu tun. Gibt es nicht eine Probe für diese Art von Setup?

Antwort

3

Wenn Ihre Probleme in der Verfügbarkeit liegen (in diesem Fall die Verfügbarkeit von Service -> Consumer und Consumer -> Service), sollten Sie vielleicht einen fehlertoleranteren Transport wie MSMQ in Betracht ziehen (vielleicht mit netMsmqBinding).

Sie können die komplexe WCF-Rückrufinfrastruktur durch einen einfachen, dauerhaften Abonnementspeicher ersetzen.

Wenn Sie einen "Rückruf" senden müssen, rufen Sie einfach die Liste der Kunden aus Ihrem Abonnementspeicher ab und senden eine Nachricht an jeden.

Verbindungen würden niemals eine Zeitüberschreitung verursachen, da Sie keine zustandsbehaftete Verbindung haben würden.

Re-Verbindungen von Verbrauchern zu Service nach Netzwerkausfällen ist auch gelöst - in der Tat kleine Netzwerkausfälle wäre nicht einmal bemerkbar.

Entschuldigung, dies beantwortet nicht direkt Ihre ursprüngliche Frage, und schätzen, dass die Überarbeitung auf dieser Skala nicht im Rahmen Ihrer Anforderung liegt.