Protocolos de comunicação do Service Broker

Aplica-se a:SQL ServerAzure SQL Managed Instance

O Service Broker usa um protocolo específico do agente para se comunicar com agentes remotos. O broker gerencia conexões separadamente do pool normal de conexões de cliente. Para que duas instâncias do SQL Server troquem mensagens do Service Broker, cada instância deve ser capaz de enviar tráfego TCP/IP para a porta que a outra instância usa para comunicações do Service Broker. Por convenção, o Service Broker geralmente usa a porta 4022 para comunicação entre corretores. No entanto, a porta exata é especificada quando o ponto de extremidade é criado.

Camadas de protocolo

O Service Broker adota uma abordagem em camadas para a comunicação. Cada camada se baseia na camada subjacente para ajudar a garantir uma entrega confiável. Essa abordagem permite que um aplicativo opere sem conhecimento do local do serviço remoto ou do transporte físico que o broker usa para se comunicar. Na maioria dos casos, esses protocolos são transparentes para um aplicativo. No entanto, compreender o papel que cada camada de protocolo desempenha pode ajudar na solução de problemas com um aplicativo.

O protocolo de nível mais alto que o broker usa é o protocolo de diálogo. A camada de protocolo de diálogo lida com a transmissão de mensagens seqüenciadas e confiáveis. A camada de protocolo de diálogo gera números de sequência para mensagens, gera mensagens de confirmação, entrega mensagens para as filas apropriadas e fragmenta e remonta mensagens. O protocolo de diálogo lida com autenticação e criptografia para uma caixa de diálogo.

O protocolo de diálogo usa o protocolo de agente adjacente para transmitir fragmentos de mensagem. O protocolo de broker adjacente lida com as transmissões de rede trocadas entre duas instâncias de broker.

O protocolo de broker adjacente usa um protocolo de transporte, como TCP/IP, para mover mensagens de broker para broker.

Protocolo de diálogo

O protocolo de diálogo gerencia o padrão de entrega exatamente uma vez na ordem (EOIO) para mensagens em uma conversa. Esse protocolo não descreve o formato que as mensagens do Service Broker usam na rede. Em vez disso, o protocolo especifica as etapas lógicas necessárias para uma conversa confiável. O protocolo de diálogo lida com as tarefas necessárias para uma entrega confiável, incluindo a geração e o processamento de mensagens de confirmação.

Cada lado de uma conversa é um ponto de extremidade na camada de protocolo de diálogo A exibição sys.conversation_endpoints de catálogo mostra informações sobre pontos de extremidade de protocolo de diálogo. Existe um ponto de extremidade de conversação durante o tempo de vida da conversa.

Protocolo de corretor adjacente

A camada de protocolo de broker adjacente lida com a mecânica de comunicação entre duas instâncias do SQL Server. Esta camada codifica cada fragmento de mensagem em um formato padrão adequado para transmissão pela rede. Ao contrário da camada de protocolo de diálogo, a camada de protocolo adjacente está ciente do transporte de rede usado e formata os fragmentos de mensagem adequadamente. Na verdade, a camada de protocolo de broker adjacente fornece uma camada de abstração entre a camada de protocolo de diálogo e a camada de protocolo de transporte.

Cada conexão de rede do Service Broker é um ponto de extremidade na camada de protocolo adjacente. A exibição sys.dm_broker_connections de gerenciamento dinâmico mostra informações sobre conexões de rede do Service Broker. O Service Broker mantém a conexão de rede enquanto as mensagens são trocadas ativamente. O Service Broker fecha a conexão de rede quando nenhuma mensagem foi enviada ou recebida pela conexão de rede por um curto período de tempo.

Protocolo de transporte

A camada de protocolo de transporte lida com a transmissão de rede real. Essa camada está fora do Service Broker. Por exemplo, as mensagens para um broker em execução em uma instância diferente do SQL Server usam TCP/IP como a camada de protocolo de transporte.

Os pontos de extremidade do Service Broker definem opções para o protocolo de transporte. O SQL Server não contém pontos de extremidade do Service Broker por padrão. Para obter mais informações sobre como criar um ponto de extremidade do Service Broker, consulte Como ativar a rede do Service Broker.

Processamento de mensagens do Service Broker

O Service Broker usa duas categorias distintas de mensagem. Uma mensagem sequenciada é uma mensagem que deve ser entregue a um aplicativo exatamente uma vez, em ordem. Uma mensagem não sequenciada é uma mensagem que pode ser processada imediatamente, independentemente da sequência em que a mensagem chega.

O Service Broker usa mensagens sequenciadas para todos os tipos de mensagens definidas pelo usuário, mensagens de diálogo final e mensagens de erro criadas por um aplicativo. Cada mensagem sequenciada tem um número de sequência. A instância que origina a mensagem cria o número de sequência da mensagem e atribui o número de sequência à mensagem. O agente recetor usa o número de sequência de mensagens para ordenar as mensagens que fornece a um aplicativo. Para uma determinada caixa de diálogo, o aplicativo sempre recebe a mensagem com o menor número de sequência primeiro. O Service Broker também usa o número de sequência de mensagens para detetar mensagens duplicadas. Quando a camada de protocolo de diálogo recebe duas mensagens na mesma caixa de diálogo com o mesmo número de sequência, a camada de protocolo de diálogo considera as mensagens como duplicadas e descarta uma.

O Service Broker usa mensagens não sequenciadas para mensagens de confirmação dedicadas e mensagens de erro criadas pelo Service Broker. O Service Broker não toma precauções especiais para entregar uma mensagem não sequenciada. No entanto, o Service Broker cria mensagens não sequenciadas em resposta a mensagens recebidas. Portanto, se a mensagem não sequenciada for perdida, o remetente tentará novamente a mensagem original; Em seguida, o destinatário gera outra mensagem não sequenciada.

Fragmentação de mensagens

O Service Broker divide as mensagens de saída em fragmentos e combina os fragmentos de entrada na mensagem original. Para mensagens pequenas, a mensagem inteira está contida em um fragmento. Para mensagens grandes, o Service Broker cria muitos fragmentos.

A fragmentação das mensagens tem várias vantagens. O envio de uma mensagem grande em pequenos fragmentos melhora a velocidade geral e a confiabilidade ao se comunicar através de redes relativamente lentas e não confiáveis, como Wide-Area Networks (WANs). Se um fragmento da mensagem for perdido, o protocolo retransmitirá apenas um fragmento em vez da mensagem completa. A fragmentação de mensagens grandes também pode reduzir o tempo necessário para que uma mensagem pequena chegue ao destino. O Service Broker pode enviar um fragmento que contém uma pequena mensagem completa entre fragmentos de uma mensagem grande. Isso diminui um pouco a velocidade da mensagem grande, a fim de reduzir o tempo que a mensagem pequena espera para ser transmitida.

Enquanto uma mensagem está sendo remontada, a mensagem parcial é armazenada na fila de destino. Se a fila de destino não estiver disponível, ela será armazenada na fila de transmissão. Uma mensagem parcial não pode ser recebida por um aplicativo. A status coluna de uma mensagem parcial está definida como 2 (Desativado). Esse valor também é usado para mensagens recebidas fora de ordem.

Reconhecimento de mensagem

O Service Broker reconhece cada mensagem recebida. Uma confirmação pode reconhecer um ou vários fragmentos de mensagem. Se possível, uma confirmação é incluída no cabeçalho de uma mensagem retornada na mesma conversa. Se nenhuma outra mensagem estiver pronta para ser enviada, o Service Broker retornará uma mensagem de confirmação dedicada. A confirmação da mensagem é tratada inteiramente pelo Service Broker; um aplicativo que usa o Service Broker não recebe essas mensagens.

Um remetente retém fragmentos de mensagem que o destinatário não reconheceu. Se nenhuma confirmação for recebida dentro de um tempo de espera definido pelo sistema, o remetente enviará o fragmento de mensagem novamente. Se nenhuma confirmação for recebida durante o tempo de espera, o Service Broker aumentará exponencialmente a quantidade de tempo antes da próxima nova tentativa, até um tempo máximo de espera. O tempo de espera inicial para uma nova tentativa é de alguns segundos. O tempo máximo de espera é de aproximadamente um minuto. O tempo de espera não pretende ser preciso; dependendo do tráfego de rede e da outra atividade na instância do SQL Server, um fragmento de mensagem pode não ser repetido por alguns segundos após o tempo de espera expirar.

Se uma confirmação for perdida ou atrasada, o destinatário poderá receber mensagens duplicadas. Nesse caso, o destinatário confirma o recebimento da mensagem duplicada, mas não entrega a mensagem duplicada na fila.

O Service Broker usa a confirmação de mensagens para fornecer mensagens confiáveis sem transações distribuídas. Um destinatário envia uma confirmação somente depois de adicionar a mensagem ou o fragmento de mensagem à fila. O remetente mantém a mensagem na fila de transmissão até que a confirmação dessa mensagem chegue. Embora o remetente e o destinatário nunca compartilhem uma transação, o protocolo garante que o remetente não remova a mensagem da fila de transmissão até que o destinatário tenha recebido a mensagem com êxito.

Verificação da integridade da mensagem

O formato que o Service Broker usa para transmitir mensagens inclui uma verificação de integridade da mensagem para determinar se uma determinada mensagem foi alterada ou corrompida durante o transporte.

A verificação de integridade da mensagem é uma assinatura MD5 para o conteúdo da mensagem. O SQL Server criptografa a assinatura com a chave de sessão da mensagem e inclui a assinatura nos cabeçalhos da mensagem.

O destino da mensagem descriptografa a mensagem e, em seguida, compara a assinatura na mensagem com uma nova assinatura calculada sobre o conteúdo real recebido. Se as assinaturas não corresponderem, a mensagem foi danificada ou adulterada durante a transmissão. A mensagem falha na verificação de integridade da mensagem. O SQL Server descarta a mensagem e não a reconhece para o remetente. A classe de evento Broker:Corrupted Message relata informações quando uma mensagem falha na verificação de integridade da mensagem.

Objetos de transmissão do Service Broker

Um objeto de transmissão do Service Broker é um objeto na memória que gerencia e registra o estado das transmissões de mensagens para uma caixa de diálogo. Cada ponto de extremidade de conversação tem um objeto de transmissão.

Uma caixa de diálogo solicita um objeto de transmissão quando faz o seguinte:

  • Envia uma mensagem através da fila de transmissão. Isto inclui o seguinte:

    • Todas as mensagens enviadas para uma instância remota do Mecanismo de Banco de Dados

    • Mensagens para filas enviadas na instância local se a mensagem não puder ser inserida diretamente na fila de destino

  • Recebe uma mensagem remota ou uma mensagem proveniente de uma fila de transmissão local.

Um objeto de transmissão é criado na primeira vez que uma caixa de diálogo solicita um. O Service Broker usa o mesmo objeto de transmissão para solicitações subsequentes dessa caixa de diálogo. Os objetos de transmissão são modificados sempre que o Service Broker precisa registrar uma alteração no estado das transmissões para a caixa de diálogo. Os objetos de transmissão têm cerca de 1 KB.

Para liberar memória, o Service Broker armazena periodicamente lotes de objetos de transmissão inativos em tempdb tabelas de trabalho. Quando um objeto de transmissão é modificado pela primeira vez na memória, ele é marcado como sujo. O objeto de transmissão permanece marcado como sujo até ser liberado para uma mesa de trabalho.

Os objetos de transmissão não são usados para enviar ou receber mensagens locais que podem ser inseridas diretamente na fila de destino.

Fluxo de comunicação de rede

A ilustração a seguir apresenta uma exibição de alto nível da comunicação de rede do Service Broker entre duas instâncias do SQL Server.

Diagrama da comunicação da rede do Broker entre duas instâncias.

A conversa é uma conexão persistente e lógica. A conversa pode ocorrer durante qualquer período de tempo e, durante esse período de tempo, a conversa pode usar qualquer número de conexões de rede.

As conexões de rede ocorrem entre dois pontos de extremidade do Service Broker. Essas conexões usam TCP/IP. Se a conexão estiver inativa por um curto período de tempo, o SQL Server fechará a conexão de rede.

Para entregar uma mensagem, o Service Broker mantém a mensagem na fila de transmissão do banco de dados que enviou a mensagem. O destinatário entrega a mensagem diretamente na fila do serviço de destino. Se essa fila for OFF, a mensagem será mantida temporariamente na fila de transmissão para o banco de dados de recebimento. A fila para o serviço de envio não está envolvida na operação. A fila de transmissão para o banco de dados que hospeda o serviço de recebimento só será envolvida se a fila de destino for OFF.