Spymemcached и сбои подключения

Я, хотя Spymemcached пытается восстановить соединение с сервером, когда это соединение теряется.

Но я вижу нечто иное; интересно, что я неправильно понимаю или что я делаю неправильно. Вот пример кода:

 MemcachedClient c=new MemcachedClient(AddrUtil.getAddresses("server:11211"));
while(true)
try {
    System.out.println(c.get("hatsts"));
    Thread.sleep(10000);
} catch(Exception e) {
    e.printStackTrace();
}

Сначала запускается без проблем. Затем выдергиваю сетевой штекер. Впоследствии клиент обнаруживает сбой сети и выдает следующее исключение:

net.spy.memcached.OperationTimeoutException: Timeout waiting for value

Но затем, когда я восстанавливаю сеть, клиент не восстанавливается и продолжает выдавать исключение; даже через 5 мин. Я пробовал SpyMemcached 2.10.6 и 2.9.0.

Что мне не хватает?


person Klaus    schedule 11.03.2014    source источник


Ответы (1)


Проблема здесь в том, что, поскольку вы вытащили сетевой кабель, сокет tcp на вашем клиенте все еще считает, что соединение действительно. Время поддержания активности TCP варьируется от операционной системы к операционной системе и может достигать 30 минут. В результате приложение (в данном случае Spymemcached) не уведомляется уровнем tcp о том, что соединение больше не действительно, и поэтому Spymemcached не пытается повторно подключиться.

Spymemcached обнаруживает эту ситуацию, подсчитывая количество последовательных тайм-аутов операций. В последний раз, когда я проверял значение по умолчанию, было 99. По истечении этого количества операций Spymemcached снова подключится. Вы можете изменить это значение в ConnectionFactory, если хотите установить для него другое значение. Есть функция getContinuousTimeout(), из которой Spymemcached по умолчанию получает 99. Вы можете создать свой собственный ConnectionFactory с помощью ConnectionFactoryBuilder.

Надеюсь, этой информации достаточно, чтобы ответить на ваш вопрос и направить вас в правильном направлении. Если нет, дайте мне знать, и я могу добавить некоторые подробности.

person mikewied    schedule 12.03.2014
comment
Верно. При использовании net.spy.memcached.spring.MemcachedClientFactoryBean свойство, которое необходимо настроить, называется timeoutExceptionThreshold. Я установил его на 10 и увидел, что переподключение к Memcached происходит хорошо. - person Klaus; 12.03.2014