Pergunta

Temos um servlet que ocupa mais memória virtual no servidor devido a lógica que tem. Por esta razão, nós gostaríamos de limitar as solicitações simultâneas para esta digamos servidor, por exemplo, nós só gostaria 10 solicitações simultâneas processados. As outras solicitações têm de esperar na fila.

Pode um pool de threads costume ser criado e atribuir para este servlet para lidar com este cenário? Estamos usando servidor WebLogic 9.2. Ou há qualquer outra abordagem melhor de fazer isso? Apreciar quaisquer pensamentos.

Foi útil?

Solução

Pode um pool de threads costume ser criado e atribuir para este servlet para lidar com este cenário? Estamos usando servidor WebLogic 9.2. Ou há qualquer outra abordagem melhor de fazer isso? Apreciar quaisquer pensamentos.

Sim, isso é possível. Em vez de usar o padrão de auto-ajuste gerenciador de trabalho (começando com Weblogic 9.x, executar filas são substituídos por gestores de trabalho para pools de threads 1 ), você pode criar um gerenciador de trabalho com específica restrições como o max-threads-constraint e possivelmente o capacity. Você pode então atribuir um servlet para um gerente trabalho específico usando o -dispatch-política wl do arquivo weblogic.xml descritor de implementação.


1 Note que ainda é possível permitir WebLogic 8.1 segmento pool de modelo e usar Executar filas.

Outras dicas

Você precisa de algo na frente ou na máquina que hospeda o servlet porque quando as solicitações de bater a máquina, é um pouco tarde demais: os recursos já estão sendo usados. Você não pode controlar a demanda lado: você só pode reagir a isso e plano para ele

.

Você precisa provavelmente um balanceador de carga software ou hardware dependendo de suas necessidades alvo. O software balanceador de carga pode ser simplesmente um "servlet dispatcher" com controle de sessão (por exemplo, 10 simultâneo a servlet X).

Há uma outra possibilidade: você "acelerador" os solicitantes emitindo um código HTTP apropriado. Claro, isso significa lógica adicional no lado do solicitante ... e ele ainda consome alguns recursos no lado do servidor.

Você poderia carregar-equilíbrio tal que há um servidor secundário que processa todas as solicitações para o servlet caro.

Você poderia ter um contador estático, e um servlet que apenas atua como uma porta de entrada para a chamada de método caro. Você só precisa lidar com uma condição de corrida, provavelmente em este contador estático.

Assim, você iria transformar seu servlet atual em uma chamada de método.

Então, o servlet gateway irá obter o pedido, ver se o contador é baixa o suficiente e, em seguida, incremento. Se mais de 10, em seguida, retornar alguma mensagem de erro.

Esta não é uma situação ideal, mas se você colocar as coisas em uma fila, em seguida, navegadores vão começar a tempo limite depois de um tempo, ou os usuários ficam impacientes e clique no botão enviar mais e mais, como ele está demorando muito.

Se você poderia usar javascript para enviar o pedido, em seguida, existem algumas soluções melhores que podem ajudá-lo.

Sem o uso de balanceadores de carga etc., parece-me que pretende dissociar o pedido do processamento.

por exemplo.

  1. o navegador envia uma solicitação. O servlet leva-lo, as filas lo e mãos para trás um bilhete.
  2. O servlet irá trabalhar sobre este pedido trabalho como recursos permitir (usando um pool de thread separada puxando os itens de trabalho da fila).
  3. O navegador pode atualizar (re-GET), utilizando o bilhete, e o servlet irá retornar um resultado adequado (por exemplo, não processamento, processamento, processado).

Este é bastante um padrão comum. Note que o navegador não está bloqueada, mas apenas despacha o pedido e, em seguida, regularmente realiza verificações para ver se o item de trabalho está completo. Eu usei isso com sucesso (por exemplo) na situação em que eu tive usuários pedindo gráficos que levam 5 minutos ou mais para processar, e que usou uma biblioteca nativa que não foi thread-safe. Nesse cenário I estiveste para restringir o processamento de um único segmento, independentemente do número de solicitações simultâneas.

Eu gosto da idéia de usar contra estática e redirecionando para mostrar uma mensagem de erro quando o contador chegar além de um limite.

Podemos configurar um servlet separado e configurar o pool de threads para permitir que apenas um número X de solicitações simultâneas, todos os outros pedidos seriam colocados em fila para usar a próxima servlet disponível. Será que esta abordagem lançar um erro de tempo limite? você pode agradar a compartilhar mais detalhes em torno deste? Graças

http://download.oracle.com /docs/cd/E13222_01/wls/docs92/perform/appb_queues.html

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