Pergunta

Olhando para o futuro, quando uma fazenda da web será criada ...

Temos vários aplicativos de serviço do Windows executando várias tarefas de fundo: enviando e-mails, arquivos de miniatura/processamento etc.

Em um ambiente agrícola de servidor, poderíamos, em teoria, instalar e executar cada serviço em cada máquina, no entanto, pode haver conflitos devido a um objeto de negócios baseado em objeto "primeiro gravação vencedor" ou duplicação indesejável de tarefas, por exemplo: os mesmos e-mails que estão sendo enviados para enviar um número de vezes.

O cenário "First-Write-Wins" pode ser superado por meio de código ou lógica que resolve o problema ou pula o item. (Se for um mecanismo básico de filas (lista de consultas e registro de processo), ele será apenas tentado novamente)

Para a duplicação de tarefas, pode -se executar tarefas em transações para impedir que outros processos pegam os mesmos recursos, mas acho que eles apenas esperam e precisaríamos lidar com algum login com base nas coisas que acontecem novamente? Seria esse o caso?

Para evitar a duplicação de tarefas, estou pensando em talvez construir algum mecanismo que grava uma "bandeira de travamento" no banco de dados que será definido pelo primeiro serviço que aciona. Este sinalizador será datado e referenciará a instância do serviço. O serviço que "possui" o sinalizador executará as tarefas e atualizará periodicamente esta data. Também haverá uma configuração de tempo limite/tolerância em cada serviço na situação em que o serviço não possui o sinalizador, ele verificará a tolerância e assumirá o controle, se necessário.

Isso soa como uma solução ressonável ou deve -se ir para uma solução melhor baseada em filas de mensagens nesse estágio (também não tenho certeza de como isso funcionaria em um ambiente agrícola?

Tecnologies: C# / Asp.net / SQL Server

Foi útil?

Solução

Eu posso pensar em dois mecanismos.

  1. Se todas as suas tarefas forem derivadas de atividades de banco de dados, você poderá criar uma nova tabela "tarefas" e definir gatilhos nas atividades para que um novo registro com as informações da tarefa seja inserido. Seus serviços do Windows podem pesquisar a tabela "tarefas" e usar uma transação atômica de seleção e excluir para garantir que apenas um serviço faça.

  2. Você pode usar uma fila de mensagens e soltar suas tarefas e, em seguida, fazer com que o Windows Services faça uma pesquisa na fila. Cada mensagem na fila só poderá ser descentada por um único serviço, para que você possa garantir que cada tarefa seja realizada apenas uma vez. É claro que você precisa se preocupar com a carga na sua fila de mensagens. Dependendo do seu aplicativo, você pode usar algo como o serviço de filas simples da Amazon que aliviaria você ter que se preocupar com confiabilidade e escalabilidade.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top