2012-02-03 17 views
8

Non posso negare il vantaggio in termini di prestazioni di una chiamata asincrona duplex, ma alcune cose mi fanno sentire diffidente.Best practice per client Duplex WCF

La mia preoccupazione è che dato un oggetto client istanziato, WCF sarà in grado di dire quale particolare istanza del servizio client riceverà l'argomento di callback?

Qualcuno può dirmi se questa è una buona idea? Se no, perché no?

new DuplexChannelFactory<IServerWithCallback>(
    new ClientService(), 
    new NetTcpBinding(), 
    new EndpointAddress("net.tcp://localhost:1234/"+Guid.NewGuid())) 
  1. Se il percorso virtuale di cui sopra è riservato come può essere scartata. Voglio che la durata del servizio clienti sia piuttosto breve. IE fare una richiesta e ricevere una risposta e quando fatto ricevere, ucciderlo. Quanto è pessima la penalizzazione delle prestazioni nel rendere breve il servizio al cliente, piuttosto che metterlo in comune e mantenerlo in vita più a lungo.

    L'idea è di evitare il problema del timeout. Al termine, ricevere, inviare, smaltire il più presto possibile. Per convenzione, non è possibile trasferire i servizi client in giro. Se hai bisogno di informazioni, creane una nuova, semplice - proprio come EF/L2S ecc.

  2. Dall'interno del servizio WCF stesso, come posso interrompere la sessione con il client. vale a dire. Non voglio che il client finisca la sessione - so che posso decorare la mia operazione di conseguenza, ma voglio che il servizio si interrompa automaticamente quando vengono soddisfatte determinate condizioni.

  3. Posso attaccare la porta e inoltrare di conseguenza per risolvere qualsiasi problema del firewall, ma ciò di cui sono preoccupato è se il client si sieda dietro un load balancer. Come fa il servizio a sapere quale particolare server chiamare?

risposta

7

Penso che alla fine i servizi di duplex siano semplicemente un'altra architettura fallita di Microsoft. Questa è una di quelle cose che sembravano davvero buone sulla carta, ma che cadono a pezzi a un esame più attento.

sono presenti troppi punti deboli:

1) Il ricorso a sessione per stabilire chi ascolta client dal server.Questa è la sessione di informazioni è memorizzata in memoria. Quindi il server stesso non può essere bilanciato. O se fosse bilanciato il carico, è necessario attivare l'affinità ip, ma ora se uno dei server è bombardato non è sufficiente aggiungerne un altro e aspettarsi che tutte queste sessioni migrino automagicamente sul nuovo server.

2) Per ciascun client che si trova dietro un router/firewall/bilanciamento del carico, è necessario creare un nuovo endpoint con porta specifica. In caso contrario, il router non sarà in grado di indirizzare correttamente i messaggi di callback al client appropriato. Un'alternativa è avere un router che consente alla programmazione personalizzata di reindirizzare il percorso specifico verso un server particolare. Di nuovo un alto ordine. O un altro modo è per il client con il callback di ospitare il proprio database e condividere i dati tramite un database < - Potrebbe funzionare in alcune situazioni in cui i costi di licenza non sono un problema ... ma introduce molta complessità e così oneroso il cliente più mischia insieme il livello di applicazione e di servizi (che potrebbe essere accettabile in alcune situazioni eccezionali, ma non in cima all'enorme costo di installazione)

3) Tutto questo in pratica dice che il duplex è praticamente inutile. Se hai bisogno di richiamare allora farai bene a configurare un host wcf sul client. Sarà più semplice e molto più scalabile. Inoltre c'è meno accoppiamento tra client e server.

La migliore soluzione duplex per l'architettura scalabile è alla fine non usarne uno.

+2

Questa risposta è vera per NetTcpBinding o semplicemente per il collegamento Http doppia? – Yaniv

3
  1. Dipenderà da quanto breve è necessario i clienti new'd e per quanto tempo dureranno. Il pooling non sarebbe un'opzione se hai bisogno di un nuovo client ogni volta, ma se i client continuano a fare la stessa cosa, perché non hanno un pool di quelli in attesa di essere usati, se falliscono ricreare di nuovo lo stesso client.

  2. In realtà in uno scenario di callback se il servizio sta richiamando il client (in realtà chiamando una funzione sul client) per passare le informazioni, il servizio è ora il client e viceversa. Puoi avere il servizio che sta effettuando la richiamata. Chiudi() la connessione ma sarà aperta fino a quando il GC potrà disporne, dalla mia esperienza che può richiedere più tempo del previsto. Quindi, in breve, il cliente dovrebbe essere responsabile (il client è quello che effettua la chiamata a qualcosa) per chiudersi, o disconnettersi, il servizio dovrebbe solo restituire le risposte o prendere i dati da un client.

  3. Nelle richiamate duplex, il servizio che ora richiama il client ottiene l'indirizzo del cliente astratto dietro il duplexchannelfactory. Se il servizio non può richiamare il client, non penso ci sia molto che possa essere fatto, dovresti assicurarti che la porta che i tuoi clienti chiamano per il servizio sia aperta a ricevere callback che indovinerei.