Ottimizzazione delle prestazioni dell'adapter WCF di BizTalk Server
In questo argomento vengono fornite indicazioni per la selezione dell'adattatore WCF appropriato o del tipo di associazione e indicazioni per l'applicazione di varie opzioni di configurazione dell'adapter WCF.
Considerazioni sulla scelta dell'adattatore WCF da usare o sul tipo di associazione WCF-Custom/WCF-CustomIsolated da usare
Non usare la sicurezza a livello di messaggio se non è strettamente necessaria perché aumenta le dimensioni dei messaggi. Ciò a sua volta può ridurre al minimo la velocità effettiva complessiva della soluzione.
Quando si sceglie quale adattatore WCF usare o quale tipo di associazione WCF-Custom/WCF-CustomIsolated usare, considerare attentamente i requisiti dell'applicazione, ad esempio compatibilità, prestazioni, piattaforma di hosting, sicurezza e trasporti supportati. Le linee guida elencate di seguito sono applicabili a WCF in generale e non sono specifiche per BizTalk Server:
BasicHttpBinding deve essere usato se il servizio WCF deve supportare client legacy, ad esempio servizi Web o applicazioni .NET 1.1 che prevedono un servizio Web ASMX. Poiché BasicHttpBinding non implementa alcuna sicurezza per impostazione predefinita, se è necessaria la sicurezza dei messaggi o del trasporto, è necessario configurarla in modo esplicito su questa associazione. Usare BasicHttpBinding per esporre gli endpoint in grado di comunicare con i client e i servizi Web basati su ASMX e altri servizi conformi al profilo di base WS-I 1.1. Quando si configura la sicurezza del trasporto, l'impostazione predefinita BasicHttpBinding non usa credenziali come un servizio Web ASMX classico. BasicHttpBinding consente di ospitare il servizio WCF in IIS 7.5 o IIS 7.0.
WsHttpBinding deve essere usato se il servizio WCF verrà chiamato dai client WCF tramite Internet. WsHttpBinding è una scelta ottimale per gli scenari Internet in cui non è necessario supportare client legacy che prevedono un servizio Web ASMX e WsHttpBinding consente di ospitare il servizio WCF in IIS 7.5 o IIS 7.0. Se è necessario supportare i client legacy, è consigliabile usare invece BasicHttpBinding. WsHttpBinding deve essere usato quando è necessario esporre percorsi di ricezione WCF o adottare porte di trasmissione che supportano protocolli WS-* come WS-Security o WS-AtomicTransactions.
NetTcpBinding è un'ottima scelta se è necessario supportare i client all'interno della intranet. NetTcpBinding è una scelta ottimale per gli scenari Intranet se le prestazioni del trasporto sono importanti per l'utente e se è accettabile ospitare il servizio in un servizio Windows anziché in IIS. Usare questa associazione quando si vuole fornire un ambiente di associazione sicuro e affidabile per la comunicazione tra computer con estensione NET-to-.NET. Si noti che NetTcpBinding deve essere ospitato in un servizio Windows o in IIS 7.5/7.0.
NetNamedPipeBinding deve essere usato se è necessario supportare i client WCF nello stesso computer del servizio. Questa associazione fornisce un ambiente di associazione sicuro e affidabile per la comunicazione tra processi, same-computer. Usare questa associazione quando si vuole usare il protocollo NamedPipe. Si noti che NetNamedPipeBinding deve essere ospitato in un servizio Windows o in IIS 7.5/7.0.
NetMsmqBinding deve essere usato se è necessario supportare l'accodamento disconnesso. L'accodamento viene fornito usando Accodamento messaggi (noto anche come MSMQ) come trasporto, che consente il supporto per operazioni disconnesse, isolamento degli errori e livellamento del carico. È possibile usare NetMsmqBinding quando il client e il servizio non devono essere online contemporaneamente. È anche possibile gestire un numero qualsiasi di messaggi in arrivo usando il livellamento del carico. Accodamento messaggi supporta l'isolamento degli errori, in cui i messaggi possono avere esito negativo senza influire sull'elaborazione di altri messaggi. Si noti che NetMsmqBinding deve essere ospitato in un servizio Windows o in IIS 7.5/7.0.
WsDualHttpBinding deve essere usato se è necessario supportare un servizio duplex. Un servizio duplex è un servizio che usa modelli di messaggio duplex, consentendo così a un servizio di comunicare con il client tramite un callback. Si noti che WsDualHttpBinding deve essere ospitato in un servizio Windows o in IIS 7.5/7.0.
Confronto tra associazioni WCF
Le associazioni forniscono un meccanismo per la configurazione degli stack di canali. Un'associazione crea un processo per creare uno stack di canali usando un canale di trasporto, un codificatore di messaggi e un set di canali di protocollo. Windows Communication Foundation include numerose associazioni predefinite preconfigurate per soddisfare gli scenari di comunicazione più comuni.
Binding Class Name | Trasporto | Codifica dei messaggi | Modalità di sicurezza | Messaggistica affidabile | Flusso di transazione (disabilitato per impostazione predefinita) |
---|---|---|---|---|---|
BasicHttpBinding | HTTP | Testo | Nessuno | Non supportato | Non supportato |
WSHttpBinding | HTTP | Testo | Messaggio | Disabled | WS-AtomicTransactions |
NetTcpBinding | TCP | Binary | Trasporto | Disabled | OleTransactions |
NetNamedPipesBinding | Named Pipe | Binary | Trasporto | Non supportato | OleTransactions |
NetMsmqBinding | MSMQ | Binary | Messaggio | Non supportato | Non supportato |
Custombinding | Si decide | Si decide | Si decide | Si decide | Si decide |
È possibile selezionare un'associazione specifica in base alle esigenze di comunicazione. Ad esempio:
BasicHttpBinding è progettato per l'interoperabilità con semplici servizi Web. BasicHttpBinding usa HTTP per il trasporto e il testo per la codifica dei messaggi.
WSHttpBinding è progettato per l'interoperabilità con servizi Web più avanzati che potrebbero sfruttare diversi protocolli WS-*. WSHttpBinding usa anche HTTP per il trasporto e il testo per la codifica dei messaggi.
NetTcpBinding e NetNamedPipeBinding sono progettati per una comunicazione efficiente ed efficiente con altre applicazioni WCF tra computer o nello stesso computer.
Se è necessaria la massima flessibilità usando uno o più canali di protocollo personalizzati in fase di esecuzione, è possibile usare CustomBinding che consente di decidere quali elementi di associazione compongono l'associazione.
Nota
Le associazioni hanno caratteristiche diverse in termini di tempo di risposta e velocità effettiva. Pertanto, quando possibile, il consiglio generale per aumentare le prestazioni consiste nell'usare NetTcpBindind e NetNamesPipeBinding.
Usare il trasporto TCP e la codifica dei messaggi binari per ottimizzare la velocità effettiva dell'adapter WCF e ridurre al minimo la latenza dell'adapter WCF
Usare l'adattatore WCF-NetTcp quando possibile per ottimizzare la velocità effettiva. L'adattatore WCF-NetTcp usa il protocollo di trasporto TCP/IP e la codifica dei messaggi binari, che insieme offrono prestazioni migliori rispetto ad altre schede WCF-*.
In alternativa, è possibile configurare il WCF-Custom (o WCF-CustomIsolated adapter per i percorsi di ricezione) con un tipo di associazione customBinding . Aggiungere quindi l'estensione di associazione binaryMessageEncoding per implementare la codifica dei messaggi binari e l'estensione di associazione tcpTransport per implementare TCP/IP come protocollo di trasporto dei messaggi. Questo approccio è molto flessibile perché consente di selezionare e configurare solo gli elementi di associazione necessari e di creare canali personalizzati per estendere il comportamento predefinito del motore di messaggistica BizTalk. Se si implementa l'adattatore WCF-Custom con il tipo di associazione customBinding , specificare questi valori per i parametri di configurazione dell'estensione di associazione per ottimizzare la velocità effettiva e ridurre al minimo la latenza.
Valori di configurazione della porta di trasmissione:
Impostazione | Valore predefinito | Valore consigliato |
---|---|---|
TcpTransportBindingElement.ConnectionPoolSettings.maxOutboundConnectionsPerEndpoint : ottiene o imposta il numero massimo di connessioni in uscita per ogni endpoint memorizzato nella cache nel pool di connessioni. Limita il numero di connessioni memorizzato nella cache per ogni endpoint remoto univoco. Se questo valore viene superato con connessioni client più attive, il servizio potrebbe non rispondere al client e questo valore deve essere modificato in modo da contenere il numero massimo di connessioni previste memorizzate nella cache per ogni endpoint remoto univoco. Per altre informazioni su questa proprietà, vedere Proprietà TcpConnectionPoolSettings.MaxOutboundConnectionsPerEndpoint (https://go.microsoft.com/fwlink/?LinkId=157737) su MSDN. | 10 | Prova >= 20 |
Valori di configurazione della porta di ricezione:
Impostazione | Valore predefinito per .NET Framework 4 | Valore consigliato per .NET Framework 4 | Valore predefinito per .NET Framework 3.5 | Valore consigliato per .NET Framework 3.5 |
---|---|---|---|---|
TcpTransportBindingElement.MaxPendingAccepts : ottiene o imposta il numero massimo di operazioni di accettazione asincrone in sospeso disponibili per l'elaborazione delle connessioni in ingresso al servizio. Per gli scenari con livelli elevati di iniziazioni di connessione simultanee, questo valore può essere inadeguato e deve essere modificato insieme alla proprietà MaxPendingConnections per gestire livelli superiori di tentativi di connessione client simultanei. Non dovrebbe essere necessario impostare questa proprietà su un valore superiore al numero di processori presenti nel computer che ospita il servizio. Per altre informazioni su questa proprietà, vedere ConnectionOrientedTransportBindingElement.MaxPendingAccepts Property () suhttps://go.microsoft.com/fwlink/?LinkId=157738 MSDN. | 1 | 2*ProcessorCount | 1 | Prova >= 20 |
TcpTransportBindingElement.MaxPendingConnections : ottiene o imposta il numero massimo di connessioni in attesa di invio nel servizio. Questa proprietà limita il numero di connessioni client simultanee in attesa di invio. Se questo valore è troppo basso, i tentativi della connessione client possono essere rifiutati dal servizio. Se è troppo elevato, il servizio può risultare lento o non rispondere ai client durante i periodi di carico eccessivo. Questa proprietà deve essere impostata su un valore che consenta al servizio di essere eseguito alla capacità totale e non su un valore superiore. Quando un livello superiore nello stack chiama AcceptDispatch, tale connessione viene rimossa dalla coda di connessioni in attesa di invio. Per altre informazioni su questa proprietà, vedere Proprietà ConnectionOrientedTransportBindingElement.MaxPendingConnections (https://go.microsoft.com/fwlink/?LinkId=157735) su MSDN. | 10 | 16*ProcessorCount | 10 | Prova >= 20 |
TcpTransportBindingElement.ListenBacklog : ottiene o imposta il numero massimo di richieste di connessione in coda che possono essere in sospeso. ListenBacklog è una proprietà a livello di socket che descrive il numero di richieste di accettazione in sospeso da accodare. Assicurarsi che la coda del socket sottostante non venga superata dal numero massimo di connessioni simultanee. Per altre informazioni su questa proprietà, vedere Proprietà TcpTransportBindingElement.ListenBacklog (https://go.microsoft.com/fwlink/?LinkId=157734) su MSDN. | 10 | 16*ProcessorCount | 10 | Prova >= 20 |
Aggiungere il comportamento del servizio ServiceThrottlingBehavior a un WCF-Custom o WCF-CustomIsolated Indirizzo di ricezione e usare le impostazioni seguenti:
Nota
Prima che sia possibile modificare gli elementi del comportamento del servizio ServiceThrottlingBehavior, è necessario innanzitutto aggiungere l'estensione del comportamento serviceThrottling alla scheda Comportamenti della finestra di dialogo Proprietà trasporto WCF-Custom* . Per aggiungere serviceThrottling all'elenco Comportamenti, selezionare la scheda Comportamenti della finestra di dialogo Proprietà trasporto WCF-Custom* , fare clic con il pulsante destro del mouse su ServiceBehavior in Comportamento, scegliere Aggiungi estensione, selezionare serviceThrottling e quindi fare clic su OK. Fare quindi clic per selezionare le proprietà disponibili in ServiceThrottlingElement e modificare il valore per le proprietà in base alle esigenze.
Impostazione | Valore predefinito per .NET Framework 4 | Valore consigliato per .NET Framework 4 | Valore predefinito per .NET Framework 3.5 | Valore consigliato per .Net Framework 3.5 |
---|---|---|---|---|
ServiceThrottlingBehavior.MaxConcurrentCalls : ottiene o imposta un valore che specifica il numero massimo di messaggi elaborati attivamente in un ServiceHost. La proprietà MaxConcurrentCalls specifica il numero massimo di messaggi elaborati attivamente in un oggetto ServiceHost . Ogni canale può avere un messaggio in sospeso che non viene conteggiato rispetto al valore di MaxConcurrentCalls fino a quando WCF non inizia a elaborarlo. Per altre informazioni su questa proprietà, vedere ServiceThrottlingBehavior.MaxConcurrentCalls (https://go.microsoft.com/fwlink/?LinkId=157838) su MSDN. Il valore predefinito per la proprietà WCF-Custom BizTalk e WCF-CustomIsolated receive adapters MaxConcurrentCalls è 16 per CPU. Nota: BizTalk Server schede di ricezione WCF diverse dalla WCF-Custom e WCF-CustomIsolated adapter espongono una proprietà Chiamate simultanee massime nella scheda Binding della finestra di dialogo Proprietà trasporto WCF-* per configurare questo comportamento. Il valore predefinito del comportamento Numero massimo di chiamate simultanee è 200. | 16*ProcessorCount | 16*ProcessorCount | - 16 per gli adapter di ricezione di WCF-Custom BizTalk e WCF-CustomIsolated. - 200 per gli altri adattatori di ricezione WCF. |
- Provare >= 200 per gli adattatori di ricezione WCF-Custom e WCF-CustomIsolated. - Provare > 200 per la proprietà Numero massimo di chiamate simultanee nella scheda Binding della finestra di dialogo Proprietà trasporto WCF-* per BizTalk Server adapter di ricezione WCF diversi dall'adapter di ricezione WCF-Custom e WCF-CustomIsolated. |
ServiceThrottlingBehavior.maxConcurrentInstances : ottiene o imposta un valore che specifica il numero massimo di oggetti InstanceContext nel servizio che possono essere eseguiti contemporaneamente. La proprietà MaxConcurrentInstances specifica il numero massimo di oggetti InstanceContext nel servizio. È importante tenere presente la relazione tra la proprietà MaxConcurrentInstances e la proprietà InstanceContextMode . Se InstanceContextMode è PerSession, il valore risultante corrisponde al numero totale di sessioni. Se InstanceContextMode è PerCall, il valore risultante corrisponde al numero di chiamate simultanee. Se un messaggio arriva mentre esiste già il numero massimo di oggetti InstanceContext , il messaggio viene mantenuto fino alla chiusura di un oggetto InstanceContext . Per altre informazioni su questa proprietà, vedere La proprietà ServiceThrottlingBehavior.MaxConcurrentInstances (https://go.microsoft.com/fwlink/?LinkId=157897) su MSDN. Il valore predefinito per la proprietà WCF-Custom e WCF-CustomIsolated scheda di ricezione MaxConcurrentInstances è 116 per CPU. Nota: Poiché i percorsi di ricezione WCF vengono implementati come istanze della classe BizTalkServiceInstance contenuta nell'assembly Microsoft.BizTalk.Adapter.Wcf.Runtime.dll e poiché questa classe è contrassegnata come ServiceBehavior(InstanceContextMode=InstanceContextMode.Single, ConcurrencyMode=ConcurrencyMode.Multiple). tutte le richieste in ingresso vengono gestite dallo stesso oggetto singleton e questo parametro viene ignorato. Pertanto, l'impostazione della proprietà maxConcurrentInstances in determinate posizioni di ricezione WCF-Custom non ha alcun effetto, poiché il numero di istanze attive è sempre uguale a 1. | 116*ProcessorCount | 116*ProcessorCount | 26 | Prova >= 200 |
ServiceThrottlingBehavior.MaxConcurrentSessions : la proprietà MaxConcurrentSessions ottiene o imposta il numero massimo di sessioni che un oggetto ServiceHost può accettare contemporaneamente. È importante comprendere che le sessioni in questo caso non sono limitate solo ai canali che supportano sessioni affidabili. Ogni oggetto listener può avere una sessione del canale in sospeso che non viene conteggiato rispetto al valore di MaxConcurrentSessions fino a quando WCF non accetta la sessione del canale e inizia a elaborare i messaggi della sessione del canale. Questa proprietà è molto utile negli scenari che utilizzano le sessioni. Quando questa proprietà viene impostata su un valore inferiore al numero di thread client, è possibile che le richieste di più client possano venire accodate nella stessa connessione del socket. Le richieste dal client che non ha creato una sessione con il servizio verranno bloccate. Rimarranno bloccati fino a quando il servizio chiude la sessione con gli altri client, se il numero di sessioni aperte nel servizio ha raggiunto il valore specificato per MaxConcurrentSessions. Le richieste client non gestite vengono quindi timeout e il servizio chiude la sessione. Per evitare questa situazione, prendere in considerazione l'esecuzione dei thread client da domini applicazione diversi in modo che i messaggi di richiesta vengano accettati da connessioni socket diverse. Per altre informazioni su questa proprietà, vedere Proprietà ServiceThrottlingBehavior.MaxConcurrentSessions (https://go.microsoft.com/fwlink/?LinkId=157864) su MSDN. | 100*ProcessorCount | 100*ProcessorCount | 10 | Prova >= 200 |
Quando si modificano le impostazioni di configurazione delle porte, applicare le modifiche in modo metodico; modificare ogni parametro singolarmente e testare gli effetti della modifica sulle prestazioni e sulla stabilità complessiva. Come sempre, il valore appropriato da applicare dipende dallo scenario specifico: se un valore è impostato su un valore troppo basso, la scalabilità può essere ridotta; mentre se un valore è impostato su un valore troppo elevato, il requisito dell'applicazione può superare la capacità delle risorse fisiche nel computer. Inoltre, poiché queste proprietà sono correlate, devono essere impostate in modo coerente e coerente. Per altre informazioni sull'uso di ServiceThrottlingBehavior per controllare le prestazioni del servizio WCF, vedere Uso di ServiceThrottlingBehavior per controllare le prestazioni del servizio WCF (https://go.microsoft.com/fwlink/?LinkId=157908) su MSDN.