Compartilhar via


Protocolos de comunicação do Service Broker

Aplica-se a: SQL Server Instância Gerenciada de SQL do Azure

O Service Broker usa um protocolo específico de agente para se comunicar com outros agentes. O agente 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 poder 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 usa frequentemente a porta 4022 para comunicação entre agentes. No entanto, a porta exata é especificada quando o ponto de extremidade é criado.

Camadas de protocolo

O Service Broker efetua uma abordagem em camadas na comunicação. Cada camada cria uma camada subjacente para ajudar a garantir entrega segura. Essa abordagem permite que um aplicativo opere sem conhecer o local do serviço remoto ou o transporte físico que o agente usa na comunicação. Na maioria dos casos, esses protocolos são transparentes para um aplicativo. No entanto, compreender a função que cada camada de protocolo desempenha pode ajudar a solucionar problemas em um aplicativo.

O protocolo de mais alto nível que o agente usa é o protocolo de diálogo. A camada de protocolo de diálogo controla transmissão de mensagem segura e em sequência. A camada de protocolo de diálogo gera números sequenciais para mensagens, gera mensagens de confirmação, entrega mensagens nas filas apropriadas, fragmenta e reagrupa mensagens. O protocolo de diálogo controla autenticação e criptografia para um diálogo.

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

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

Protocolo de diálogo

O protocolo de diálogo gerencia o padrão de entrega EOIO (exatamente uma vez em ordem) para mensagens em uma conversa. Esse protocolo não descreve o formato que mensagens do Service Broker usam na rede. Em vez disso, o protocolo especifica as etapas lógicas necessárias para uma conversa segura. O protocolo de diálogo controla as tarefas necessárias para entrega segura, incluindo geração e 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 do catálogo sys.conversation_endpoints mostra informações sobre pontos de extremidade de protocolos de diálogo. Um ponto de extremidade de conversa existe para o tempo de vida da conversa.

Protocolo de agente adjacente

A camada de protocolo de agente adjacente controla a mecânica da comunicação entre duas instâncias do SQL Server. Essa camada codifica cada fragmento de mensagem em um formato padrão adequado à transmissão em rede. Diferentemente da camada de protocolo de diálogo, a camada de protocolo adjacente leva em consideração o transporte de rede usado e formata os fragmentos da mensagem de acordo. Na prática, a camada de protocolo de agente 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 de gerenciamento dinâmico sys.dm_broker_connections 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 encerra a conexão de rede se nenhuma mensagem for enviada ou recebida na conexão de rede por um breve período.

Protocolo de Transporte

A camada de protocolo de transporte controla a transmissão de rede atual. Esta camada está fora do Service Broker. Por exemplo, mensagens para um agente executadas em uma instância diferente do SQL Server usam TCP/IP como 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, confira Como ativar a rede do Service Broker (Transact-SQL).

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, sem considerar a sequência de chegada da mensagem.

O Service Broker usa mensagens sequenciadas para todos os tipos de mensagem definidos pelo usuário, mensagens de término de diálogo 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 de mensagem e atribui o número de sequência à mensagem. O agente receptor usa o número de sequência da mensagem para ordenar as mensagens que fornece a um aplicativo. Para determinado diálogo, o aplicativo sempre recebe primeiro a mensagem com o número de sequência mais baixo. O Service Broker também usa o número da sequência de mensagens para detectar mensagens duplicadas. Quando a camada de protocolo de diálogo recebe duas mensagens no mesmo 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 usa precauções especiais para entregar uma mensagem não protelada. Observe, entretanto, que o Service Broker cria mensagens não sequenciadas em resposta a mensagens de entrada. Portanto, se a mensagem não sequenciada for perdida, o remetente tentará novamente a mensagem original; o receptor, então, gerará outra mensagem não sequenciada.

Fragmentação de mensagem

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

A fragmentação de mensagens tem várias vantagens. O envio de uma mensagem grande em pequenos fragmentos aprimora a segurança e a velocidade, de maneira geral, em comunicações relativamente lentas e não confiáveis de rede, como WANs (Redes de Longa Distância). Se um fragmento da mensagem for perdido, o protocolo retransmitirá somente um fragmento e não toda a mensagem. 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 mensagem pequena completa entre fragmentos de uma mensagem grande. Isso desacelera um pouco a mensagem grande para reduzir o tempo que a mensagem pequena espera para ser transmitida.

Enquanto uma mensagem é reagrupada, 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 coluna de status para uma mensagem parcial é definida como 2 (Desativada). Esse valor também é usado para mensagens recebidas fora de ordem.

Confirmação de mensagem

O Service Broker reconhece cada mensagem recebida. Uma confirmação pode confirmar 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 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 receptor não confirmou. 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 o tempo antes da próxima tentativa, até um tempo de espera máximo. O tempo de espera inicial para uma nova tentativa é de alguns segundos. O tempo de espera máximo é aproximadamente um minuto. Observe que o tempo de espera não tem a intenção de ser preciso; dependendo do tráfego da rede e da outra atividade na instância do SQL Server, o fragmento de mensagem pode não ser enviado novamente por alguns segundos depois que o tempo de espera expira.

Se uma confirmação for perdida ou estiver 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 à fila.

O Service Broker usa a confirmação de mensagem para propiciar um serviço de mensagem confiável sem transações distribuídas. Um destinatário só envia uma confirmação depois de adicionar a mensagem ou o fragmento da mensagem à fila. O remetente mantém a mensagem na fila de transmissão até que a confirmação daquela 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 de integridade da mensagem

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

A verificação da integridade da mensagem é uma assinatura MD5 para o conteúdo da mensagem. O SQL Server codifica 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 compara a assinatura da mensagem a uma nova assinatura computada com base no conteúdo atual recebido. Se as assinaturas não corresponderem, a mensagem foi danificada ou violada durante a transmissão. A mensagem falha a verificação da integridade da mensagem. O SQL Server descarta a mensagem e não confirma a mensagem ao remetente. Uma classe de evento Broker:Corrupted Message informa quando uma mensagem não é aprovada na verificação de integridade da mensagem.

Objetos de transmissão do Service Broker

Um objeto de transmissão do Service Broker é um objeto da memória que gerencia e registra o estado de transmissão da mensagem para um diálogo. Cada ponto de extremidade de conversa tem um objeto de transmissão.

Um diálogo solicita um objeto de transmissão quando:

  • Envia uma mensagem pela fila de transmissão. Isso inclui o seguinte:

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

    • Mensagens para filas de mensagens 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 que vem de uma fila de transmissão local.

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

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

Os objetos de transmissão não são usados para enviar ou receber mensagens locais que possam 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 de comunicação de rede do Service Broker entre duas instâncias do SQL Server.

Comunicação de rede do agente entre duas instâncias

Observe que a conversa é uma conexão persistente e lógica. A conversa pode ocorrer em qualquer período de tempo e durante esse período 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 o TCP/IP. Se a conexão estiver inativa por algum 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 à fila do serviço de destino. Se essa fila estiver OFF, a mensagem será mantida temporariamente na fila de transmissão do banco de dados receptor. A fila do serviço de envio não é envolvida na operação. A fila de transmissão do banco de dados que hospeda o serviço de recebimento só será envolvida se a fila de destino estiver OFF.

Confira também