【问题标题】:Setting up a golang API that queries a database every hour to refresh its data设置一个每小时查询一次数据库以刷新其数据的 golang API
【发布时间】:2021-07-16 01:11:59
【问题描述】:

我对 golang 比较陌生,可以使用一些关于如何构建它的高级技巧。我正在尝试构建一个 REST API:

  • 用户将通过 POST 方法提供一个小的 JSON 负载
  • API 将用户的输入数据与存储为结构切片的参考数据集进行比较并计算一个值
  • 这个值返回给用户
  • 每小时查询一个数据库,并用另一个结构数据集切片替换结构数据集切片。基本上这会刷新参考数据
  • 我希望这项令人耳目一新的工作是异步的,这样它就不会降低用户体验

我正在使用 golang 的 Echo 框架 (https://echo.labstack.com/)。这是我在类似 golang 的伪代码中的尝试。 您将如何构建此 API 以每小时异步刷新数据?

为了澄清,我坚持的部分是“在后台每小时异步查询数据库”位。我不确定在那种情况下如何做到这一点。

func main() {

    e := echo.New()
    e.POST("/", func(something) {
        
        // This func queries the DB and saves reference dataset result as a slice of structs
        dataset := refreshDB() 

        // Does some calculations on input JSON data and reference dataset
        result := doCalcs(inputJSON, dataset)

        // Prep response in neat JSON
        responseForUser := prepOutput(result)

        return responseForUser
    
    })
    
}

【问题讨论】:

    标签: rest go asynchronous


    【解决方案1】:

    对于 Go 中的异步代码,您可以使用 goroutine,要定期执行代码,您可以使用 ticker

    package main
    
    import (
        "fmt"
        "time"
        "sync"
    )
    
    var rwm sync.RWMutex
    var sliceOfStructs []struct{/* ... */}
    
    func main() {
        go func() {
            tick := time.NewTicker(time.Hour)
            for range tick.C {
                rwm.Lock()
                sliceOfStructs = []struct{}{ /* refresh with new data */ }
                rwm.Unlock()
            }
        }()
        
        // start server
    }
    
    • 如果需要跨多个包访问sliceOfStructs,则需要将其导出并将其移至非主包,即可以导入的包。对rwm 执行相同的操作。
    • 确保读取 sliceOfStructs 的任何代码在读取前调用 rwm.RLock,并在完成后调用 rwm.RUnlock
    • 如果您有多个 goroutine 需要编写 sliceOfStructs,那么您应该将 rwmsync.RWMutex 更改为 sync.Mutex

    【讨论】:

    • 听起来这个“ticker”概念正是我想要的。 go 中类似 cron 的功能。
    • @Slyron time.Ticker 对于简单的东西来说已经足够了,但是如果你在 Go 中需要真正的 cron 功能,你可以去 github 并选择多个实现中的一个。 robfig/cron package 就是一个很好的例子。
    猜你喜欢
    • 1970-01-01
    • 2021-11-07
    • 2022-08-22
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多