【发布时间】:2020-04-09 10:31:55
【问题描述】:
我正在尝试将我们的代码迁移到 Cloud NDB。我们为每个客户提供单独的命名空间。
如何安全地为每个请求切换命名空间?
我已经像migration documentation 上的示例那样实现了 Flask 中间件
命名空间是客户端的属性。所以当一个请求进来时,我从accesstoken中判断出email,并判断这个用户属于哪个命名空间。然后我更改了客户端的命名空间。
恐怕这个 client.namespace 属性不是线程安全的。而且我不希望用户看到彼此的数据。
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
def switch_user(email):
client = context_module.get_context().client
client.namespace = determine_namespace(email)
我可以将客户端的创建移动到中间件中,但我已经阅读过这会产生很多我们想要避免的开销。 命名空间不应该是上下文而不是客户端的属性吗?
【问题讨论】:
-
您可以考虑按需为特定命名空间创建客户端,然后缓存以供重用。您设想有多少可能的租户。您能否指向定义命名空间的客户端的端点?
-
我可以在缓存中保留几个客户端。但我们有数百名租户。我真的不明白你的最后一个问题。也许我应该在 github 中为 ndb 库创建一个问题。
标签: google-cloud-datastore app-engine-ndb