Necesito establecer una comunicación bidireccional entre un publicador y un suscriptor. Esto es para facilitar una aplicación front-end MVC3 que define una suscripción con un filtro de correlación, y luego colocar un mensaje en un tema. Finalmente, el controlador MVC3 llama a BeginReceive() en el Cliente de suscripción, y espera la respuesta.Azure Service Bus - Desafío de rendimiento de comunicación bidireccional
El problema parece ser la creación y eliminación de estos objetos de Suscripción. La sobrecarga es enorme y ralentiza la aplicación a paso de tortuga. Esto sin mencionar las diversas limitaciones para evitar, como no más de 2000 Suscripciones en un tema.
¿Cuál es la mejor práctica para establecer este tipo de comunicación bidireccional entre un publicador y un suscriptor? Queremos que la aplicación MVC3 publique un mensaje y luego espere una respuesta a ese mensaje exacto (a través de la propiedad CorrelationId y un CorrelationFilter). Ya almacenamos en caché NamespaceManager y MessagingFactory, ya que también son prohibitivamente caros, en cuanto a los recursos, y también porque se nos avisó que Service Bus utiliza un modelo de aprovisionamiento explícito, donde se espera precrear la mayoría de estas cosas durante el inicio del rol.
Por lo tanto, esto nos deja con el desafío de correlacionar la solicitud a la respuesta, y tener esta gran sobrecarga de la creación y eliminación de Suscripciones. ¿Qué mejor práctica existe? ¿Deberíamos mantener un caché de SubscriptionClients e intercambiar el filtro cada vez? ¿Qué hacen todos los demás? Necesito tener un rendimiento de solicitudes del orden de 5 a 10 mil solicitudes de MVC3 por segundo a través del clúster de roles web. Ya estamos usando AsyncController y empleando el BeginReceive asincrónico() en SubscriptionClient. Parece ser la creación y eliminación de las Suscripciones por miles lo que está estrangulando el sistema en este punto.
Update1: Basado en el gran consejo aquí proporcionada, hemos actualizado esta solución para mantener una caché de objetos SubscriptionClient en cada instancia de rol web. Además, hemos migrado a un enfoque orientado a MessageSession.
Sin embargo, esto todavía no está escalando. Parece que AcceptMessageSession() es una operación muy costosa. ¿Deberían los objetos MessageSession también almacenarse en caché y reutilizarse? ¿Cada objeto abierto MessageSession consume una conexión al Bus de servicio? Si es así, ¿esto se cuenta en contra de la cuota de conexión simultánea de la Suscripción?
Muchas gracias. Creo que estamos llegando. La mayor parte del código de ejemplo en la web muestra: Create Topic(), luego CreateSubscription(), luego CreateSubscriptionClient(), luego BeginReceive() en el cliente, luego el desmontaje de todos los objetos. Todo lo que puedo decir es que si hicieras esto en la vida real, tu servidor quedaría aplastado y maximizarías las conexiones en poco tiempo.
Tenemos que poner miles de solicitudes por segundo a través de esta cosa, y es muy evidente que estos objetos deben almacenarse en caché y reutilizarse en gran medida. Entonces, ¿MessageSession es otro elemento para caché? Me divertiré almacenando en caché eso, porque tendremos que implementar un mecanismo de recuento de referencias, donde solo se puede dar una referencia a MessageSession a la vez, ya que esto es para solicitud/respuesta específica de solicitud http, y no podemos tener otra suscriptores que usan los objetos MessageSession al mismo tiempo.
Update2: OK, no es factible MessageSession caché para su reutilización, ya que sólo viven tanto como el LockDuration en la suscripción. Esto es un fastidio, porque el LockDuration máximo es de 5 minutos. Estos parecen ser para pub/sub de corta duración, no para procesos distribuidos de larga ejecución. Parece que tenemos que volver a sondear Azure Tables.
RESUMEN/COMENTARIO Nos trató de construir el servicio de autobuses debido a la escala potencial y su semántica de durabilidad y entrega. Sin embargo, parece que hay situaciones, solicitudes/respuestas de alto volumen entre ellas, que no son adecuadas. La parte de publicación funciona muy bien, y tener consumidores que compiten en el back-end es excelente, pero tener una solicitud de front-end esperar en una respuesta definida de consumidor único, no se escala bien, porque las MessageSessions toman demasiado tiempo para crear a través de AcceptMessageSession() o BeginAcceptMessageSession(), y porque no son adecuados para el almacenamiento en caché.
Si alguien tiene una vista alternativa, me encantaría escucharla.
Suena como algo en lo que ZeroMQ es bueno. http://www.zeromq.org/ –
Gracias por el enlace. Eso se ve muy interesante. –
OK, es una pregunta muy antigua, pero veo que ahora hay un método 'RenewLock' en las sesiones, así que tal vez ahora sean almacenables. –