Pregunta

Tengo que conseguir el rendimiento máximo rendimiento en mi servicio WCF. En una de mis pruebas el servicio de abajo tiene sólo 50k elementos de datos por minuto utilizando NetTcpBinding. Sería un desconectada vinculante como NetMsmqBinding mejorar este rendimiento?

Servicio y cliente utiliza WCF y se ejecutan en la misma 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();
        }
    }
}

El código anterior es una versión simplificada del código real.

¿Fue útil?

Solución

es Msmq probable que sea más lento que TcpBinding.

Si se está ejecutando en la misma máquina, que sin duda debe usar NetNamedPipeBinding (IPC), que es el más rápido de unión disponibles.

También debe comprobar cómo se está serializar sus datos. Búfer de protocolo de serialización es mucho más rápido (y más ligera) de la morosidad del WCF serialización binaria (pero requiere un poco de ajustes).

Otros consejos

más rápido para una sola llamada de forma aislada, o de una inundación de miles de llamadas?

NetMsmq utiliza MSMQ cola de mensajes - usted está poniendo su mensaje en una cola manejado por MSMQ, y el servicio lo obtendrá a partir de esa cola con el tiempo y trabajar en él. Usted no recibe una respuesta instantánea, los mensajes son de un solo sentido.

NetTcp por el contrario es como http - sólo es más rápido. Se envía una solicitud al servicio y obtener una respuesta de vuelta (si todo va bien) de inmediato. Sin colas de mensajes de por sí complicado, sus mensajes son de petición / respuesta.

Así que no creo que se pueda comparar las dos fijaciones, de verdad. Sirven totalmente diferentes propósitos:

  • si quieres por ejemplo, buscar un código postal y volver a la longitud / latitud de ese lugar, que debe de un mecanismo de petición / respuesta -> usar netTcp

  • Si desea depositar solicitudes de ejemplo imprimir un documento, o reorganizar una base de datos, o algo por el estilo - algo que necesita ser atendido a tiempo, pero usted no espera una respuesta de vuelta de inmediato (pero que más tarde puede comprobar si el mensaje ha sido manejada adecuadamente), a continuación, utilizar un sistema de colas de mensajes

La esperanza que hace las cosas un poco más claro - No creo que estos dos realmente están orientados hacia el mismo conjunto de operaciones, por lo que muy probablemente nunca tendrá que elegir entre los dos directamente:)

Si el servicio y el cliente se ejecutan en la misma máquina que evitarían la red por completo a favor de un mecanismo IPC tales como canalizaciones con nombre. El tráfico de red incurre en un montón de gastos que se pueden evitar mediante el uso de un mecanismo IPC.

¿Tiene razones para creer que el transporte es lo que se desacelera el ritmo de transacciones? Lo que ha perfilado dicho? En este momento este servicio está dispuesto a ser un solo subproceso, y también tiene varias llamadas a "conseguir" bloquear el uno al otro.

¿Cómo se llama este servicio / usa? ¿Sería de ayuda para que sea multi-hilo? ¿Qué pasa con el uso de una cerradura más sofisticado como un ReaderWriterLock que permite que múltiples llamadas para llegar a ocurrir al mismo tiempo, pero aún así bloquear en "Añadir"?

Editar:? Sé que esto es una situación simplificada, pero lo haría el servicio real se beneficiarían de las mismas consideraciones

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top