Grupos de conversação

Aplica-se a:SQL ServerAzure SQL Managed Instance

Um grupo de conversação identifica um grupo de conversas relacionadas. Um grupo de conversação permite que um aplicativo coordene facilmente conversas envolvidas em uma tarefa de negócios específica.

Cada conversa pertence a um grupo de conversação. Cada grupo de conversação está associado a um serviço específico, e todas as conversas no grupo são conversas de ou para esse serviço. Um grupo de conversação pode conter qualquer número de conversas.

O SQL Server usa grupos de conversação para fornecer acesso exatamente uma vez na ordem (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, apenas 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 exatamente uma vez em ordem (EOIO). Como um grupo de conversação pode conter mais de uma conversa, um aplicativo pode usar grupos de conversação para identificar mensagens relacionadas à mesma tarefa comercial e processar essas mensagens juntas.

Um grupo de conversação não é partilhado entre os participantes de uma conversa. Portanto, cada participante de uma conversa é livre para agrupar essa conversa conforme 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 GetEmployeeInformation serviço que combina informações de um serviço de folha de pagamento e informações de um serviço de benefícios. O GetEmployeeInformation serviço inicia uma conversa com cada serviço e relaciona uma conversa com a outra no mesmo grupo de conversação. O Service Broker adiciona o identificador do grupo de conversação a cada mensagem recebida nessas duas conversas, independentemente de a mensagem chegar do serviço de folha de pagamento ou do serviço de benefícios. Como as conversas estão no mesmo grupo de conversação, o Service Broker fornece todas as informações necessárias para que o GetEmployeeInformation serviço corresponda as informações de benefícios às informações da folha de pagamento, independentemente de quantas solicitações estão em andamento no GetEmployeeInformation serviço.

As mensagens para o serviço de folha de pagamento e as mensagens para o serviço de benefícios não contêm informações do grupo de conversação para o grupo de conversação criado pela GetEmployeeInformation. Cada serviço opera de forma independente, e apenas o GetEmployeeInformation serviço mantém informações sobre toda a tarefa comercial. Manter os serviços independentes uns dos outros ajuda a tornar cada serviço simples de codificar e fácil de manter. Outra vantagem de manter esta independência é que, se um serviço estiver indisponível, o outro serviço pode continuar a funcionar.

Organizar o estado do aplicativo

Um benefício do grupo de conversação é que o identificador do grupo de conversação é uma chave conveniente para identificar e recuperar o estado do aplicativo. O identificador do 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 ao longo do tempo, será ineficiente manter uma instância do aplicativo em execução apenas para manter o estado do aplicativo. Um aplicativo é melhor dimensionado se, entre mensagens, quaisquer dados associados à tarefa são armazenados no banco de dados e, em seguida, são recuperados quando a próxima mensagem associada a essa tarefa é 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 tarefa específica. 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 sempre que um aplicativo envia ou recebe uma mensagem, um aplicativo não precisa impedir explicitamente que outro programa atualize os mesmos dados de estado ao mesmo tempo. O aplicativo simplesmente bloqueia o grupo de conversação, restaura o estado, processa mensagens, atualiza o estado e, em seguida, confirma a transação.

Por 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, um aplicativo pode bloquear um grupo de conversação e restaurar o GET CONVERSATION GROUP estado antes de processar mensagens. Consulte a declaração GET CONVERSATION GROUP 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 ou destruir explicitamente um grupo de conversa. O Service Broker cria um novo grupo de conversação nas seguintes circunstâncias:

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

  • Um aplicativo inicia uma conversa 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 nova conversa iniciada por outro serviço. Nesse caso, o Service Broker usa o nome do serviço e o identificador de instância do broker (se houver um) para fazer o seguinte:

    1. Localize a fila apropriada.
    2. Crie um novo grupo de conversação e associe o grupo de conversação à fila.
    3. Crie um novo identificador de conversação e adicione o identificador de conversação ao novo grupo de conversação.
    4. Coloque a mensagem recebida na fila.

O Service Broker adiciona o identificador do grupo de conversação aos metadados da conversa que criou o grupo de conversação. Sempre que o Service Broker recebe uma mensagem para qualquer conversa associada ao grupo de conversação, o Service Broker adiciona o identificador do grupo de conversação a essa mensagem antes de inserir a mensagem 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 conversas associadas ao identificador terminem; ou seja, é garantido que o identificador do grupo de conversação é válido enquanto qualquer conversa no grupo estiver ativa.

Um aplicativo que usa o identificador de grupo de conversação para gerenciar o estado do aplicativo usa uma tabela de estado fornecida pelo desenvolvedor. O aplicativo deve excluir esse estado da tabela de estados quando o aplicativo determinar que o estado não é mais necessário. Em muitos casos, o aplicativo exclui o estado depois que a tarefa é concluída com êxito ou depois que erros indicam que a tarefa não pode ser concluída. Nesses casos, o aplicativo normalmente inclui o comando para excluir o estado dentro da transação que envia a mensagem de resposta final e termina a conversa. Essa estratégia garante que o estado do aplicativo e o identificador do 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 ambos os casos, o estado do aplicativo e o identificador do grupo de conversação permanecem válidos. Se ambas as operações forem bem-sucedidas, o tempo de vida do identificador do grupo de conversação termina ao mesmo tempo em que o programa exclui o estado do aplicativo associado.