You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Google App Engine Shim/NDB中间件的作用及代码运行疑问

关于Google App Engine NDB中间件的疑问解答

问题背景

我有一个以微服务形式编写的同步服务,按照Google Cloud的说明添加了底部的NDB中间件(Shim),但不清楚它的作用,同时想确认:当访问/keepalive/路径时,底部的中间件代码是否处于可用且在内存中的状态?

相关代码

app.route('/keepalive/', methods=['GET'])
def keepalive():
    collection_dbs, collection_cursor = model.Collection.get_dbs(
        order='name'
    )
    ...
    return 'ok'

...

import google.appengine.api

client = ndb.Client()
def ndb_wsgi_middleware(wsgi_app):
    def middleware(environ, start_response):
        with client.context():
            return wsgi_app(environ, start_response)

    return middleware

app.wsgi_app = ndb_wsgi_middleware(google.appengine.api.wrap_wsgi_app(app.wsgi_app))

1. NDB WSGI中间件的作用

NDB是Google Cloud Datastore的ORM框架,所有NDB操作(比如你代码里的get_dbs())都必须在NDB上下文环境中执行,这个中间件的核心就是为每个请求自动注入这个上下文:

  • 请求级资源隔离:对每个进来的WSGI请求,通过client.context()创建专属的NDB上下文,确保NDB的连接、缓存、事务等资源仅与当前请求绑定,避免不同请求之间的状态互相干扰。
  • 自动资源清理:请求处理完成后,上下文会自动关闭,清理临时连接、请求级缓存等资源,防止内存泄漏。
  • 运行环境适配:google.appengine.api.wrap_wsgi_app负责将你的WSGI应用适配到App Engine的运行环境,中间件在此基础上叠加NDB的上下文管理,让NDB能在App Engine runtime中正常工作。

2. 访问/keepalive/时中间件的状态

是的,中间件代码会一直处于可用且驻留内存的状态:

  • 服务启动时,client = ndb.Client()会被初始化一次,后续所有请求复用这个单例客户端实例。
  • ndb_wsgi_middleware包装后的app.wsgi_app是服务的核心请求处理入口,会一直驻留在内存中,处理所有进来的请求(包括/keepalive/)。
  • 每次访问/keepalive/时,请求都会先经过中间件的middleware函数,进入NDB上下文后才执行你的视图函数——这也是你的get_dbs()能正常运行的前提,如果没有这个中间件,NDB操作会直接抛出上下文缺失的错误。

内容的提问来源于stack exchange,提问作者ffejrekaburb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 03:15:03