Извлечение переменной memcache при каждом запросе вызывает проблемы

#java #google-app-engine

# #java #google-app-engine

Вопрос:

Я использую GAE memcache для извлечения логического значения при каждом запросе. Это логическое значение является флагом для включения / отключения определенного URL-адреса.

Если значение true, все работает как обычно, если false, то он отправляет ответ определенного формата.

Служба обслуживает около 7 запросов в секунду, и проблема в том, что Google, похоже, ввел ограничения на доступ к memcache, и теперь эта выборка постоянно терпит неудачу со скоростью около 1 запроса в секунду с нескольких дней назад, поэтому этот процесс стал совершенно ненадежным. Мне пришлось сделать экстренное исправление, чтобы удалить эту проверку из кода. Но мне нужна альтернативная процедура для включения / выключения службы.

Использование переменной экземпляра сервлета — это вариант, но каждый экземпляр jvm будет иметь свой собственный, поэтому он не может работать.

Кто-нибудь может предложить способ сделать это?

Комментарии:

1. Звучит не очень хорошо! Какой самый простой запрос, который у вас может быть, который все еще показывает проблему? Что, если весь ваш запрос состоял только из получения этого значения memcache. Проблема все еще возникает? Какую среду выполнения вы используете и как выглядит ваш вызов memcache?

2. Присутствуют ли какие-либо предупреждения о вашем приложении в консоли администратора во время / после этого?

Ответ №1:

Нет никаких ограничений (кроме проверки работоспособности) на то, как часто вы можете получать доступ к memcache. В любом случае, однако, вы никогда не должны полагаться исключительно на memcache для хранения значения; у вас всегда должен быть запасной вариант для механизма постоянного хранения, такого как хранилище данных.

Ответ №2:

Для обеспечения согласованности может быть лучшей идеей использовать хранилище данных / транзакцию вместо memcache.

Чтобы уменьшить задержку хранилища данных / транзакции, вы можете попробовать смешать методы memcache и хранилища данных / транзакции. Например

 # while reading status 
# 1. try to read from memcache
# 2. if memcache exists, return the value
# 3. if not, read from datastore, save to memcache, and return

# while writing status
# 1. use a transaction to write data to datastore and memcache
 

Комментарии:

1. Это уже то, как это работает. Логическое значение memcache сохраняется в хранилище данных, если оно еще не существует, как вы и указали. Это не значит, что значение не находится в memcache, возвращающем значение null, на самом деле оно не может извлечь его из memcache и выдает исключение. Это работало нормально, и никогда не случалось раньше, пока около 2 дней назад. Если я повторно извлеку это возникающее исключение memcache, это будет просто слишком дорого, так как это будет происходить слишком часто.