Maior disponibilidade
Como Chris menciona, seu servidor de API é o ponto único de falha no seu layout. O que você está configurando é uma infraestrutura de enfileiramento de mensagens, algo que muitas pessoas já implementaram antes.
Continue no mesmo caminho
Você menciona o recebimento de solicitações no servidor 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 deles aceitar comandos diretamente de seus Usuários da API. Você pode usar algo tão simples quanto o DNS de rodízio para distribuir cada conexão de usuário da API diretamente a um dos nós de trabalho disponíveis (e tentar novamente se a conexão não for bem-sucedida).
Use um servidor de fila de mensagens
Infraestruturas de enfileiramento de mensagens mais robustas usam software projetado para esse fim, como o ActiveMQ . Você pode usar a API RESTful do ActiveMQ para aceitar solicitações POST dos usuários da API, e os trabalhadores ociosos podem receber 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 tratador
Como meio termo, convém observar o Zookeeper , mesmo que não seja especificamente um servidor de fila de mensagens. Usamos $ work para esse fim exato. Temos um conjunto de três servidores (análogo ao servidor de API) que executam o software do servidor Zookeeper e temos um front-end da 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 se um servidor estiver inativo para manutenção. Quando o trabalho é concluído, o trabalhador 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
- Certifique-se de que os trabalhos sejam concluídos no caso de um trabalhador não responder
- Como a API saberá que um trabalho está concluído e para recuperá-lo do banco de dados do trabalhador?
- Tente reduzir a complexidade. Você precisa de um servidor MySQL independente em cada nó de trabalho, ou eles podem conversar com o servidor MySQL (ou o MySQL Cluster replicado) nos servidores da API?
- Segurança. Alguém pode enviar um emprego? Existe autenticação?
- Qual trabalhador deve conseguir o próximo emprego? Você não menciona se as tarefas devem levar 10 ms ou 1 hora. Se eles forem rápidos, remova as camadas para manter a latência baixa. Se eles forem lentos, você deve ter muito cuidado para garantir que solicitações mais curtas não fiquem atrasadas em algumas solicitações demoradas.