在重载和大缓存文件上使用memcached(ElastiCache)的grails应用程序超时

时间:2014-12-22 17:11:29

标签: grails memcached spymemcached

我有一个grails应用程序,它使用memcached来存储请求结果。

根据请求,缓存中存储的结果很小(100kb),50K请求正常工作,但在一种情况下,如果结果大约为800kb,则应用程序会在超过1K请求分钟时抛出异常。

我试着在最近两天解决这个问题,但所有答案都没有定论。我开始认为问题出在ElastiCache上。

对于实施,我使用AWS ElastiCache群集客户端,即spymemcached的分支。

我尝试修复将客户端更改为默认的spymemcached和xmemcached,但错误是相同的。

例外是:java.util.concurrent.ExecutionException:net.spy.memcached.internal.CheckedOperationTimeoutException:操作超时。

我的服务实施:

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
    }


}

1 个答案:

答案 0 :(得分:1)

如果Elasticache在连接数增加时停止工作,请尝试增加memcached_connections_overhead参数。您的Elasticache实例可能内存不足,无法处理传入连接。每个实例使用少量内存来处理每个连接,此参数通常具有较低的默认值。