2009-08-21 21 views
6

¿Alguien puede explicar grupos de conversación en el agente de servicios?Servidor Sql Service Broker Grupos de conversación

Actualmente, estoy usando service broker para enviar mensajes de un servidor SQL a otro. En el servidor de envío, intento correlacionar los mensajes para que se procesen en serie en el lado de recepción. Según la documentación, los grupos de conversación parecen ser los más adecuados para esto, pero en el servidor receptor, los mensajes se asignan a un grupo de conversación diferente al especificado al enviar el mensaje.

Tengo buscar en la web y vi que este comportamiento parece estar previsto (http://social.msdn.microsoft.com/forums/en-US/sqlservicebroker/thread/baf48074-6804-43ab-844a-cb28a6dce02b/), pero entonces estoy confundido acerca de la utilidad de la sintaxis de (http://msdn.microsoft.com/en-us/library/ms178624.aspx)

WAITFOR( 
    GET CONVERSATION GROUP @conversation_group_id FROM [dbo].[ReceiveQueue] 
) 

Si la conversación el grupo no se encuentra con el mensaje del remitente y los mensajes enviados con el mismo ID de grupo de conversación no tienen la misma identificación de grupo de conversación en el lado de recepción, ¿cuál es el punto del código anterior?

Respuesta

18

Los grupos de conversación son primitivos locales utilizados para el bloqueo. Los mensajes dentro de un grupo de conversación no tienen garantías de pedido, y los grupos de conversación no fluyen a través del cable.

La orden de los mensajes está garantizada por Service Broker dentro de una conversación. Por lo tanto, para conservar el orden de los mensajes corrleated en el proceso, envíelos en la misma conversación.

Los grupos de conversación son necesarios para agrupar un conjunto de conversaciones que están relacionadas entre sí. Los verbos GET CONVERSATION GROUP y RECEIVE garantizan que bloquearán un grupo completo de conversores, impidiendo que cualquier otro hilo procese mensajes relacionados. Por ejemplo, considere un sitio de viaje. Recibe un mensaje con una solicitud para reservar un paquete de vacaciones. Como resultado, inicia una conversación con un servicio de reserva de hotel y envía una solicitud para reservar una habitación, inicia una conversación con un servicio de reserva de avión y solicita una reserva de viaje, inicia una conversación con un servicio de agencia de alquiler de automóviles y solicita un reserva de coche Estas tres nuevas conversaciones que creó están todas en el mismo grupo con la conversación inicial en la que se recibió la solicitud (la aplicación ha utilizado la cláusula WITH RELATED_CONVERSATION de BEGIN DIALOG en las 3). A continuación, confirma y procesa los mensajes en la cola. Las respuestas posteriores de estas 3 solicitudes correlacionadas comienzan a aparecer, en momentos prácticamente aleatorios. Digamos que la respuesta del hotel es lo primero. El mensaje es recogido por la aplicación y continúa para actualizar el estado de la solicitud con la respuesta del hotel. Al mismo tiempo, la respuesta de la línea aérea entra. Si se permite que otro subproceso lo recoja, intentaría actualizar el estado de la misma solicitud , lo que da como resultado bloqueo o incluso interbloqueo contra el subproceso que está procesando el respuesta del hotel Cuando se procesa la respuesta del hotel, el hilo se compromete y, por lo tanto, desbloquea todo el grupo de conversación, lo que permite que cualquier hilo (incluido él mismo) recoja la respuesta de la línea aérea y la procese.

+1

Gracias. Esa es la mejor explicación que pude encontrar en la web. Tal vez soy solo yo, pero la documentación de Microsoft MSDN sobre esta característica parece muy ambigua. ¿Alguna sugerencia sobre cómo serializar el procesamiento de mensajes en la cola de recepción? Estoy enviando mensajes que potencialmente pueden actualizar un solo registro en el lado de recepción. Estos mensajes provienen de diferentes fuentes y, como tal, no pueden formar parte de la misma conversación. Necesito asegurarme de que los mensajes que se relacionan entre ellos en el lado de recepción se procesen en orden y en serie. –

+2

El objetivo puede agrupar conversaciones utilizando MOVE CONVERSATION. A continuación, puede mover cualquier conversación "nueva" al grupo adecuado.Otra alternativa es invertir la iniciación del diálogo: el 'back-end' inita los diálogos (y por lo tanto controla su agrupación en su lado) y el 'front-end' envía en el * end * endpoint de los diálogos. Si el back-end no puede conocer los nombres/ubicación finales anteriores, la 'iniciación' puede ser activada por el front-end enviando un mensaje con el significado 'subscríbeme por favor en esta dirección'. La solución adecuada depende de los detalles de su escenario. Envíame un correo electrónico. –

+0

Sí, el enfoque de la conversación por movimiento es lo que estamos buscando en este momento. La preocupación es que, dado que la conversación de movimiento bloquea el grupo de conversación objetivo y que los mensajes de su grupo de conversación bloqueen el grupo de conversación asociado, podríamos encontrarnos en una situación de punto muerto. Estamos en medio de un POC tratando de resolver esa preocupación. Gracias por la visión. –

Cuestiones relacionadas