Maior disponibilidade
Como Chris menciona, seu servidor de API é o único ponto de falha em seu layout. O que você está configurando é uma infra-estrutura de enfileiramento de mensagens, algo que muitas pessoas já implementaram antes.
Continue pelo mesmo caminho
Você menciona o recebimento de solicitações no servidor da API e insere o trabalho em um banco de dados MySQL em execução em cada servidor. Se você quiser continuar nesse caminho, sugiro remover a camada do servidor da API e projetar os Trabalhadores para cada um dos comandos de aceitação diretamente dos usuários da API. Você poderia usar algo tão simples quanto o DNS round-robin para distribuir cada conexão do usuário da API diretamente a um dos nós do trabalhador disponíveis (e tentar novamente se uma conexão não for bem-sucedida).
Use um servidor de filas de mensagens
Infraestruturas de enfileiramento de mensagens mais robustas usam software projetado para esse fim, como ActiveMQ . Você pode usar a API RESTful do ActiveMQ para aceitar solicitações POST de usuários da API, e os funcionários ociosos podem obter a próxima mensagem na fila. No entanto, isso é provavelmente um exagero para suas necessidades - ele foi projetado para latência, velocidade e milhões de mensagens por segundo.
Use o Zookeeper
Como meio-termo, você pode querer olhar para Zookeeper , embora não seja especificamente um servidor de fila de mensagens. Nós usamos em $ trabalho para este fim exato. Temos um conjunto de três servidores (análogos ao servidor da API) que executam o software do servidor Zookeeper e têm uma interface web para lidar com solicitações de usuários e aplicativos. O front-end da Web, bem como a conexão de back-end do Zookeeper com os trabalhadores, têm um balanceador de carga para garantir que continuemos processando a fila, mesmo que o servidor esteja inativo para manutenção. Quando o trabalho é concluído, o funcionário informa ao cluster do Zookeeper que o trabalho está concluído. Se um trabalhador morrer, esse trabalho será enviado para outro trabalho para ser concluído.
Outras preocupações
- Garanta que as tarefas sejam concluídas no caso de um trabalhador não estar respondendo
- Como a API saberá que uma tarefa foi concluída e recuperada do banco de dados do trabalhador?
- Tente reduzir a complexidade. Você precisa de um servidor MySQL independente em cada nó de trabalho, ou eles poderiam conversar com o servidor MySQL (ou MySQL Cluster replicado) no (s) servidor (es) da API?
- Segurança. Alguém pode enviar um emprego? Existe autenticação?
- Qual trabalhador deve obter o próximo emprego? Você não menciona se as tarefas devem levar 10ms ou 1 hora. Se eles são rápidos, você deve remover as camadas para manter a latência baixa. Se eles forem lentos, você deve ter muito cuidado para garantir que pedidos mais curtos não fiquem presos por trás de alguns pedidos de longa duração.