【问题标题】:cloud ndb namespace per request每个请求的云 ndb 命名空间
【发布时间】: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


【解决方案1】:

此问题已在 python-ndb 库中修复 https://github.com/googleapis/python-ndb/pull/388

nampespace 属性已移至上下文级别,因此我现在可以根据请求更改它。 它已在 1.2.0 版中修复

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-03
    • 2011-03-23
    • 1970-01-01
    • 2013-07-21
    • 2014-11-20
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多