Cache Inteligente

Estou pensando aqui:

Tenho 10 máquinas web acessando um contador num banco de dados central.

95% dos acessos vão ser READ, ou seja:

select count(1) from counter;

Seria legal cachear isso, pois o número não muda muito.

Mas como proceder quando alguém faz um insert em counter e eu quero atualizar o número imediatamente para todo mundo ???

A única idéia complicada que eu tive é disparar uma mensagem (talvez uma requisição web) para todas as máquinas dizendo: “Limpem o seu cache agora!”.

Outra possibilidade é limpar o cache apenas na máquina onde o usuário fez o insert, daí pelo menos ele vai ver direito imediatamente.

Alguém já teve esse problema?

Se voce quiser enviar apenas uma notificacao de cache expirado, forcando assim cada maquina a recarregar o cache, o OSCache - http://www.opensymphony.com/oscache/ - da conta facil do recado. Caso voce queira transferir alguma estrutura de dados entre os nos, use o JBossCache - http://www.jboss.org/products/jbosscache .

Ambos sao muito faceis de serem usados.

Quando alguma alteracao (insert / update / delete ) for feita, vc dispara o evento - ou envia o objeto novo - para o resto das maquinas. Note que com o OSCache, cada maquina precisa recarregar os dados, enquanto com o jboss cache, apenas uma maquina (a que efetuou a alteracao) se encarrega de replicar os dados para as outras.

Rafael

Ainda vale a pena dizer que a implementação do JBoss pode apresentar grandes problemas de performance dependendo do caso. Vale a pena fazer um teste, pois o uso de OSCache + uma extensão caseira de propagação pode ser bem melhor sob certas circunstâncias.

Qual caso, por exemplo? De “extensao caseira”, ha alguma disponivel publicamente que vc recomende?

Rafael

Muitos servidores, muitos objetos sendo invalidados por segundo e uma conexão não tão estável entre eles.

Se fosse pública, não era caseira :slight_smile: As que eu vi até hoje de mais interessantes faziam um esquema de notificações em lote ou de priorização de notificações.

Voce precisa de um cache distribuido coerente, opcionalmente com suporte a transações distribuidas.

Hehehe, brincando. Não tem como falar de caching distribuido sem saber os requisitos transacionais de consistencia dos dados que vão ser usados.

Entendo. Agora, vc diz isso referindo-se a um possivel “problema de arquitetura” do jboss-cache?

vai saber se algum postou num blog… :mrgreen:

O pessoal do oscache em si nao parecia - pelo menos a pouco tempo atras - interessado em suportar no core esse tipo de funcionalidade, e no fundo, nao me parece ser algo simples de implementar, de maneira que funcione corretamente (aka, sem ter os problemas do jboss-cache listados por vc )

Rafael

Levando em conta que o negócio é intrinsicamente ligado a performance, sim :slight_smile:

Você está certo e eles também :wink:

Obrigado pelas dicas pessoal.

A minha aplicação por enquanto ainda vai ficar bem folgada rodando numa máquina web só, logo acho que começar usando um cache distribuído é overkill.

Mas eu queria deixar a arquitetura flexível para escalar depois.

Valeu pessoal !

Bom, entao meta uma interface e seja feliz :slight_smile:

Rafael

Se o cache é local apenas, basta você coordenar o update dele com o gerenciamento de transações e locking do banco.

Acredito que até o EHCache deva resolver seu problema com um pé nas costas então, saoj.