AWS RDS Postgres、GORM 和瞬态错误

Posted

技术标签:

【中文标题】AWS RDS Postgres、GORM 和瞬态错误【英文标题】:AWS RDS Postgres, GORM and transient errors 【发布时间】:2022-01-15 09:42:47 【问题描述】:

我正在使用 Golang、GORM 和云数据库 (AWS RDS Postgres)

考虑到这一点,我们都知道瞬态错误在云环境中是自然的和预期的,因此数据库操作应该对此类错误具有弹性。 也就是说,GORM/sql 驱动程序是否提供了这种开箱即用的机制或任何内置支持来确定哪些错误可以安全重试? 还是我需要手动处理弹性策略和重试逻辑? 如果是这样,是否有任何特定于 golang 的流行库/工具可供选择?

【问题讨论】:

【参考方案1】:

如果你使用的是 GORM,你可以使用内置的错误处理,比如

if err := db.Where("name = ?", "jinzhu").First(&user).Error; err != nil 
  // error handling...

这是list of o all the possible GORM errors to handle

这是一个使用 GORM 重试连接到 SQL 服务器的示例。

type errorLogger func(err error, msg string)

// NewPostgresDb creates a db instance, if connection fails, panics. With re-try functionality.
// logger may be nil.
func NewPostgresDb(connectionUrl string, retries int, logger errorLogger) *gorm.DB 
    var db *gorm.DB
    var err error
    db, err = gorm.Open("postgres", connectionUrl)
    for err != nil 
        if logger != nil 
            logger(err, fmt.Sprintf("Failed to connect to database (%d)", retries))
        
        if retries > 1 
            retries--
            time.Sleep(5 * time.Second)
            db, err = gorm.Open("postgres", connectionUrl)
            continue
        
        panic(err)
    
    db.SingularTable(true)
    return db

【讨论】:

所以我需要手动处理错误,我的意思是,没有内置的方法来处理众所周知的瞬态错误,检查 postgres 错误代码?? 您可以查看以下内容:github.com/craigmj/golly

以上是关于AWS RDS Postgres、GORM 和瞬态错误的主要内容,如果未能解决你的问题,请参考以下文章

在另一个 AWS 账户中创建 RDS/Postgres 副本?

如何从 aws rds 导出 postgres 数据库

静态static 和瞬态transient关键字

持久和瞬态对象 - 对术语感到困惑

弹性和瞬态故障处理库Polly

如何仅提取 AWS RDS(Postgres 数据库)中的更改数据(CDC)并将更改数据转储到另一个 RDS postgres 实例?