Um dos principais problemas com o balanceamento de carga baseado em recursos é que as informações de carga se tornam obsoletas quando você toma a decisão de roteamento. Existe um artigo acadêmico sobre o tópico staleness que você pode querer ler chamado Interpretação da informação de carga do estado . Você pode obter efeitos colaterais desagradáveis, como enviar muita carga para uma caixa que parece subutilizada e sobrecarregá-la. Em suma, o balanceamento baseado em carga parece ser a melhor maneira de fazer isso a princípio para todos, mas acontece que métodos simples tendem a funcionar melhor na prática.
Na maioria dos balanceadores de carga, os algoritmos simples geralmente são bons porque as transações são de curta duração ou causam uma carga tão baixa que uma distribuição aleatória ou round-robin estará perto o suficiente para um bom equilíbrio. Geralmente, há necessidade de sobrecarga para absorver a carga de servidores com falha (se você estiver próximo da utilização máxima em todos os 3, assim que um deles morre, a carga cairá em cascata e você perderá todo o cluster).
Uma solução pode ser criar duas filas, uma para o "material pesado" e outra para o "material leve". Eu chamaria o "material leve" balanceamento de carga e o "material pesado" agendamento de trabalho - em outras palavras, eles parecem ser problemas diferentes. Em seguida, basta limitar o número máximo de sessões para cada cliente e uma fila universal para elas para o planejamento de tarefas. Eu não sei de uma ferramenta ideal para isso fora do topo da minha cabeça embora.