dimensionamento automático de piscina consumidor
-
16-09-2019 - |
Pergunta
Nós temos uma aplicação web que permite que os usuários desencadear um pedido para um recurso externo. O recurso externo gasta uma quantidade indeterminada de tempo para reunir os resultados, então temos que pesquisar para obter atualizações, e para recolher os resultados finais quando eles são feitos.
Queremos fazê-lo de modo que quando o usuário aciona o pedido, ele é adicionado a uma fila e, em seguida, um número de segmentos de trabalho vai pegar cada pedido e fazer o voto, enquanto o usuário faz outras coisas.
Uma vez que o número de pedidos variam muito durante o dia, nós figuramos seria um desperdício de recursos para ter muitos trabalhadores que não fazem nada quando é lento, mas ao mesmo tempo precisamos ter trabalhadores suficientes para lidar com o pico carga no sistema.
Nós gostaríamos algo que poderia acrescentar mais trabalhadores quando há uma grande quantidade de pedidos em espera, mas matar trabalhadores quando há pouco a fazer.
É / era possível fazer isso com EJB, mas nós não queremos usar isso. Nós também não quer usar JMS ou outras estruturas de grande escala para lidar com isso, a menos que seja uma que já está usando (Spring, Quartz, um monte de coisas Apache).
Como EJB tem suporte para isso, e é uma das características mais úteis encontrados lá, nós imaginamos que alguém já tenha resolvido este problema para nós. Sugestões?
Solução
Use a ThreadPoolExecutor
com valores apropriados para núcleo e tamanho máximo de piscina.
Tenha em mente que não há um custo enorme em ter várias centenas de segmentos ociosos para que você poderia considerar apenas usando Executors.newFixedThreadPool()
.
Outras dicas
A partir da java.util.concurrent.ThreadPoolExecutor
documentação :
Se a piscina tem atualmente mais de tópicos corePoolSize, tópicos excesso será encerrada se tiverem sido inativo por mais do que o KeepAliveTime (veja getKeepAliveTime (java.util.concurrent.TimeUnit)). Isto fornece um meio de reduzir o consumo de recursos quando a piscina não está sendo usado ativamente. Se a piscina se torna mais ativo depois, novos tópicos será construído.
então, gostaria de sugerir, você tenta a biblioteca padrão Java em primeiro lugar. Você terá que ajustar os parâmetros de um pouco, mas as piscinas de rosca é altamente configurável como ela é.