【发布时间】:2021-03-12 11:50:27
【问题描述】:
我有一个带有 postgres 的 RDS 实例,我通过 IAM 用户进行身份验证。密码是每 15 分钟刷新一次的令牌:
authToken, err := rdsutils.BuildAuthToken(Endpoint, "mars-east-4", "iamuser", envCredentials)
if err != nil {
return "", err
}
但是我已经看到连接池在令牌过期后引发身份验证错误的问题,并且我没有找到任何好的方法。
我的想法是创建一个函数GetPool并将其注入我的存储库,该函数将返回一个池对象pgxpool.Pool:
func (p Pool) GetPool() (*pgxpool.Pool, error) {
config, err := p.getConfig()
if err != nil {
return nil, err
}
pool, err := pgxpool.ConnectConfig(context.Background(), config)
if err != nil {
return nil, err
}
return pool, nil
}
getConfig 内部将调用BuildAuthToken,但仅每 15 分钟一次(伪代码):
if time > 15minutes {
return BuildAuthToken()
}
因此,如果 15 分钟过去了,我将重新验证令牌,否则我将使用我已经拥有的令牌。 这将是最终的解决方案
func (p Pool) GetPool() (*pgxpool.Pool, error) {
// Pseudocode
if p.time < 15minutes {
return p.Pool, nil
}
config, err := p.getConfig()
if err != nil {
return nil, err
}
pool, err := pgxpool.ConnectConfig(context.Background(), config)
if err != nil {
return nil, err
}
p.Pool = pool
p.time = time.Now()
return pool, nil
}
那么这种方法效率低吗?有更好的方法吗?另外,由于我将在服务器中使用它,竞争条件如何? 谢谢
【问题讨论】:
标签: go amazon-rds