Pergunta

Meu aplicativo faz solicitações de Serviço da Web;há uma taxa máxima de pedidos o provedor irá lidar, então eu preciso do acelerador-los para baixo.

Quando o aplicativo é executado em um único servidor, eu costumava fazer isso no nível do aplicativo:um objeto que mantém o controle de quantas solicitações foram feitas, e aguarda-se a solicitação atual faz com que ele excede o máximo permitido de carga.

Agora, estamos migrando a partir de um único servidor a um cluster, de forma que há duas cópias do aplicativo em execução.

  • Eu não posso manter a verificação para a carga máxima no código da aplicação, porque os dois nós combinado pode exceder o permitido carregar.
  • Eu simplesmente não é possível reduzir a carga em cada servidor, porque se o outro nó é ocioso, o primeiro nó pode enviar mais solicitações.

Este é um JavaEE 5 ambiente.Qual é a melhor forma para acelerar os pedidos de aplicação envia ?

Foi útil?

Solução

Se a biblioteca tiver sido excluída por erro pelo usuário, você não pode restaurar isso a partir da reciclagem de coleção?

Outras dicas

Muitas maneiras de fazer isso: você pode ter um "agente de coordenação", responsável por entregar "tokens" aos servidores. Cada "token" representa uma permissão para executar uma tarefa etc. Cada aplicativo precisa solicitar "tokens" para fazer chamadas.

Depois que um aplicativo esgota seus tokens, ele deve pedir um pouco mais antes de prosseguir para chegar ao serviço da web novamente.

Obviamente, tudo isso fica complicado quando há requisitos em relação ao tempo de cada chamada que cada aplicativo faz devido à simultaneidade em relação ao serviço da Web.

Você poderia confiar RabbitMQ Como estrutura de mensagens: as ligações Java estão disponíveis.

Eu recomendo usar BeansTalkd Para bombear periodicamente uma coleção de solicitações (empregos) em um tubo (fila), cada um com um atraso apropriado. Qualquer número de threads ou processos de "trabalhador" aguardará a próxima solicitação disponível e, se um trabalhador terminar cedo, poderá pegar a próxima solicitação. O lado negativo é que não há nenhum equilíbrio explícito de carga entre os trabalhadores, mas descobri que a distribuição de pedidos fora da fila foi bem equilibrada.

Os n nós precisam se comunicar. Existem várias estratégias:

  • Transmissão: Cada nó será transmitido a todos os outros que está matando uma chamada, e todos os outros nós levarão isso em consideração. Os nós são iguais e mantêm a contagem global individual (cada nó sabe sobre a chamada de todos os outros nó).
  • Mestre Nó: Um nó é especial, é o mestre e todos os outros nós pedem permissão do mestre antes de fazer uma chamada. O mestre é o único que conhece a contagem global.
  • Mestre dedicado: o mesmo que o mestre, mas o 'mestre' não faz chamadas no ITSLEF, é apenas um serviço que acompanha as chamadas.

Dependendo de quão alto você prevê escalar mais tarde, uma ou a outra estratégia pode ser melhor. Para 2 nós, o mais simples é transmitido, mas à medida que o número de nós aumenta, os problemas começam a montar (você gastará mais tempo transmitindo e respondendo aos Broadcats do que realmente fazendo solicitações WS).

Como os nós se comunicam, depende de você. Você pode abrir um tubo TCP, você pode usar o Broadcats UDP, fazer um WS totalmente completo para esse fim, pode usar um protocolo de compartilhamento de arquivos. Faça o que fizer, agora você não está mais dentro de um processo, então todo o falácias de computação distribuída Aplique.

Esse é um problema interessante, e a dificuldade da solução depende de um grau sobre como estrita você quer estar na banda.

Meu habitual solução para isso é JBossCache, em parte porque ele vem embalado com o JBoss AppServer, mas também porque ele lida com a tarefa, ao invés de bem.Você pode usá-lo como uma espécie de distribuído hashmap, registrando-se o uso de estatísticas em vários níveis de granularidade.Atualizações pode ser feita de forma assíncrona, para que ele não abrandar as coisas.

JBossCache é normalmente utilizado para serviço pesado, para o cache distribuído, mas eu prefiro ele para estes se tornarem mais leves empregos também.É puro java e não requer o esterco com a JVM (ao contrário de Terracota).

Hystrix foi projetado para praticamente o cenário exato que você está descrevendo. Você pode definir um tamanho de pool de threads para cada serviço, para ter um número máximo de solicitações simultâneas e ele faz as solicitações quando o pool estiver cheio. Você também pode definir um tempo limite para cada serviço e, quando um serviço começar a exceder seu tempo limite, a Hystrix rejeitará mais solicitações a esse serviço por um curto período de tempo, a fim de dar ao serviço a chance de se recuperar. Também há monitoramento em tempo real de todo o cluster através Turbina.

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