Vantagens do Service Broker

Os recursos do Agente de Serviços fornecem uma série de importantes benefícios para os aplicativos de banco de dados. Esses recursos e benefícios incluem:

  • A integração de banco de dados aprimora o desempenho do aplicativo e simplifica a administração.

  • Ordenação e coordenação de mensagens para um desenvolvimento de aplicativo simplificado

  • O acoplamento flexível de aplicativo fornece flexibilidade da carga de trabalho.

  • O bloqueio relativo de mensagem permite que mais de uma instância de um aplicativo processe mensagens da mesma fila sem sincronização explícita.

  • A ativação automática permite que os aplicativos escalem com o volume da mensagem.

Integração de Banco de Dados

O design integrado do Agente de Serviços fornece benefícios para o desempenho e a administração de um aplicativo.

A integração com o SQL Server permite sistema de mensagens transacionais sem a sobrecarga e a complexidade de um coordenador de transações distribuídas externo. O aplicativo recebe uma ou mais mensagens, processa a mensagem ou mensagens e envia uma mensagem de resposta em uma transação única de banco de dados. Se a transação falhar, todo o trabalho será revertido e a mensagem recebida será retornada para a fila, de modo que outra tentativa possa ser feita para processá-la. Nenhuma ação entrará em vigor até que o aplicativo confirme a transação. O aplicativo permanece em um estado consistente.

A administração é mais fácil quando os dados, as mensagens e a lógica de aplicativo estão todos no banco de dados, porque a administração do aplicativo (recuperação de desastre, segurança, backup, entre outras coisas), por isso, passa a integrar a administração de rotina do banco de dados e o administrador não precisará gerenciar três ou quatro componentes distintos.

Com os sistemas de mensagens tradicionais, o armazenamento de mensagens e o banco de dados podem ficar inconsistentes. Por exemplo, quando um componente é restaurado de um backup, outro componente também deve ser restaurado de um backup feito ao mesmo tempo, senão as informações do armazenamento da mensagem não corresponderão às informações do banco de dados. Como o Agente de Serviços mantém mensagens e dados no mesmo banco de dados, a inconsistência não é problema.

Um ambiente de desenvolvimento comum é igualmente um benefício da integração de banco de dados. A parte do sistema de mensagens de um aplicativo e a parte dos dados do aplicativo podem usar as mesmas linguagens e ferramentas do SQL Server em um aplicativo do Agente de Serviços, usufruindo da familiaridade do desenvolvedor com as técnicas de programação de banco de dados relativas à programação baseada em mensagens. Os procedimentos armazenados que implementam um serviço do Agente de Serviços podem ser criados tanto em linguagem Transact-SQL como em uma das linguagens CLR (Common Language Runtime). Os programas fora do banco de dados usam Transact-SQL e interfaces de programação familiares de banco de dados, como ADO.NET.

Além disso, a integração de banco de dados ativa o gerenciamento automático de recursos. O Agente de Serviços é executado no contexto da instância do SQL Server, de modo que o Agente de Serviços monitora todas as mensagens prontas para serem transmitidas de todos os bancos de dados da instância. Isso permite que cada banco de dados mantenha suas próprias filas, ajudando simultaneamente o Agente de Serviços a gerenciar o uso dos recursos em toda a instância do SQL Server.

Ordenando e coordenando mensagens

Em sistemas de mensagens tradicionais, o aplicativo é responsável por ordenar e coordenar as mensagens que possam chegar fora da ordem. Por exemplo, o Aplicativo A envia as mensagens 1, 2 e 3. O Aplicativo B recebe e reconhece as mensagens 1 e 3, mas apresenta um erro na mensagem 2. O Aplicativo A reenvia a mensagem 2, mas nesse momento a mensagem é recebida após as mensagens 1 e 3. No passado, um desenvolvedor precisava criar o aplicativo de modo que a ordem das mensagens não importasse; ou armazenar temporariamente a mensagem 3 em cache até que a mensagem 2 chegasse, de modo que o aplicativo pudesse processar as mensagens na ordem correta. Nenhuma das soluções é direta ou simples.

Outro problema dos sistemas tradicionais era a entrega duplicada. No exemplo anterior, se o Aplicativo B recebesse a mensagem 2, mas a mensagem de confirmação para o Aplicativo A se perdesse, o Aplicativo A reenviaria a mensagem 2, fazendo com o Aplicativo B recebesse a mensagem 2 duas vezes. O código do aplicativo precisa poder identificar e descartar a duplicata ou reprocessá-la sem efeitos negativos. Novamente, ambas as abordagens eram difíceis de implementar.

A coordenação de mensagens também era, tradicionalmente, um assunto difícil de tratar. Por exemplo, um aplicativo pode enviar centenas ou milhares de solicitações para um serviço. O serviço processa as solicitações em paralelo e retorna a resposta tão logo quanto possível, à medida que o serviço termina de processar a solicitação. Como cada solicitação leva uma quantidade diferente de tempo para ser processada, o aplicativo recebe respostas em uma ordem diferente da ordem em que o aplicativo envia a mensagem de saída. Porém, para processar corretamente as respostas, o aplicativo precisa associar cada resposta à mensagem de partida correta. Nos sistemas tradicionais de mensagens, cada aplicativo gerenciava essa associação, o que aumentava o custo e a complexidade de desenvolver o aplicativo.

O Agente de Serviços resolve esses problemas controlando automaticamente a ordem das mensagens, a entrega exclusiva e identificação da conversação. Após o estabelecimento da conversação entre dois pontos de extremidade do Agente de Serviços, o aplicativo recebe cada mensagem apenas uma vez e na ordem em que ela foi enviada. O aplicativo pode processar mensagens, em ordem, precisamente uma vez, sem código adicional. Ao final, o Agente de Serviços inclui automaticamente um identificador em cada uma das mensagens. O aplicativo sempre poderá indicar a conversação à qual pertence determinada mensagem.

Acoplamento flexível e flexibilidade de carga de trabalho

O Agente de Serviços fornece um acoplamento flexível entre o aplicativo iniciador e o aplicativo de destino. O aplicativo pode enviar uma mensagem em uma fila e depois continuar a processar o aplicativo, contando com o Agente de Serviços para assegurar que a mensagem chegue ao seu destino. Esse acoplamento flexível fornece flexibilidade de programação. O iniciador pode enviar várias mensagens e vários serviços de destino podem processá-las em paralelo. Cada serviço de destino processa as mensagens em seu próprio ritmo, dependendo da carga de trabalho atual.

O enfileiramento também permite que os sistemas distribuam o processamento de modo mais uniforme, reduzindo a capacidade de pico exigida pelo servidor. Isso pode aprimorar a produtividade e o desempenho geral dos aplicativos de banco de dados. Por exemplo, muitos aplicativos de banco de dados têm uma sobrecarga em transações em determinados momentos do dia, o que aumenta o consumo de recursos e retarda os tempos de resposta. Com o Agente de Serviços, esses aplicativos não precisarão realizar todo o processamento de uma transação comercial quando ela é enviada ao aplicativo. Em vez disso, o aplicativo usa o Agente de Serviços para enviar informações sobre a transação para os aplicativos que executam o processamento em segundo plano. Esses aplicativos processam as transações de modo confiável por um período, embora o aplicativo de entrada principal continue a receber novas transações comerciais.

Se o destino não estiver imediatamente disponível, a mensagem permanecerá na fila de transmissão para o banco de dados de envio. O Agente de Serviços tenta enviar a mensagem até que ela seja enviada com êxito, ou até que o tempo de vida da conversação expire, permitindo que uma conversação confiável prossiga entre os dois serviços, mesmo que um serviço esteja temporariamente indisponível em algum ponto durante a conversação. As mensagens da fila de transmissão fazem parte do banco de dados. O Agente de Serviços entrega a mensagem mesmo que a instância falhe ou seja reiniciada.

Bloqueio de mensagem relacionada

Uma das coisas mais difíceis de se conseguir em um aplicativo de sistema de mensagens tradicional sempre foi permitir que vários programas lessem a mesma fila em paralelo. Em sistemas de mensagens tradicionais, as mensagens podem ser processadas fora da ordem quando vários programas ou vários threads lêem a mesma fila. O Agente de Serviços impede que essa situação ocorra realizando bloqueio de grupo de conversação.

Considere um aplicativo de processamento de ordem tradicional. A Mensagem A, contendo instruções sobre como criar o cabeçalho da ordem, e a Mensagem B, contendo instruções sobre como criar os itens de linha da ordem são ambas recebidas na fila. Se essas duas mensagens forem retiradas da fila por instâncias de aplicativo distintas e processadas simultaneamente, a transação do item de linha da ordem pode tentar se confirmar em primeiro lugar e falhar porque a ordem ainda não existe. A falha, por sua vez, faz com que a transação seja revertida e a mensagem seja retirada da fila e processada novamente, desperdiçando recursos. Tradicionalmente, os programadores resolviam esse problema combinando as informações da Mensagem A com as da Mensagem B em uma única mensagem. Embora essa abordagem seja satisfatória para duas mensagens, ela escala incorretamente nos sistemas que envolvem a coordenação de várias ou centenas de mensagens.

O Agente de Serviços resolve o problema associando conversações relacionadas em um grupo de conversação. O Agente de Serviços bloqueia automaticamente todas as mensagens no mesmo grupo de conversação, de modo que as mensagens só possam ser recebidas e processadas por uma instância de aplicativo. Enquanto isso, outras instâncias do aplicativo podem continuar a ser retiradas de filas e a processar mensagens em outros grupos de conversação. Isso permite que várias instâncias de aplicativo paralelas trabalhem de forma confiável e eficaz, sem requerer código de bloqueio complicado no aplicativo.

Ativação automática

Um dos mais úteis recursos do Agente de Serviços é a ativação. A ativação permite que o aplicativo se escale dinamicamente para corresponder ao volume de mensagens que chegam à fila. O Agente de Serviços fornece recursos que aceitam programas executados dentro do banco de dados e programas executados fora do banco de dados para se beneficiar da ativação. No entanto, o Agente de Serviços não exige que o aplicativo use a ativação.

O Agente de Serviços controla a atividade em uma fila para determinar se o aplicativo está recebendo mensagens de todas as conversações com mensagens disponíveis. A ativação do Agente de Serviços inicia um novo Queue Reader quando há trabalho para o Queue Reader executar. Para determinar quando há trabalho para um Queue Reader, O Agente de Serviços controla as atividades da fila. Quando o número de Queue Readers corresponder ao tráfego de entrada, a fila atingirá periodicamente um estado em que ela ficará vazia ou em que todas as suas mensagens pertencerão a uma conversação em processamento em outro Queue Reader. Se uma fila não corresponder a esse estado por um determinado período, o Agente de Serviços ativará outra instância do aplicativo.

Os aplicativos usam diferentes abordagens de ativação com relação aos programas executados no banco de dados e programas que são executados fora do banco de dados. Com relação aos programas do banco de dados, o Agente de Serviços inicia outra cópia do procedimento armazenado especificada pela fila. Com relação aos programas executados fora do banco de dados, o Agente de Serviços gera um evento de ativação. O programa monitora esse evento para determinar quando outro Queue Reader será necessário.

O Agente de Serviços não interrompe um programa iniciado por ativação. Em vez disso, os aplicativos ativados são criados para encerrar automaticamente após determinado período, sem que nenhuma mensagem de entrada seja recebida. Um aplicativo projetado dessa forma pode permitir que o número de instâncias de aplicativo cresça ou diminua dinamicamente à medida que o tráfego para o serviço seja alterado. Da mesma forma, se o sistema fechar ou for reinicializado, os aplicativos serão reiniciados automaticamente para ler as mensagens na fila quando o sistema se reiniciar.

Os sistemas de mensagens tradicionais não têm esse comportamento e, com freqüência, terminam tendo recursos excessivos ou escassos para uma determinada fila em um dado período.