4

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

NamespaceManager.set(request.getServerName());

现在我有几个问题。

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

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

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

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

非常感谢你。

4

2 回答 2

6
  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 将只能看到在此命名空间下添加的实体。

于 2011-05-08T08:12:45.930 回答
2
  1. 在数据存储的存储级别,命名空间就像一个 app-id。每个命名空间本质上都将数据存储视为应用程序数据的另一个视图。这就是为什么像查询这样的操作不能跨越命名空间(至少现在是这样)。甚至每个命名空间的 id 范围也不同。

  2. You need to be aware of which namespace you're really using. e.g. Once an entity is created, it's namespace does not change, so doing a NamespaceManager.set(...) will have no effect on its key. Similarly with a Query object. Once a query is created, its namespace is set. Same with MemcacheService. Hence it's important to know which objects have which namespaces if you're in the habbit of calling NamespaceManager.set more than from the beginning of the request.

  3. It's hard to know how Obectify uses the datastore API, so changing the current namespace multiple times in one request needs to be done with the knowledge of how Objectify uses the datastore API to ensure you don't inadvertently create entities in unintended namespaces.

  4. In general, you meed to know when Objectify creates the low level Key, Entity and Query objects and make sure that the current namespace is set to the namespace you intend. It's easy if there is ever only one namespace per request.

于 2011-05-08T21:41:49.563 回答