Estou depurando em um site onde nosso aplicativo é executado em um cluster de failover de 3 nós com um grupo de cluster MSMQ para enfileiramento de mensagens. Estamos vendo que o sistema funciona em algumas combinações de nós, mas não em todos, portanto, a segurança de failover não é tão boa quanto pretendido.
O problema está no recebimento de mensagens da fila clusterizada.
Quando nosso aplicativo é executado no nó B ou C do cluster, ele funciona independentemente do nó em que o MSMQ está sendo executado (funciona = nosso aplicativo recebe mensagens). Quando nosso aplicativo é executado no nó A, ele falha porque o serviço de fila de mensagens não está disponível, independentemente de onde o MSMQ está sendo executado.
Para confundir ainda mais as coisas, criei um pequeno serviço proxy WCF-MQ com um cliente GUI, que me permite enviar um comando para o serviço, que então enviará ou receberá de uma fila de mensagens conforme especificado pelo cliente - e dê o máximo de feedback possível no processo. O padrão é o mesmo com este aplicativo, exceto que o nó onde ele falha é o nó C - independentemente de onde o MSMQ está em execução.
Aqui estão algumas das coisas que verifiquei:
- O serviço (nosso aplicativo) é executado nas mesmas contas de usuário de domínio em todos os três nós.
- O arquivo de configuração do aplicativo contém o mesmo caminho para a fila de mensagens.
- Os direitos de acesso à fila: todos têm controle total.
- O serviço MSMQ local está em execução em todos os nós e certifiquei-me de que as filas locais não tenham o mesmo nome das filas em cluster.
- O firewall está desabilitado em todos os nós.
- O nó A é diferente de B e C porque possui uma conexão de rede extra na mesma sub-rede que a rede do cluster. Então, quando eu faço ping no nó B, ele responde na interface "errada". Não tenho certeza se isso importa, mas é um pouco estranho.
- A opção de serviço "Usar nome de rede para nome de máquina" não parece mudar nada. Meu serviço de proxy informa o nome da máquina percebida e, para o nó A, ele sempre retorna o nome do grupo de clusters; nos nós B e C, ele sempre retorna o nome do nó.
- O grupo de cluster MSMQ usa uma unidade iscsi compartilhada para armazenamento.
Sou apenas um desenvolvedor, e não um especialista em infraestrutura da Microsoft, então gostaria de perguntar: quais são as etapas recomendadas ao depurar uma configuração MSMQ agrupada como esta?
Responder1
Ok, depois de várias semanas depurando isso sozinho e junto com a equipe de suporte do Message Queue da Microsoft, uma solução foi encontrada.
TLDR; a solução é remover ou renomear a chave de registro
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\<SERVICENAME>\Environment
A razão para o erro é que o cliente MQ não consegue encontrar um serviço MQ no sistema local - e isso é necessário para se comunicar com um MQ remoto - como um serviço SMTP local encaminhando seus e-mails para sistemas remotos. Entretanto, o sistema local não é o nó do cluster neste caso, mas o "grupo de clusters" e não há nenhum serviço MQ em execução no grupo de clusters (porque não é um sistema real, apenas um alias). A razão pela qual o cliente MQ procura um serviço no grupo de clusters é que a caixa de seleção "Usar nome de rede para nome do computador" foi marcada nas configurações do serviço de cluster. Isso adiciona um novo valor no registro dos nós do cluster, definindo o ambiente para o serviço. E o verdadeiro problema é que quando esta caixa de seleção está desmarcada, ela não remove o valor do registro, impossibilitando efetivamente a limpeza adequada da configuração (na GUI) depois de definida. Portanto, a solução é excluir o valor manualmente com regedit ou regedt.