Grails + Memcached(ElastiCache) - Erro quando ocorre uma grande quantidade de requisições para um cache com tamanho grande
22/12/2014 10:50
0
Bom dia.

Tenho um sistema que utiliza ElastiCache(Amazon) para evitar leitura repetitiva no banco de dados. Como o número de requisições é alta e a mesma busca é realizada diversas vezes isso economiza preciosos segundos nas requisições.

Para requisições onde o cache é pequeno(22kb) por exemplo, o servidor responde mais de 10 mil requisições por minuto com um tempo de resposta de 300ms.

O problema é quando o cache é maior, em torno de 800kb, que é o maior do sistema. Quando o número de requisições passa de 1 mil por minuto começo a ter problemas.

Estou utilizando a lib disposibilizada pela Amazon baseada na spymemcached e estou a 2 dias tentando encontrar uma solucão. Já realizei testes com a spymemcached oficial e também com a xmemcached.

A opção pela utilização pela lib da Amazon é que com ela, eu simplesmente aponto para o Cluster e os nós são adicionados pela biblioteca, ou seja, só adiciono mais nós no cluster e eles são identificados automáticamente.

Segue o service que implementa as buscas no ElastiCache



import net.spy.memcached.*
import grails.converters.JSON
import org.springframework.beans.factory.InitializingBean

class MemCacheService implements InitializingBean {

String ELASTIC_CACHE_CLUSTER_IP = "teste.ptsfty.cfg.use1.cache.amazonaws.com";
def ELASTIC_CACHE_CLUSTER_PORT = 11211
def MemcachedClient client
def expireTime = 21600

def void afterPropertiesSet() {
client = new MemcachedClient(new InetSocketAddress(ELASTIC_CACHE_CLUSTER_IP, ELASTIC_CACHE_CLUSTER_PORT));
}

def getDataOnCache(key) {
try {
def result = client.get(key)
if (result) return JSON.parse(result)
else return null
} catch(Exception e) {
println e.getMessage()
return null
}
}

def saveOnCache(key, value) {
try {
def result = client.add(key, expireTime, value);
return result
} catch(Exception e) {
println e.getMessage()
return null
}

}

def removeOnCache(key) {
def result = client.delete(key);
return result
}


}





O Erro que ocorre é um Timeout.
java.util.concurrent.ExecutionException: net.spy.memcached.internal.CheckedOperationTimeoutException: Operation timed out.

Alguém mais já passou por esse problema?

Obrigado
Tags: grails memcached spymemcached


Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto