我有一个带有 postgres 的 RDS 实例,我通过 IAM 用户进行身份验证。密码是每 15 分钟刷新一次的令牌:
authToken, err := rdsutils.BuildAuthToken(Endpoint, "mars-east-4", "iamuser", envCredentials)
if err != nil {
return "", err
}
但是,我已经看到令牌过期后连接池引发身份验证错误的问题,并且我没有找到任何好的方法。
我在想的是创建一个函数GetPool
并将其注入到我的存储库中,这个函数将返回一个 Pool 对象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
}
那么这种方法效率低吗?有更好的方法吗?谢谢