我们正在使用金字塔将我们的后端从 appengine 标准(和“webapp2”框架)迁移到灵活。我们有一个看似没有很多问题的概念证明。它在这个早期阶段所做的只是接受来自第三方的请求(“ping”),然后将任务启动到另一个内部服务以获取一些数据。它与谷歌的 MemoryStore 连接以缓存用户 ID,以表明我们已经在过去 6 小时内获取(或尝试获取)该用户数据。
说到 6 小时,似乎每 6 小时左右,Flexible 实例上的内存使用量似乎达到了一个临界点,然后可能会刷新,一切又恢复正常。此实例设置为具有 512MB 内存,但就像发条一样,它在大约 800MB 时执行此操作(某种宽限使用?或者这些不能设置为低于 1GB)
很明显,它的移动是多么缓慢,记忆并没有像应该的那样经常被清除。发生这种情况时,实例上的延迟也会激增。
我不确定调试这样的东西有什么用,所以我会尽力展示我能做的。
Appengine YAML 文件:
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 .
似乎是需要的。
然后,在根__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 的连接是问题所在?缓存存储:
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))
在实际请求本身上,在 import 之后from externalping import cachestore
,我只是调用上面显示的那些方法:cachestore.client.get(user['ownerId'])
据我所知,这似乎是谷歌文档所说的实现这一点的方式。唯一的区别是我在它周围放了一个包装器。