Pergunta

Preciso replicar uma sequência/contador em um cluster de oito nós. Isso significa que cada solicitação HTTP recebe o próximo valor na sequência chamando algo como getNextIntrandIncrement (), onde o estado da sequência é sincronizado em todos os servidores. Para esclarecer, isso deve existir no Application/Global Scope, não na sessão. Sei que parece uma ideia terrível e, sem dúvida, levará a gargalos, mas esse é o requisito.

Minha pergunta é qual é a melhor solução? Eu olhei para feijões de sessão com estado, mas eles parecem ter sido projetados para apenas um cliente. Eu considerei uma sequência de banco de dados. Eu também olhei para o agrupamento de terracota; Eles têm uma demonstração de sequência http://www.terracotta.org/web/display/orgsite/recipe?recipe=sequencher No entanto, gostaria de evitar soluções de terceiros se existir uma solução J2EE. Estou usando o WebLogic 8.1.

Foi útil?

Solução

Alguns fornecedores de Java EE têm soluções de cache distubadas (por exemplo, a grade de objeto do WebSphere), você já identificou ofertas de terceiros, mas não acredito que exista um padrão portátil.

O que há de errado com a solução de banco de dados? É claro que o bloqueio será necessário, então por que não sair para o banco de dados. Meu palpite é que, se você realmente precisar de verdadeiros valores incrementais, nenhum valores perdidos etc., os relacionamentos transacionais com outros valores do banco de dados serão importantes; portanto, use o banco de dados.

Se você pode relaxar a necessidade de valores sequenetiais absolutos (ou seja. Permitir lacunas), poderá encerrar conjuntos de números e, assim, reduzir bastante a contenção. Se você realmente precisa de valores seqüenciais, sem lacunas, está comprando a necessidade de algum grau de bloqueio entre as instâncias - você não pode permitir que um segundo "thread" obtenha um novo número de sequência até que você "cometa" o uso de o atual. Se você pode se dar ao luxo de perder o número de sequência ímpar, você se sairá muito melhor. Ou se você puder esquemas de numeração independentes entre as instâncias, você está em posições muito melhores. Por exemplo, nome seus servidores A, B, C ... têm IDS A001, A002, B001, C001, C002 etc.

Outras dicas

Eu acho que uma sequência de banco de dados provavelmente daria o resultado mais determinístico, especialmente se você usar transações altamente serralizadas para solicitá-lo.

No entanto, eu questionaria seriamente a validade de fazer algo assim, mas esse é apenas meus 2 centavos.

Você tem WebLogic nas tags para esta pergunta - o WebLogic permite singletons de cluster. por exemplo, uma instância por cluster com suporte de failover.

Isso deve atender à sua exigência:

http://e-docs.bea.com/wls/docs100/javadocs/weblogic/cluster/singleton/singletonservice.html

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