Pergunta

Eu tenho que obter o máximo rendimento desempenho no meu serviço WCF. Em um dos meus testes o serviço abaixo tem apenas 50k itens de dados por minuto utilizando NetTcpBinding. Será que um desconectado ligação como NetMsmqBinding melhorar esta performance?

Serviço e cliente usa WCF e correr na mesma máquina.

[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();
        }
    }
}

O código acima é uma versão simplificada do código real.

Foi útil?

Solução

Msmq é provável que seja mais lenta do que TcpBinding.

Se você estiver executando na mesma máquina, você definitivamente deve usar NetNamedPipeBinding (IPC), que é o mais rápido de ligação disponível.

Você também deve verificar como você está serialização seus dados. Buffer de protocolo de serialização é muito mais rápido (e mais magro) do WCF padrão de serialização binária (mas requer um pouco de ajustes).

Outras dicas

Mais rápido para uma única chamada em isolamento, ou para uma inundação de milhares de chamadas?

NetMsmq usa MSMQ Message Queuing - você está colocando a sua mensagem em uma fila tratado por MSMQ, eo serviço vai buscá-la a partir dessa fila, eventualmente, e trabalhar sobre ela. Você não obter um feedback instantâneo, as mensagens são one-way somente.

NetTcp por outro lado é como http - só que mais rápido. Você envia uma solicitação para o serviço e receber de volta uma resposta (se tudo correr bem) imediatamente. Nenhuma mensagem de filas per se envolvido, suas mensagens são pedido / resposta.

Então, eu não acho que você pode comparar as duas ligações, realmente. Eles servem a propósitos completamente diferentes:

  • Se você quiser, por exemplo, procurar um código postal e voltar a latitude / longitude desse local, você definitivamente quer um mecanismo de solicitação / resposta -> usar NetTcp

  • Se você deseja depositar pedidos para por exemplo imprimir um documento, ou reorganizar um banco de dados, ou algo dessa natureza - algo que precisa ser cuidado para, eventualmente, mas você não espera de volta uma resposta de imediato (mas mais tarde você pode verificar se a mensagem foi tratada adequadamente), em seguida, usar um sistema de enfileiramento de mensagens

Hope que torna as coisas um pouco mais claro - eu não acho que estes dois realmente são voltadas para o mesmo conjunto de operações, para que você provavelmente nunca vai ter que escolher entre os dois diretamente:)

Se o serviço eo cliente executar na mesma máquina gostaria de evitar a rede, em favor de um mecanismo IPC, como pipes nomeados. O tráfego de rede incorre em uma grande quantidade de sobrecarga que pode ser evitado pelo uso de um mecanismo de IPC.

Você tem razão para acreditar que o transporte é o que está a abrandar a taxa de transação? O que Profiling lhe disse? Neste momento este serviço está definido para ser único segmento, e também tem várias chamadas para "Get" bloquear uns aos outros.

Como é que este serviço chamado / utilizado? Isso ajudaria a torná-lo multi-threaded? Que tal usar um bloqueio mais sofisticados como um ReaderWriterLock que permite que várias chamadas para obter a ocorrer ao mesmo tempo, mas ainda bloquear em "Adicionar"?

Edit:? Eu sei que esta é uma situação simplificada, mas seria o benifit serviço real das mesmas considerações

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top