App Engine如何通过Objectify实现多租户?

4

多租户与名称空间在应用程序引擎中是如何工作的? 我的应用程序有多个用户,每个用户都像多租户中的租户一样。 他们的URL以domain/customer/companyToken#pageName?param1&param2开头。 因此,根据Google文档,如果我想将多租户应用于每个客户的名称空间, 您需要为每个客户分配唯一的NamespaceManager ID,类似于以下内容:

NamespaceManager.set(request.getServerName());

现在我有几个问题:
1. App Engine 的 Namespace 多租户实际上是如何工作的? 2. 它如何改变我们通常访问数据的方式? 3. 它如何改变我们使用 Objectify 访问数据的方式? 4. 首先,我的理解是在将数据检索时,与上述客户(租户)相关的所有数据会在同一个命名空间中聚集在一起,那么使用 Objectify 访问数据的方式会怎样改变呢?目前,Company obj 服务于所有与客户相关的 obj 的父对象。(那么在我的应用程序中呢?)
非常感谢您的帮助。
2个回答

6
  1. Google AppEngine不是开源的,因此只有Google真正知道其内部如何工作。但是有一些公开可用的关于数据存储内部构建的资料:http://www.youtube.com/watch?v=tx5gdoNpcZM。基本上,所有AppEngine数据都在一个表中(是的,所有AppEngine应用程序都使用一个表),分布在多台计算机上。每个实体都有一个唯一标识符(id、parent,在您的应用程序中可以看到),但也有一个数据告诉实体属于哪个应用程序。这个数据是AppEngine内部的,用户看不到它。我的猜测是,这部分也扩展了包括命名空间数据。

  2. 不会影响。Datastore API支持命名空间,因此您的所有代码保持不变。它在内部知道实体属于哪个命名空间。

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

  4. 命名空间将数据隔离:一旦设置了命名空间,Datastore API仅查看在该命名空间下添加的实体。


感谢您的回复。我仍然不太确定第二点是什么意思。那么,“内部知道实体属于哪个命名空间”真正意味着什么?它没有任何关于实体关系的信息(在我的情况下,Company obj是父级,User obj属于此公司等)。因此,当我使用Objectify像往常一样查询公司的用户时,命名空间如何识别此公司作为父级以及属于此公司的用户等?谢谢。 - user_1357
1
设置一个命名空间并保存一些实体 - 现在这些实体属于此命名空间(因为Datastore API支持命名空间)。切换命名空间并尝试获取相同的实体(通过键)- 它们将无法找到。 - Peter Knego
基本上,具有命名空间感知能力意味着数据存储将命名空间数据保存到实体键中。我们只是看不到它,因为它没有通过公共API公开。正如提到的(并且这在视频中也有提到),实体键还包含应用程序ID(也不可见于键API)-这就是GAE知道哪些实体属于您的应用程序的方式。 - Peter Knego
1
你对问题(1)的回答是不正确的:App ID和Namespace都是实体键的一部分。 - Nick Johnson
是的,我相信我说过那句话,但在应用程序ID和命名空间不会公开显示在键中这一部分上是错误的。实际上,在Java中,只有命名空间是可见的,而应用程序ID是不可见的。 - Peter Knego

2
  1. 在数据存储层面,命名空间就像一个应用程序ID。每个命名空间实际上都是对数据存储的另一种视图。这就是为什么类似查询之类的操作不能跨越命名空间(至少目前不能)。即使是ID范围也因命名空间而异。

  2. 你需要知道你真正使用的命名空间。例如,一旦实体被创建,它的命名空间就不会改变,所以进行NamespaceManager.set(...)操作对其键没有影响。同样适用于Query对象。一旦查询被创建,其命名空间就被设置了。MemcacheService也是如此。因此,如果你习惯于在请求开始后多次调用NamespaceManager.set,则知道哪些对象具有哪些命名空间非常重要。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接