Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Agente de serviços do SQL Server


Os grupos de conversação são local conceito apenas, usado exclusivamente para bloqueio:conversas correlacionadas pertencem a um grupo, de modo que, enquanto você processa uma mensagem em uma conversa, outro encadeamento não pode processar uma mensagem correlacionada. Não há informações sobre grupos de conversa trocados pelos dois endpoints, portanto, em seu exemplo, todos os endpoints do iniciador acabam pertencendo a um grupo de conversa, mas os endpoints de destino são cada um de um grupo de conversa distinto (cada grupo tendo apenas uma conversa). A razão pela qual o sistema se comporta assim é porque os grupos de conversação são projetados para resolver um problema como, digamos, um serviço de reserva de viagem:quando recebe uma mensagem para 'reservar uma viagem', deve reservar um voo, um hotel e um carro aluguel. Ele deve enviar três mensagens, uma para cada um desses serviços ('voos', 'hotéis', 'carros') e então as respostas retornarão, de forma assíncrona. Quando eles voltarem, o processamento deve garantir que eles não sejam processados ​​simultaneamente por encadeamentos separados, que tentariam atualizar o status do registro de 'viagem'. Em mensagens, esse problema é conhecido como 'problema de correlação de mensagens'.

No entanto, muitas vezes os grupos de conversação são implantados em SSB apenas por motivos de desempenho:eles permitem resultados RECEIVE maiores. Os endpoints de destino podem ser movidos juntos em um grupo usando MOVE CONVERSATION mas na prática existe um truque muito mais simples:inverta o rumo da conversa. Tenha seu destino iniciar as conversas (agrupadas) e a fonte envia suas 'atualizações' sobre a(s) conversa(ões) iniciada(s) pelo destino.

Algumas notas:
  • Não use o padrão "dispare e esqueça" de BEGIN/SEND/END. Você está impossibilitando o diagnóstico de qualquer problema no futuro, consulte Dispare e esqueça:bom para os militares, mas não para conversas do Service Broker .
  • Nunca use WITH CLEANUP no código de produção. Destina-se a ações administrativas de último recurso, como recuperação de desastres. Se você abusar dele, nega ao SSB qualquer chance de rastrear adequadamente a mensagem para uma nova tentativa de entrega correta (se a mensagem for rejeitada no destino, por qualquer motivo, ela será perdida para sempre).
  • O SSB não garante a ordem entre as conversas, apenas dentro de uma conversa. Iniciar uma nova conversa para cada evento INSERT não garante a preservação, no destino, da ordem das operações de inserção.