根据我已完成的研究(例如参见this gae issue和this stack overflow question),无法跨两个应用程序共享一个数据存储区,大多数人建议使用RemoteAPI或使用多个"版本"相同的应用程序,其中每个版本实际上是一个完全不同的应用程序。根据{{3}},允许多个GAE应用程序共享相同的数据存储区已被接受"这可能意味着有一天可能会正式支持此功能。
我对使用RemoteAPI犹豫不决,因为我怀疑在应用程序中响应时间非常重要的部分会对我造成性能损失。所以我想知道是否有人使用在相同应用程序ID下使用多个版本的方法来共享相同的数据存储区?如果是这样,您是否能够评论您是否发现了这种方法的任何问题?据推测,这并不违反GAE许可条款,这些条款通常禁止多个不同的应用程序表现得像一个应用程序?
大卫
更新:我尝试了这种方法,并有一些可能的问题来报告这种方法。在我的本地GAE实例(在端口8080和8081上)将我的两个应用程序部署为同一个应用程序的两个版本时,在我停止/启动它之前,我用其他应用程序看不到我用一个应用程序进行的更新。我在appspot.com上看不到这种行为。我认为这里更广泛的问题是我假设高复制数据存储具有与传统SQL数据库类似的事务属性。发生的事情是,一个应用程序提交更改的时间与其他应用程序可以读取更改之间似乎存在显着延迟。想知道是否有办法有效地冲洗"您的更改,或清除某处的缓存,以便让一个应用程序提交的提交显示在另一个应用程序的查询中。或者也许我在错误的兔子洞里咆哮......
答案 0 :(得分:6)
使用多个版本是一种很好的方法,并且服务条款没有问题 - 但是您可能无法仅使用免费配额为多个应用程序提供全天候服务
请注意,这意味着在更新应用时必须格外小心使用正确的版本,并且您无法轻易地将版本同时用于其他目的,因为该版本现在是用户使用的URL的一部分访问应用程序。
此外,无法区分不同版本的管理控制台权限。
最后,可能有一些仅适用于默认版本的调度程序功能(可能是实例控件?);我不是回答这个问题的合适人选。
答案 1 :(得分:1)
与持久层和数据存储区交互的代码在所有版本中应该是相同的,这是你应该注意的最重要的事情(假设它们在同一组实体上进行操作)。由于数据存储是基于实体的,并且您的应用程序可以管理实体,因此很容易拥有不同的持久性代码并在数据库中创建动态数据库。 UI和业务逻辑层应该没问题。
答案 2 :(得分:0)
没有这样做的一个原因是每个部署都会出现临时中断 - 在关闭运行旧代码的实例和运行新代码的实例之间。无法进行渐进/优雅的流量切换(需要不同的版本)。
偶尔可以延长这些中断,需要人工干预才能恢复,请参阅Continuous integration/deployment/delivery on Google App Engine, too risky?。
另一个原因是将此类基于版本的“应用”映射到自定义域时遇到问题,请参阅How to use custom domain name in google app engine with different versions?
FWIW,这些天实现相同结果的更好方法是为这些“应用”使用不同的服务/模块,请参阅Service isolation。