Мы работаем над переносом нашего бэкенда из стандартного appengine (и фреймворка "webapp2") в гибкий с использованием пирамиды. У нас есть доказательство того, что сорта работают без особых проблем. Все, что он делает на этом раннем этапе, это принимает запросы от третьей стороны ("pings"), а затем go запускает задачу в другой внутренний сервис для go извлечения некоторых данных. Он подключается к GoogleStore Google Store, чтобы кэшировать идентификатор пользователя, чтобы указать, что мы уже загрузили данные пользователей (или попытались) за последние 6 часов.
Говоря о 6 часах, кажется, что каждые 6 часов или около того, использование памяти на экземпляре Flexible кажется переломным, а затем, вероятно, сбрасывается, и все снова в порядке. Для этого экземпляра установлено 512 МБ памяти, но, как по маслу, он делает это на 800 МБ (что-то вроде льготного использования? Или, может быть, их нельзя установить ниже 1 ГБ)
По тому, как постепенно он движется, становится ясно, что память очищается не так часто, как следовало бы. Когда это происходит, задержка в экземпляре также резко возрастает.
Я не уверен, что полезно для отладки чего-то подобного, поэтому я попытаюсь показать, что я могу.
Appengine YAML file:
runtime: custom
env: flex
service: ping
runtime_config:
python_version: 3.7
manual_scaling:
instances: 1
resources:
cpu: 1
memory_gb: 0.5
disk_size_gb: 10
Dockerfile (как требуется для гибкого пользовательского интерфейса)
FROM gcr.io/google-appengine/python
RUN virtualenv /env
ENV VIRTUAL_ENV /env
ENV PATH /env/bin:$PATH
ADD requirements.txt /app/requirements.txt
RUN pip install -r /app/requirements.txt
ADD . /app
RUN pip install -e .
CMD gunicorn -b :$PORT main:app
Почему заказной? Я не мог заставить это работать при стандартной Python среде выполнения. pip install -e .
был тем, что казалось необходимым.
Затем, в root __init__
у меня есть:
from pyramid.config import Configurator
from externalping.memcache import CacheStore
cachestore = CacheStore()
def main(global_config, **settings):
""" This function returns a Pyramid WSGI application.
"""
with Configurator(settings=settings) as config:
config.include('.routes')
config.scan()
return config.make_wsgi_app()
Возможно, так рано было определено соединение с MemoryStore, возникает проблема ? Cachestore:
class CacheStore(object):
redis_host = os.environ.get('REDISHOST', 'localhost')
redis_port = int(os.environ.get('REDISPORT', 6379))
client = None
def __init__(self):
self.client = redis.StrictRedis(host=self.redis_host, port=self.redis_port)
def set_json(self, key, value):
self.client.set(key, json.dumps(value))
return True
def get_json(self, key):
return json.loads(self.client.get(key))
На самом запросе, после импорта from externalping import cachestore
, я просто вызываю методы, показанные выше: cachestore.client.get(user['ownerId'])
Это похоже на то, как Google документация говорит, чтобы реализовать это, насколько я могу судить. Разница лишь в том, что я надеваю обертку.