Protocolos de comunicação do Service Broker
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 freqüentemente 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 seqüência. A camada de protocolo de diálogo gera números seqüenciais 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ção. 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ção 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ção é 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ção existe para o tempo de vida da conversação.
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 as conexões de rede do Service Broker. O Service Broker mantém a conexão de rede enquanto as mensagens são ativamente trocadas. O Service Broker fecha a conexão de rede quando nenhuma mensagem é enviada ou recebida pela rede por um pequeno período de tempo.
Protocolo de transporte
A camada de protocolo de transporte controla a transmissão de rede atual. Essa 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 consulte Como ativar o sistema de rede do Service Broker (Transact-SQL).
Processamento de mensagens do Agente de Serviços
O Service Broker usa duas categorias distintas de mensagem. Uma mensagem seqüenciada é uma mensagem que deve ser entregue a um aplicativo, exatamente uma vez, em ordem. Uma mensagem não seqüenciada é uma mensagem que pode ser processada imediatamente, sem considerar a seqüência de chegada da mensagem.
O Service Broker usa mensagens seqüenciadas 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 seqüenciada tem um número de seqüência. A instância que origina a mensagem cria o número de seqüência de mensagem e atribui o número de seqüência à mensagem. O agente receptor usa o número de seqüência da mensagem para ordenar as mensagens que fornece a um aplicativo. Para um determinado diálogo, o aplicativo sempre recebe a mensagem com o número de seqüência mais baixo primeiro. O Service Broker também usa o número de seqüência da mensagem 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 seqüência, a camada de protocolo de diálogo considera as mensagens como duplicadas e descarta uma.
O Service Broker usa mensagens não seqüenciadas para mensagens de confirmação dedicadas e mensagens de erro criadas pelo Service Broker. O Service Broker não toma nenhuma precaução especial para entregar uma mensagem não seqüenciada. Observe, entretanto, que o Service Broker cria mensagens não seqüenciadas em resposta a mensagens de entrada. Portanto, se a mensagem não seqüenciada for perdida, o remetente tentará novamente a mensagem original; o receptor, então, gerará outra mensagem não seqüenciada.
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 alcance o destino. O Service Broker pode enviar um fragmento que contenha a mensagem pequena completa entre os fragmentos de uma grande mensagem. 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 status é definida como 2 (desativada). Esse valor também é usado para mensagens recebidas fora de ordem.
Confirmação de mensagem
O Service Broker confirma 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ção. Se nenhuma outra mensagem estiver pronta ser enviada, o Service Broker retornará uma mensagem de confirmação dedicada. A confirmação de mensagem é controlada completamente 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 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 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 não é aprovada na verificação de integridade. O SQL Server descarta a mensagem e não confirma a mensagem para o 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 Agente de Serviços
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ção 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 quando solicitado por um diálogo pela primeira vez. O Service Broker usa o mesmo objeto de transmissão para solicitações subseqüentes do 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.
Observe que a conversação é uma conexão persistente e lógica. A conversação 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.