3

Мы использовали некоторые устаревшие данные Datastore в нашем приложении Python для Google AppEngine. Я проверил журнал и увидел следующее предупреждение в запросах, которые должны были обновить соответствующие данные:Ошибка Memcache set_multi() в приложении Google AppEngine с ndb

Memcache set_multi() error: [':part', ':full'] 

Запись в журнале была произведена после ndb.put(). Исключений не было, только это silent выход журнала. Однако модель не была записана в хранилище данных. Это повторялось несколько раз в четыре раза.

Чтобы быть точным, я не уверен на 100%, если журнал был создан во время put() моей модели или впоследствии, в то время как GAE сохраняет appstats для этого конкретного запроса. Кроме того, в этом журнале говорится, что наша memcache заполнена, я не понимаю, что это проблема (кеши, как ожидается, будут заполняться время от времени, верно?).

Тем не менее, во всех случаях, когда этот журнал был создан, put() не записывал данные в хранилище данных, и я не могу определить, почему это произошло. Если ndb.put() не удалось, я ожидал бы какого-то рода или ошибки/исключения, поднятых (мой код обрабатывает их), но предупреждение было тихо.

Любые предложения?

+0

В Документах 'Возвращаемое значение представляет собой список ключей, значения которых не были установлены. По общему успеху этот список должен быть пустым. «Хорошо, так могут быть значения для этих ключей не разборчивы? Кроме того, NDB использует атомарные транзакции, которые могут включать необходимость записи в memcache для работы, так что все действия по экономии могут работать. – timkofu

+0

Часть memcache должна быть прозрачной за API-интерфейсом ndb. Я не использую memcache явно. Я использую только ndb, а файл AFAIK ndb.put() не указывает, что произойдет, если что-то не удастся. – Christos

+0

Вам не нужно явно использовать его, но он используется, и если он завершен в атомарной операции, тогда сохраняется операция сохранения. Попробуйте отключить кеш для бит https://cloud.google.com/appengine/docs/python/ndb/cache#policy_functions. Атомная транзакция тогда не понадобится для записи кэша. Затем он должен сохранить данные. Если он работает, найдите способы убедиться, что кеш не заполняется и снова активировать кеширование. – timkofu

ответ

1

Вы можете отключить memcache в NDB Context class. Этот SO ответ показывает, как включить/отключить: кэша памяти ndb Models are not saved in memcache when using MapReduce

Этот код отключает все кэширование:

ndb_ctx = ndb.get_context() 
ndb_ctx.set_cache_policy(lambda key: False) 
ndb_ctx.set_memcache_policy(lambda key: False) 
Смежные вопросы