【问题标题】:How does Multitenancy work in App Engine with Objectify?多租户如何在带有 Objectify 的 App Engine 中工作?
【发布时间】:2011-08-20 19:28:20
【问题描述】:

应用引擎中带有命名空间的多租户如何工作? 我的应用程序有多个用户,每个用户有点像多租户中的租户。 他们的 URL 以 domain/customer/companyToken#pageName?param1&param2 开头。 因此,如果我想对每个客户应用带有命名空间的多租户,请参阅 Google 文档 您需要为每个客户分配 NamespaceManager 的唯一 ID 所以像下面这样:

NamespaceManager.set(request.getServerName());

现在我有几个问题。

  1. App Engine 的命名空间多租户如何真正发挥作用?

  2. 它一般如何改变我们访问数据的方式?

  3. 它如何改变我们使用 Objectify 访问数据的方式?

  4. 首先我对应用上述应用的理解是,在检索数据时,与上述客户(租户)相关的所有数据都聚集在同一个命名空间中,那么我们访问数据的方式如何使用客观化?目前公司 obj 是所有与客户相关的 obj 的父对象。 (所以如果是我的申请?)

非常感谢您。

【问题讨论】:

    标签: java google-app-engine multi-tenant objectify


    【解决方案1】:
    1. Google AppEngine 不是开源的,所以只有 Google 真正知道它在内部是如何工作的。但是有一些关于如何在内部构建数据存储的公开数据:http://www.youtube.com/watch?v=tx5gdoNpcZM。基本上所有 AppEngine 数据都在一个表中(是的,所有 AppEngine 应用程序都在一张表中)分布在多台计算机上。每个实体都有唯一标识它的键(id、父级,你可以在你的应用程序中看到),但也有一个数据告诉实体属于哪个应用程序。此数据是 AppEngine 内部的,用户看不到它。我的猜测是这部分也被扩展为包含命名空间数据。

    2. 没有。 Datastore API 是命名空间感知的,因此您的所有代码都保持不变。它在内部知道一个实体属于哪个命名空间。

    3. Objectify 建立在底层 Datastore API 之上,因此答案与 2 相同。

    4. 命名空间划分数据:一旦您设置了命名空间,Datastore API 将只能看到在此命名空间下添加的实体。

    【讨论】:

    • 感谢您的精彩回复。我仍然不太确定#2。那么“内部知道一个实体属于哪个命名空间”的真正含义是什么?它没有关于实体关系的任何信息(在我的情况下,公司 obj 是父级,用户 obj 属于该公司等)所以当我像往常一样使用 Objectify 查询公司的用户时,命名空间如何识别这家公司作为母公司和属于这家公司的用户等?谢谢。
    • 设置命名空间并保存一些实体 - 现在这些实体属于此命名空间(因为 Datastore API 可识别命名空间)。切换命名空间并尝试获取相同的实体(通过密钥) - 找不到它们。
    • 基本上,命名空间感知意味着数据存储将命名空间数据保存到实体键中。我们只是看不到这一点,因为它没有通过公共 API 公开。如前所述(在视频中),实体密钥还包含应用程序 ID(在密钥 API 中也不可见) - 这就是 GAE 知道哪些实体属于您的应用程序的方式。
    • 您对 (1) 的回答不正确:App ID 和 Namespace 都是实体键的一部分。
    • 是的,我相信我说过,但在应用 ID 和命名空间在 Key 中不公开可见的部分是不正确的。实际上,在 Java 中,appID 是不可见的,只有命名空间。
    【解决方案2】:
    1. 在数据存储的存储级别,命名空间就像一个应用 ID。每个命名空间本质上都将数据存储区视为应用程序数据的另一个视图。这就是为什么像查询这样的操作不能跨越命名空间(至少现在是这样)。甚至每个命名空间的 id 范围也不同。

    2. 您需要知道您真正使用的是哪个命名空间。例如一旦创建了实体,它的命名空间就不会改变,因此执行 NamespaceManager.set(...) 不会对其键产生影响。与 Query 对象类似。创建查询后,将设置其名称空间。与 MemcacheService 相同。因此,如果您习惯于调用 NamespaceManager.set 而不是从请求开始时,那么了解哪些对象具有哪些命名空间非常重要。

    3. 很难知道 Obectify 如何使用数据存储 API,因此在一个请求中多次更改当前命名空间需要了解 Objectify 如何使用数据存储 API 以确保您不会无意中创建实体在非预期的命名空间中。

    4. 通常,您需要知道 Objectify 何时创建低级 Key、Entity 和 Query 对象,并确保将当前命名空间设置为您想要的命名空间。如果每个请求只有一个命名空间,这很容易。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-25
      • 2021-04-22
      • 2011-06-19
      • 2020-11-17
      • 2014-08-09
      • 2012-02-27
      • 1970-01-01
      • 2016-03-25
      相关资源
      最近更新 更多