【发布时间】:2017-10-25 23:27:28
【问题描述】:
我正在 Google App Engine Python 标准环境中使用 Flask 构建一个 API,该 API 通过多个域提供服务。
API 可用于存储数据和获取数据。
我想使用云数据存储的多租户仅在由访问 API 的域确定的命名空间中存储或获取数据。
我能看到的唯一方法是使用 google.appengine.api.namespace_manager 在请求时或在 I/O 时在上下文管理器中设置命名空间。
我写了这个上下文管理器:
@contextmanager
def multitenancy_namespace(namespace):
original_namespace = namespace_manager.get_namespace()
if namespace:
new_namespace = to_namespace_safe_url(namespace)
namespace_manager.set_namespace(new_namespace)
yield
namespace_manager.set_namespace(original_namespace)
它按预期工作。
我担心的是namespace_manager的范围。我找不到任何关于此的文档。
如果我的 API 被超过 1000 个用户线程化并同时使用,假设 namespace_manager.set_namespace(...) 设置的命名空间是全局的,我预计会发生一些冲突 - 数据存储在错误的命名空间中,因为之后另一个请求称为 set_namespace第一个请求,但在第一个请求执行 I/O 之前。
我写了一个线程测试 here 并通过了,它告诉我 namespace 的范围至少仅限于单个线程(这对于我的 Flask 应用程序来说已经足够了)。
但是namespace_manager 的上下文是什么? set_namespace 实际上是做什么的?命名空间设置保存在哪里?是否有可能发生命名空间冲突的用例?
【问题讨论】:
标签: python python-2.7 google-app-engine google-cloud-datastore