我正在考虑一个多租户环境,我可以让每个租户访问不同的子域,然后根据该域分配命名空间。
例如,
tenantA.mydomain.com
tenantB.mydomain.com
然后我希望所有tenantA数据都有tenantA
,所有tenantB数据都有tenantB
。
从文档中,听起来我会在appengine_config.py
文件中完成此操作并执行以下操作:
from google.appengine.api import namespace_manager
def namespace_manager_default_namespace_for_request():
this_namespace = get_namespace_from_subdomain()
return this_namespace
第一个问题,这是一个合理/好的方法吗?
第二个问题,目前还不清楚这个范围内有哪些变量可用 - 关于如何实现get_namepsace_from_subdomain()函数的任何指针?
最后,如果我想提供的某些功能可以跨越名称空间,那么仍然可以使用全局名称空间实现这一功能吗?例如,假设用户在多个租户中拥有一个帐户,我想在所有租户中查看他的活动。
答案 0 :(得分:2)
在您的应用中基于子域使用多租户是可能且合理的,但根据我的经验,您还应该允许使用url参数覆盖命名空间。
e.g。
tenantB.mydomain.com/?tenant=tenantA => namespace=tenantA
这将使您的生活变得更加轻松,并且可以让您在将它们投入生产之前在* .appspot.com上测试最新的appengine版本(特别是如果您计划进行SSL访问)。
设置命名空间后,只有该命名空间下的实体可用,您可以随时通过代码更改命名空间 - 范围无关紧要。 对于子域 - 您可以从客户端的请求标头中解析出来。
您可以将任何想要的内容写入全局命名空间,并随时通过代码访问它。对于您描述的方案,您需要将用户活动保存在全局命名空间中。
另外,在官方python示例中使用来自GAE团队的命名空间的战利品。 https://github.com/GoogleCloudPlatform/appengine-guestbook-namespaces-python 它为您提供了入门所需的一切。
答案 1 :(得分:1)
我不认为这是最好的方法。这种方法的问题在于,您在某种程度上将应用程序与基础架构紧密结合在一起。域和子域只是访问绑定到特定IP地址的计算机的一种更简单的方法。我会将域名归类为基础架构的一部分,而不是应用程序的一部分。如果您采用上述方法,则会在应用程序中引入一些有关基础结构的知识,从而降低应用程序的灵活性。如果由于某种原因,您将来某个时候决定您的客户A应该使用clientA.mydomain.com会发生什么?或者keyClientA.myotherdomain.com怎么样?或者您希望如何允许您的客户A使用他们的域名,即support.clientA.com?如果您的应用程序对域和基础架构设置一无所知,那么重新配置DNS服务器并获得可移植性要容易得多。
如果我有这种情况,我会将某种URL映射到租户ID,然后使用该租户ID作为命名空间名称。这样,您可以轻松地将不同的URL映射到租户ID。您甚至可以将多个URL映射到同一个租户ID,并在多个URL上公开相同的应用程序。您的映射可以存储在简单的配置文件中,甚至可以存储在全局命名空间内的AppEngine数据存储区中。如果配置存储在AppEngine数据存储区中,您可以使用应用程序的管理部分(甚至是另一个AppEngine模块)来实时更新配置。