Eu tenho um aplicativo de agente de serviços que atualmente possui 5 ou 6 filas em dois servidores.
O fluxo de trabalho geral é:
Servidor A
- O usuário preenche algumas tabelas
- O usuário dispara o procedimento armazenado que coloca uma mensagem em uma fila de cabeçalho indicando que há trabalho a ser feito
- O Broker lê desta fila de cabeçalho e cria um número potencialmente grande de mensagens para enviar ao Servidor B
Servidor B
- Todas as mensagens vão para 1 fila
- Nesta fila, a mensagem é examinada e desagregada, o payload é executado e uma resposta é coletada de outro conjunto de procs/tabelas com as quais interagimos
- A mensagem de resposta é criada e enviada de volta ao Servidor A
Servidor A
- As mensagens de resposta vão para uma fila especial e são usadas para atualizar as tabelas que o usuário preencheu no topo
- As mensagens do diálogo final são lidas da fila do iniciador e usadas para atualizar outra tabela que rastreia o progresso de um registro de cabeçalho (ou seja, 50 de 100 mensagens processadas)
- Quando detectamos que o registro do cabeçalho foi totalmente processado, uma nova mensagem é enviada para outra fila que envia um e-mail de notificação
Recebi uma recomendação para consolidar algumas dessas filas no Servidor A e não tenho certeza de qual é a melhor prática para isso. Duas das filas terão um volume relativamente alto de processamento de mensagens e a fila de e-mail será bem lenta.
Fizemos (eu acho) um bom trabalho de gerenciamento de tipos de mensagens, então teoricamente poderíamos colocar tudo em uma fila e o aplicativo ainda funcionaria.
Existe uma prática recomendada sobre quando manter filas separadas e quando consolidar em um cenário como este?
Esta é uma questão em aberto, sem escolha clara. YMMV então você tem que testar. Aqui está a minha opinião:
Ter uma fila para lidar com tudo é uma boa escolha se você quiser controlar o número de tarefas ativadas, pois não há max_queue_readers globais. Fora isso, não vejo muitas vantagens. Pode-se argumentar que um único proc ativado é mais fácil de manter, mas acho que você deve usar algum tipo de geração de modelo/código ao criar o processo ativado por SSB, já que normalmente muito é código padronizado e pouco é específico para a lógica de negócios do serviço.
No entanto, posso ver vários problemas em potencial com uma única fila, e são todos os tipos de problemas que se manifestam apenas quando as coisas já estão indo mal (ou seja, sob estresse/carga):
Em geral, minha recomendação é ter uma fila para cada serviço.