【问题标题】:How can one reuse a database connection in Golang Cloud functions?如何在 Golang Cloud 函数中重用数据库连接?
【发布时间】:2020-08-02 19:01:03
【问题描述】:

我目前正在尝试将我的应用程序迁移到 IBM 云功能,但我面临的一个问题是每次调用操作时都无法重新连接 Postgresql DB。

我发现关于如何在 Go 中重用数据库连接的信息非常少,而且我尝试过的解决方案(将数据库处理程序保存在全局变量中)不起作用。

谁能给我指出正确的文档?

谢谢,

-托马斯

PS:这是一段代码,说明了我尝试的方式:

func Storage() Storager {
    once.Do(func() {
        db := InitDB()
        println("Initiating DB...")
        s = &storage{
            db: db,
        }
    })

    return s
}

// This is declared as a global variable in main
var s = storage.Storage()

【问题讨论】:

  • 在 IBM Cloud Functions 等无服务器框架中,每个函数/操作都是独立运行的。您可以尝试将连接信息作为操作之间的参数传递
  • @data_henrik 实际上,AWS lambda 等其他无服务器提供商允许重用数据库连接以节省计算时间,但谢谢。
  • 有些代码示例使用了相同的概念,依赖于要重用的容器。 thecodebarbarian.com/…就个人而言,我更喜欢干净的方法
  • @data_henrik 这是我最初在帖子中提到的解决方案,但它不起作用

标签: go ibm-cloud serverless openwhisk ibm-cloud-functions


【解决方案1】:

可以在 OpenWhisk 操作中保留全局状态,这适用于 Golang 函数。例如,这里有一个 counter.go 函数,每次调用该函数时都会增加一个全局计数器。

package main

var counter = 1

func Main(args map[string]interface{}) map[string]interface{} {
  msg := make(map[string]interface{})
  msg["counter"] = counter
  counter = counter + 1
  return msg
}

如果您创建此操作并连续运行多次,您将看到计数器值每次都增加。

> wsk action create counter counter.go
> wsk action invoke counter --result
{
  "counter": 1
}
> wsk action invoke counter --result
{
  "counter": 2
}
> wsk action invoke counter --result
{
  "counter": 3
}

因此,您尝试做的事情应该有效。在您的示例中,检查操作是否成功完成并且没有引发错误和失败(这会阻止进一步重用)。此外,检查激活记录以查看激活是热的还是冷的。这可以通过检查激活记录是否有 initTime 注释来指示冷启动来看到。如果不存在,则激活是暖的,并且最新的激活在与之前的激活相同的上下文中运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 2020-05-23
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    相关资源
    最近更新 更多