Domanda

Devo ottenere le prestazioni throughput massimo nel mio servizio WCF. In uno dei miei test del servizio al di sotto ha solo 50k elementi di dati al minuto, utilizzando NetTcpBinding. Sarebbe un scollegata vincolante come NetMsmqBinding migliorare questa performance?

Servizio e client utilizza WCF e correre nella stessa macchina.

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
    ConcurrencyMode = ConcurrencyMode.Multiple)]
public class Storage : IStorage
{
    protected List<int> _data = new List<int>();

    public void Insert(int[] data)
    {
        lock (_data)
        {
            _data.AddRange(data);
        }
    }

    public int[] Get()
    {
        lock (_data)
        {
            return _data.ToArray();
        }
    }
}

Il codice di cui sopra è una versione semplificata del codice vero e proprio.

È stato utile?

Soluzione

Msmq è probabile che sia più lento di TcpBinding.

Se si sta eseguendo sulla stessa macchina, è sicuramente necessario utilizzare NetNamedPipeBinding (IPC), che è il più veloce di legame disponibili.

Si dovrebbe anche controllare come si sta serializzazione dei dati. Protocollo Buffer serializzazione è molto più veloce (e più snella) che di default WCF serializzazione binaria (ma richiede un po 'di tweaking).

Altri suggerimenti

Più veloce per una singola chiamata in isolamento, o per un flusso di migliaia di chiamate?

NetMsmq utilizza MSMQ Message Queuing - si sta mettendo il tuo messaggio in una coda gestita da MSMQ, e il servizio lo otterrà da quella coda alla fine e lavorare su di esso. Non si ottiene un feedback immediato, i messaggi sono solo a senso unico.

NetTcp d'altra parte è come http - solo più veloce. Si invia una richiesta al servizio e ricevere una risposta (se tutto va bene) subito. Nessun messaggio in coda per sé coinvolti, i messaggi sono di richiesta / risposta.

Quindi non credo che è possibile confrontare i due attacchi, davvero. Servono scopi totalmente diversi:

  • se si vuole per esempio Ricerca di un codice di avviamento postale e tornare alla longitudine / latitudine di quella posizione, è sicuramente desidera un meccanismo di richiesta / risposta -> utilizzare netTcp

  • se si vuole depositare le richieste di esempio stampare un documento, o di riorganizzare un database, o qualcosa del genere - qualcosa che deve essere teso a alla fine, ma non ci si aspetta di nuovo una risposta subito (ma in seguito sarà possibile verificare se il messaggio è stato gestito correttamente), quindi utilizzare un sistema di accodamento messaggi

La speranza che rende le cose un po 'più chiaro - non credo che queste due realtà sono orientati verso lo stesso insieme di operazioni, in modo molto probabilmente non potrà mai dover scegliere tra i due direttamente:)

Se il servizio e il client eseguito sulla stessa macchina eviterei la rete del tutto a favore di un meccanismo IPC, come named pipe. Il traffico di rete comporta un sacco di spese generali che può essere evitato utilizzando un meccanismo di IPC.

Hai ragione di credere che il trasporto è ciò che sta rallentando il tasso di transazione? Che cosa ha detto profiling? In questo momento questo servizio è impostato per essere a thread singolo, e ha anche più chiamate a "Get" bloccare a vicenda.

Come è questo servizio chiamato / usato? Sarebbe utile per rendere più multi-threaded? Cosa succede ad usare un blocco più sofisticato come un ReaderWriterLock, che consente a più chiamate per ottenere a verificarsi, allo stesso tempo, ma ancora bloccare su "Add"?

Modifica:? So che questa è una situazione semplificata, ma sarebbe il benifit servizio effettivo dalle stesse considerazioni

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