gpt4 book ai didi

google-app-engine - 如何管理 App Engine Go 运行时上下文以避免 App Engine 锁定?

转载 作者:IT老高 更新时间:2023-10-28 13:03:34 29 4
gpt4 key购买 nike

我正在编写一个在 App Engine 的 Go 运行时上运行的 Go 应用程序。

我注意到几乎所有使用 App Engine 服务(例如 Datastore、Mail 甚至 Capabilities)的操作都需要您向它传递一个 appengine.Context 实例,该实例必须使用函数 appengine.NewContext(req *http.Request) Context.

当我为 App Engine 编写此应用程序时,如果我愿意的话,我希望能够轻松快速地将其移动到其他平台(可能不支持任何 App Engine API 的平台)。

因此,我通过围绕任何 App-Engine 特定交互(包括请求处理函数)编写小包装器来抽象出与 App Engine 服务和 API 的实际交互。使用这种方法,如果我确实希望迁移到不同的平台,我只需重写那些将我的应用程序与 App Engine 绑定(bind)的特定模块。简单明了。

唯一的问题是 appengine.Context 对象。我无法将它从我的请求处理程序通过我的逻辑层传递到处理这些 API 的模块,而无需将我的所有代码都绑定(bind)到 App Engine。我可以传递 http.Request 对象,从中可以派生 appengine.Context 对象,但这需要耦合可能不应该耦合的东西。 (我认为最好的做法是让我的应用程序都不知道它是一个 Web 应用程序,除了那些专门用于处理 HTTP 请求的部分。)

想到的第一个解决方案是在某个模块中创建一个持久变量。像这样的:

package context

import (
"appengine"
)

var Context appengine.Context

然后,在我的请求处理程序中,我可以使用 context.Context = appengine.NewContext(r) 设置该变量,并且在直接使用 App Engine 服务的模块中,我可以通过以下方式获取上下文访问 context.Context。没有任何介入代码需要知道 appengine.Context 对象的存在。唯一的问题是 "multiple requests may be handled concurrently by a given instance" ,这可能导致此计划出现竞争条件和意外行为。 (一个请求设置它,另一个设置它,第一个访问它并获取错误的 appengine.Context 对象。)

理论上我可以将 appengine.Context 存储到数据存储区,但是我必须将一些特定于请求的标识符沿逻辑层向下传递到特定于服务的模块,以识别哪个 数据存储区中的 appengine.Context 对象是当前请求的对象,这将再次耦合我认为不应该耦合的事物。 (而且,它会增加我的应用程序的数据存储使用量。)

我还可以将 appengine.Context 对象传递到整个逻辑链,类型为 interface{} 并拥有任何不需要的模块appengine.Context 对象忽略它。这样可以避免将我的大部分应用程序绑定(bind)到任何特定。然而,这似乎也很困惑。

所以,我有点不知所措如何干净地确保需要 appengine.Context 对象的 App-Engine 特定模块可以获取它。希望你们能给我一个我自己还没有想到的解决方案。

提前致谢!

最佳答案

这很棘手,因为您的 self 施加范围规则(这是一个明智的规则)意味着不传递 Context 实例,并且没有类似于 Java 的 ThreadLocal偷偷摸摸地达到同样的目的。这实际上是一件好事,真的。

Context 将日志记录支持(简单)与 Call 结合到 appengine 服务(不容易)。我认为有十个 appengine 函数需要 Context。除了将所有这些包裹在您自己的门面后面之外,我看不到任何干净的解决方案。

有一件事可以帮助您 - 您可以在您的应用中包含一个配置文件,使用某种标志来指示它是否在 GAE 中。您的全局 bool 值只需要存储此标志(不是共享上下文)。在决定是使用 NewContext(r) 来获取 Context 来访问 GAE 服务,还是使用相似结构来访问你自己的替代品时,你的外观函数可以引用这个标志服务。

编辑:作为最后一点,当你解决这个问题时,我可以邀请你分享你是如何做到的,甚至可能是一个开源项目?我厚颜无耻地问,但如果你不问...... ;-)

关于google-app-engine - 如何管理 App Engine Go 运行时上下文以避免 App Engine 锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16826832/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com