Grupos de conversação

Um grupo de conversação identifica um grupo de conversações relacionadas. Um grupo de conversação permite que um aplicativo coordene facilmente as conversações de envolvidas em uma tarefa comercial específica.

Cada conversação pertence a um grupo de conversação. Cada grupo de conversação é associado a um determinado serviço, e todas as conversações no grupo são conversações desse serviço. Um grupo de conversação pode conter qualquer número de conversações.

O SQL Server usa grupos de conversação para fornecer acesso EOIO a mensagens relacionadas a uma tarefa comercial específica. Quando um aplicativo envia ou recebe uma mensagem, o SQL Server bloqueia o grupo de conversação ao qual a mensagem pertence. Assim, somente uma sessão de cada vez pode receber mensagens para o grupo de conversação. O bloqueio do grupo de conversação garante que um aplicativo possa processar mensagens em cada conversação exatamente na ordem (EOIO). Como um grupo de conversação pode conter mais de uma conversação, um aplicativo pode usar grupos de conversação para identificar mensagens relacionadas à mesma tarefa comercial e processar essas mensagens em conjunto.

Um grupo de conversação não é compartilhado entre os participantes em uma conversação. Assim, cada participante de uma conversação é livre para agrupar essa conversação como apropriado. Um aplicativo pode gerenciar interações complexas entre serviços sem exigir qualquer suporte especial dos serviços.

Exemplos de grupos de conversação

Um aplicativo de recursos humanos pode ter um serviço GetEmployeeInformation que combina informações de um serviço de folha de pagamento e informações de um serviço de benefícios. O serviço GetEmployeeInformation inicia uma conversação com cada serviço e relaciona uma conversação com a outra no mesmo grupo de conversação. O Service Broker adiciona o identificador de grupo de conversação a cada mensagem de entrada nessas duas conversações, independentemente se a mensagem chega do serviço de folha de pagamento ou do serviço de benefícios. Como as conversações estão no mesmo grupo, o Service Broker fornece todas as informações necessárias para o serviço GetEmployeeInformation associar as informações de benefícios às informações da folha de pagamento, independentemente da quantidade de solicitações em andamento no serviço GetEmployeeInformation.

As mensagens para o serviço de folha de pagamento e para o serviço de benefícios não contêm informações do grupo de conversação para o grupo desse tipo criado por GetEmployeeInformation. Cada serviço opera independentemente, e só o serviço GetEmployeeInformation mantém informações sobre toda a tarefa comercial. Manter os serviços independentes um do outro ajuda a tornar cada serviço simples para codificação e fácil de manter. Outra vantagem para a manutenção dessa independência é que se um serviço estiver disponível, o outro poderá continuar operando.

Organizando o estado do aplicativo

Um benefício do grupo de conversação é que o identificador desse grupo constitui uma chave prática para identificar e recuperar o estado do aplicativo. O identificador de grupo de conversação facilita a manutenção do estado do aplicativo no banco de dados. Se a realização de uma tarefa envolver a troca de muitas mensagens com o tempo, será ineficaz manter uma instância do aplicativo em execução apenas para manter o estado do aplicativo. Um aplicativo será melhor dimensionado se, entre as mensagens, os dados associados à tarefa forem armazenados no banco de dados e depois recuperados, quando a próxima mensagem associada à tarefa for recebida. O identificador do grupo de conversação pode ser usado como a chave primária, em uma tabela de estados fornecida por um desenvolvedor de aplicativos, para permitir a recuperação rápida do estado associado a uma determinada tarefa. Para obter mais informações sobre como usar o identificador de grupo de conversação para manter o estado, consulte Gerenciamento de estado.

Como o SQL Server bloqueia o grupo de conversação cada vez que um aplicativo envia ou recebe uma mensagem, um aplicativo não precisa impedir explicitamente outro programa de atualizar os mesmos dados de estado ao mesmo tempo. O aplicativo simplesmente bloqueia o grupo de conversação, restaura o estado, processa as mensagens, atualiza o estado e confirma a transação.

Por questões de conveniência, o SQL Server permite que um aplicativo bloqueie o próximo grupo de conversação disponível sem receber uma mensagem. Usando a instrução GET CONVERSATION GROUP, um aplicativo pode bloquear um grupo de conversação e restaurar o estado antes de processar mensagens. Consulte a instrução GET CONVERSATION GROUP (Transact-SQL) para obter detalhes.

Tempo de vida do grupo de conversação

O Service Broker gerencia o tempo de vida do grupo de conversação. Você não precisa criar explicitamente ou destruir um grupo de conversação. O Service Broker cria um novo grupo de conversação sob as seguintes circunstâncias:

  • Um aplicativo começa uma conversação nova que não está relacionada a um grupo de conversação existente. O Service Broker cria um grupo de conversação novo e atribui um identificador novo ao grupo de conversação.

  • Um aplicativo começa uma conversação relacionada a um identificador de grupo de conversação que não existe no momento. Nesse caso, o Service Broker cria um novo grupo de conversação com o identificador especificado. Isso significa que você pode atribuir seu próprio valor a um identificador de grupo de conversação.

  • O Service Broker recebe a primeira mensagem em uma conversação nova iniciada por outro serviço. Nesse caso, o Service Broker usa o nome do serviço e o identificador de instância do agente (caso haja algum presente) para o seguinte:

    1. Localizar a fila apropriada.

    2. Criar um grupo de conversação novo e associá-lo à fila.

    3. Criar um novo identificador de conversação e adicioná-lo ao grupo de conversação novo.

    4. Colocar a mensagem de entrada na fila.

O Service Broker adiciona o identificador de grupo de conversação aos metadados da conversação que criou o grupo. Sempre que o Service Broker recebe uma mensagem para qualquer conversação associada ao grupo de conversação, ele adiciona o identificador de grupo de conversação à mensagem, antes de colocá-la na fila.

Um identificador de grupo de conversação é válido desde o momento em que o Service Broker o cria até que todas as conversações associadas a ele terminem; ou seja, o identificador de grupo de conversação será válido enquanto houver uma conversação ativa no grupo.

Qualquer aplicativo que use o identificador de grupo de conversação para gerenciar o estado do aplicativo utilizará uma tabela de estados fornecida pelo desenvolvedor. O aplicativo deve excluir o estado da tabela de estados quando determina que ele não é mais necessário. Em muitos casos, o aplicativo exclui o estado após a conclusão bem-sucedida da tarefa ou depois que os erros indicam que não é possível concluir a tarefa. Nesses casos, geralmente o aplicativo inclui o comando para excluir o estado dentro da transação que envia a mensagem de resposta final e termina a conversação. Essa estratégia assegura que o estado do aplicativo e o identificador de grupo de conversação tenham o mesmo tempo de vida. Se a operação de envio falhar, a operação de exclusão será revertida. Da mesma forma, se a operação de exclusão falhar, a operação de envio será revertida e o SQL Server não enviará a mensagem. Em todo o caso, o estado do aplicativo e o identificador de grupo de conversação permanecem válidos. Se as duas operações forem bem-sucedidas, o tempo de vida do identificador do grupo de conversação terminará ao mesmo tempo em que o programa exclui o estado de aplicativo associado.