【问题标题】:What is the scope of the Google App Engine api's namespace manager?Google App Engine api 的命名空间管理器的范围是什么?
【发布时间】: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


    【解决方案1】:

    如果您查看namespace_manager.set_namespace(...)source code,您会发现它是通过将命名空间设置为环境变量来实现的:

    def set_namespace(namespace):
      """Set the default namespace for the current HTTP request.
      Args:
        namespace: A string naming the new namespace to use. A value of None
          will unset the default namespace value.
      """
      if namespace is None:
        os.environ.pop(_ENV_CURRENT_NAMESPACE, None)
      else:
        validate_namespace(namespace)
        os.environ[_ENV_CURRENT_NAMESPACE] = namespace
    

    当线程切换上下文时,AppEngine 会根据需要备份和恢复环境变量。它们保证是请求有界的,因此它对用户的代码是不透明的。我不记得是否有这方面的文档,我想我是在某个论坛帖子中了解到的。

    Set the default namespace for the current HTTP request 的评论暗示了这一点。

    我们在www.myclasses.org 使用了几年,从来没有出现过问题。

    放心吧,在多线程环境中使用它是安全的!

    【讨论】:

    • 在文档中肯定没有看到类似的东西,感谢您的解释!
    • 年,有点棘手。不过,对该方法的评论有点保证:“”“为当前 HTTP 请求设置默认命名空间。”“”
    猜你喜欢
    • 2023-03-09
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 2017-07-01
    相关资源
    最近更新 更多