Domanda

Sto scrivendo un'applicazione a livello aziendale che utilizza i servizi WCF e NetTCP. Ho scelto NetTCP inizialmente per curiosità, ma in seguito ho deciso che fosse l'opzione migliore per me, dato che posso avere servizi chiamati che impiegano più di 5 ore per restituire i risultati a causa della quantità di dati crunching coinvolti.

Il modo in cui attualmente spawn i miei servizi è un processo in più fasi. Ho un pezzo di configurazione (usando System.Configuration) che specifica alcune delle cose predefinite (numero di porta, nome del server per i client che si connettono, se abilitare HTTP così come NetTCP, ecc.) E che ha una raccolta di & Quot ; servizi quot &; sotto di esso. Ad esempio, ecco come appare uno di base:

<serverConfiguration tcpListenerPortNumber="60000" httpGetEnabled="true" httpListenerPortNumber="6000" serverName="localhost" retryEnabled="true" retryInterval="5" maxRetryAttempts="3">
    <services>
        <add virtualDirectory="Service1" applicationName="Service1" assembly="SampleService" type="SampleService.Service1" />            
    </services>
</serverConfiguration>

Fondamentalmente quello che sta succedendo qui è che il mio servizio Windows prende il via e guarda tutto in < services / > raccolta e genera un thread per servizio per velocizzare i tempi di avvio e ogni thread contiene un AppDomain in cui il servizio è realmente attivo, quindi se un servizio presenta un qualche tipo di errore non arresta il sistema.

Il " problema " Mi sto imbattendo in questa applicazione che ospita circa 20 servizi e ci vogliono ben 15-20 secondi perché tutti i servizi siano attivi e funzionanti. Ho fatto il threading e i pezzi AppDomain per arrivare a quel valore (impiegava più di un minuto perché ogni servizio veniva aperto in sequenza) ma mi sembra ancora che questo potesse effettivamente andare molto più veloce.

Qualcuno ha qualche suggerimento? Google Bing ha una miriade di esempi per l'hosting di un servizio, ma non sto trovando molto là fuori per le applicazioni del mondo reale (purtroppo " Hello World " semplicemente non lo è attraente per gli utenti finali). Se al momento stai ospitando più servizi tramite un servizio Windows e NetTCP, come stai?

È stato utile?

Soluzione

Alla fine l'ho capito e non aveva nulla a che fare con WCF o con i miei pezzi di configurazione. Durante la creazione di AppDomain ho rubato il codice di un altro progetto di dimensioni molto inferiori e ho scoperto che la sezione che creava AppDomain utilizzava l'opzione SingleDomain. Passandolo a MultiDomain le cose sono andate a & GT; 4 secondi per il carico totale e l'utilizzo della memoria sono scesi a ~ 40 MB da ~ 150 MB.

Grazie per l'assistenza, almeno mi ha fatto rivedere il codice!

Altri suggerimenti

Ho tre suggerimenti:

In primo luogo, se una chiamata può richiedere più di 5 ore, prenderei in considerazione un'architettura di stile di accodamento / richiamata.

Valuta la possibilità di suddividere i tuoi servizi in 20 servizi di Windows, in cui ciascun servizio viene eseguito nei propri servizi di Windows. Ciò aggiunge complessità e aumenta l'utilizzo della memoria, ma un singolo servizio potrebbe essere disponibile più velocemente.

Infine, controlla il codice che si trova nel costruttore del servizio, per l'eventuale codice non necessario.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top