Grupos de conversación

Un grupo de conversación identifica un grupo de conversaciones relacionadas. Un grupo de conversación permite a una aplicación coordinar fácilmente conversaciones implicadas en una tarea empresarial específica.

Cada conversación pertenece a un grupo de conversación. Cada grupo de conversación se asocia con un servicio específico y todas las conversaciones del grupo son conversaciones hacia o desde ese servicio. Un grupo de conversación puede contener cualquier número de conversaciones.

SQL Server utiliza grupos de conversación para proporcionar acceso exactamente una vez por orden (EOIO) a los mensajes relacionados con una tarea empresarial específica. Cuando una aplicación envía o recibe un mensaje, SQL Server bloquea el grupo de conversación al que pertenece el mensaje. Así, sólo una sesión a la vez puede recibir mensajes para el grupo de conversación. El bloqueo del grupo de conversación garantiza que una aplicación puede procesar mensajes en cada conversación exactamente una vez por orden (EOIO). Dado que el grupo de conversación puede contener más de una conversación, una aplicación puede utilizar grupos de conversación para identificar mensajes relacionados con la misma tarea empresarial y procesar esos mensajes conjuntamente.

Los participantes de una conversación no comparten un grupo de conversación. Por tanto, cada participante de una conversación es libre de agrupar esa conversación como desee. Una aplicación puede administrar interacciones complejas entre servicios sin requerir ninguna compatibilidad especial de los servicios.

Ejemplos de grupos de conversación

Una aplicación de recursos humanos puede tener un servicio GetEmployeeInformation que combina información de un servicio de nóminas e información del servicio de prestaciones. El servicio GetEmployeeInformation inicia una conversación con cada servicio y relaciona una conversación con otra del mismo grupo de conversación. Service Broker agrega el identificador del grupo de conversación a cada mensaje entrante en estas dos conversaciones, independientemente de si el mensaje procede del servicio de nóminas o del servicio de prestaciones. Dado que las conversaciones están en el mismo grupo de conversación, Service Broker proporciona toda la información necesaria para que el servicio GetEmployeeInformation haga coincidir la información de prestaciones con la información de nóminas, independientemente del número de solicitudes en progreso en el servicio GetEmployeeInformation.

Los mensaje al servicio de nóminas y los mensajes al servicio de prestaciones no contienen información del grupo de conversación creado por GetEmployeeInformation. Cada servicio opera de forma independiente y sólo el servicio GetEmployeeInformation mantiene información sobre la tarea empresarial completa. Mantener los servicios independientes entre ellos ayuda a simplificar la codificación y el mantenimiento de cada servicio. Otra ventaja de esta independencia es que si un servicio no está disponible, el otro puede seguir operando.

Organizar el estado de la aplicación

Una ventaja del grupo de conversación es que el identificador del grupo de conversación es una clave adecuada para identificar y recuperar el estado de la aplicación. El identificador del grupo de conversación facilita el mantenimiento del estado de la aplicación en la base de datos. Si se lleva a cabo una tarea que supone intercambiar muchos mensajes a lo largo del tiempo, no es eficaz mantener una instancia de la aplicación en ejecución con el único fin de mantener el estado de la aplicación. Una aplicación se amplía mejor si, entre los mensajes, cualquier dato asociado con la tarea se almacena en la base de datos y, a continuación, se recupera cuando se recibe el siguiente mensaje asociado con la tarea. El identificador del grupo de conversación puede utilizarse como la clave principal en una tabla de estado proporcionada por un programador de aplicaciones para permitir la recuperación rápida del estado asociado con una tarea determinada. Para obtener más información sobre cómo utilizar el identificador del grupo de conversación para mantener el estado, vea Administración del estado.

Dado que SQL Server bloquea el grupo de conversación cada vez que una aplicación envía o recibe un mensaje, una aplicación no necesita evitar explícitamente que otro programa actualice los mismos datos de estado al mismo tiempo. La aplicación simplemente bloquea el grupo de conversación, restaura el estado, procesa los mensajes, actualiza el estado y, a continuación, confirma la transacción.

Para mayor comodidad, SQL Server permite que una aplicación bloquee el siguiente grupo de conversación disponible sin recibir ningún mensaje. Con la instrucción GET CONVERSATION GROUP, una aplicación puede bloquear un grupo de conversación y restaurar el estado antes de procesar los mensajes. Para obtener más información, vea la instrucción GET CONVERSATION GROUP (Transact-SQL).

Vigencia del grupo de conversación

Service Broker administra la vigencia del grupo de conversación. No tiene que crear ni destruir explícitamente un grupo de conversación. Service Broker crea un nuevo grupo de conversación bajo estas circunstancias:

  • Una aplicación inicia una nueva conversación que no está relacionada con un grupo de conversación existente. Service Broker crea un grupo de conversación nuevo y le asigna un nuevo identificador.

  • Una aplicación inicia una nueva conversación relacionada con un identificador del grupo de conversación que no existe actualmente. En este caso, Service Broker crea un nuevo grupo de conversación con el identificador especificado. Esto significa que puede asignar su propio valor a un identificador del grupo de conversación.

  • Service Broker recibe el primer mensaje de una nueva conversación iniciada por otro servicio. En este caso, Service Broker utiliza el nombre del servicio y el identificador de instancia de broker (si hay alguno) para:

    1. Localizar la cola apropiada.

    2. Crear un grupo de conversación nuevo y asociar el grupo de conversación con la cola.

    3. Crear un nuevo identificador de conversación y agregarlo al nuevo grupo de conversación.

    4. Incluir el mensaje entrante en la cola.

Service Broker agrega el identificador del grupo de conversación a los metadatos de la conversación que ha creado el grupo de conversación. Cuando Service Broker recibe un mensaje de cualquier conversación asociada con el grupo de conversación, agrega el identificador del grupo de conversación a ese mensaje antes de incluirlo en la cola.

Un identificador del grupo de conversación es válido desde el momento que Service Broker lo crea hasta que finalizan todas las conversaciones asociadas con él; es decir, se garantiza que el identificador del grupo de conversación es válido mientras alguna conversación del grupo esté activa.

Una aplicación que utiliza el identificador del grupo de conversación para administrar el estado de la aplicación utiliza una tabla de estado proporcionada por el programador. La aplicación debe eliminar ese estado de la tabla de estado cuando la aplicación determina que ya no es necesario. Generalmente, la aplicación elimina el estado cuando la tarea finaliza correctamente o cuando los errores indican que la tarea no puede finalizar. En estos casos, la aplicación suele incluir el comando para eliminar el estado en la transacción que envía el mensaje de respuesta final y termina la conversación. Esta estrategia garantiza que el estado de la aplicación y el identificador del grupo de conversación tienen la misma vigencia. Si la operación de envío genera un error, la operación de eliminación se revierte. De la misma manera, si la operación de eliminación genera un error, la operación de envío se revierte y SQL Server no envía el mensaje. En cualquier caso, el estado de la aplicación y el identificador del grupo de conversación siguen siendo válidos. Si ambas operaciones se realizan correctamente, la vigencia del identificador del grupo de conversación finaliza al mismo tiempo que el programa elimina el estado de aplicación asociado.