6

Estoy utilizando el bus de servicio con nettcprelaybinding. Uno de los lados es el servidor OnPremise que tiene una conexión constante con el bus de servicio. En el otro extremo se encuentra una función web de Azure que responde a las solicitudes web entrantes abriendo el bus de servicio apropiado y obteniendo información del servidor.rendimiento de retransmisión de Servicebus de Azure

Mi preocupación es el rendimiento de la creación del canal. Lleva unos segundos establecer una nueva conexión con el servidor predeterminado a través del bus de servicio. El almacenamiento en caché de mi ChannelFactory no parece ayudar mucho. El rendimiento de la transferencia después de que el canal está abierto es muy bueno.

Cualquier sugerencia sobre cómo mejorar el rendimiento. La información del almacenamiento en caché en Azure solo se puede hacer en cierta medida. Necesito conectarme al servidor predeterminado.

¿Puedo de alguna manera establecer un grupo de conexión para el bus de servicio?

En más, hay una serie de diferentes servidores predeterminados por lo que no es solo una conexión para mantenerse con vida.

Respuesta

2

Debe poder agrupar las conexiones, pero los equilibradores de carga Azure serán terminate any open connection that sits idle for more then 60 seconds. Por lo tanto, si almacena la conexión en caché durante más tiempo que entre llamadas, deberá implementar algún tipo de patrón de latido para mantener viva la conexión.

Otra opción que quizás desee considerar es Azure Connect. Esto le permite crear una conexión ipsec punto a punto desde recursos alojados en la nube a un servidor local. Requiere que se instale un cliente en las cajas locales que también desea conectar, pero algunos lo han estado utilizando para establecer una conexión de puerta de enlace simple a un servicio de proxy en las instalaciones.

+0

Gracias por los buenos comentarios. No sabía sobre el límite de 60 segundos. Si quiero agrupar las conexiones. ¿Cuál es una buena manera de hacer eso? Encontré algo de información siguiendo su enlace (http://code.msdn.microsoft.com/WCF-Azure-NetTCP-Keep-Alive-09f50fd9). Pero, ¿es esta la buena solución en un entorno Azure de múltiples instancias? Si un canal está abierto en una instancia y el siguiente cliente se ejecuta en una instancia diferente? ¿O el equilibrador de carga se asegura de que se use la misma instancia? – user1284390

+0

Según tengo entendido, cada instancia obtiene su propia conexión. Y como los mantienen abiertos, debes tener en cuenta los límites máximos de conexión (2000 o algo así, creo) que están permitidos en un solo espacio de nombres. Si es bueno o malo hacer esto, creo que depende de sus necesidades de rendimiento y escalabilidad. – BrentDaCodeMonkey

+0

Esto es un poco antiguo, pero solo para su información, parece que la mayoría de los LB de Azure ahora están basados ​​en software, y tienen un tiempo de espera predeterminado de 4 minutos (no 1 minuto con los anteriores LB basados ​​en hardware), y esto ahora es configurable. Sin embargo, no está claro para mí, en este momento, si la biblioteca cliente de Service Bus está implementando TCP KeepAlive automáticamente, y por lo tanto un tiempo de espera de LB no es realmente un problema: https://azure.microsoft.com/en-us/blog/new-configurable-idle-timeout-for-azure-load-balanceer/ – Jmoney38

7

Soy miembro del equipo de Service Bus en Microsoft. El costo de abrir una conexión es alto en comparación con el envío de mensajes debido a las múltiples comunicaciones necesarias para lograr que ambas partes se comuniquen entre sí.

La mitigación de esto es almacenar en caché un canal en lugar de almacenar en caché un ChannelFactory. Hay pings keep-alive de fondo realizados para las conexiones NetTcpRelayBinding que deberían garantizar que el canal permanezca abierto.

+0

En WCF tengo que prestar atención a los canales con errores, y recrear el proxy si se produce una excepción. ¿El Service Bus es similar a este respecto? ¿Cómo debo manejar las excepciones en el bus de servicio con el cliente en caché? – LamonteCristo

+0

Gracias de nuevo por todos los comentarios. Desde el punto de vista de un rol web, ¿alguien puede indicarme una forma recomendada de almacenar en caché los canales de retransmisión?¿Guardaría en caché los canales en cada instancia de rol web o quizás podría usar el caché de Azure que podría usarse entre las instancias? makerofthings7: Supongo que puede manejar la excepción como con WCF "normal", pero tenga en cuenta que esto solo está relacionado con una de dos conexiones. Servicebus lleva conexiones, una desde cada lado. Entonces, si uno sale mal, el otro no se notifica automáticamente a mi conocimiento. – user1284390

Cuestiones relacionadas