为了账号安全,请及时绑定邮箱和手机立即绑定

redigo:正在拨号 tcp:连接:无法分配请求的地址

redigo:正在拨号 tcp:连接:无法分配请求的地址

Go
当年话下 2022-01-17 18:18:02
我有一个应用程序每秒对 redis 进行大约 400 次读取和每秒 100 次写入(托管在 redislabs 上)。该应用程序使用github.com/garyburd/redigo包作为 redis 代理。我有两个函数,它们是唯一用于读写的函数:func getCachedVPAIDConfig(key string) chan *cachedVPAIDConfig {    c := make(chan *cachedVPAIDConfig)    go func() {        p := pool.Get()        defer p.Close()        switch p.Err() {        case nil:            item, err := redis.Bytes(p.Do("GET", key))            if err != nil {                c <- &cachedVPAIDConfig{nil, err}                return            }            c <- &cachedVPAIDConfig{item, nil}        default:            c <- &cachedVPAIDConfig{nil, p.Err()}            return        }    }()    return c}func setCachedVPAIDConfig(key string, j []byte) chan error {    c := make(chan error)    go func() {        p := pool.Get()        defer p.Close()        switch p.Err() {        case nil:            _, err := p.Do("SET", key, j)            if err != nil {                c <- err                return            }            c <- nil        default:            c <- p.Err()            return        }    }()    return c}如您所见,我正在使用推荐的连接池机制(http://godoc.org/github.com/garyburd/redigo/redis#Pool)。我在应用程序的端点收到的每个 http 请求上调用这些函数。问题是:一旦应用程序开始获取请求,它立即开始抛出错误dial tcp 54.160.xxx.xx:yyyy: connect: cannot assign requested address(54.160.xxx.xx:yyyy是redis主机)我在 redis 上看到,当这种情况开始发生时,只有大约 600 个连接,这听起来并不多。我尝试使用 的MaxActive设置pool,将其设置在 1000 到 50K 之间的任何位置,但结果是一样的。有任何想法吗?
查看完整描述

1 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

  1. 您在通道上发送后关闭连接,如果通道阻塞,您没有关闭连接,这将导致您看到的错误。所以不要只是推迟,明确地关闭连接。

  2. 我认为这不是问题,但无论如何都是一个好主意 - 为您的连接设置超时DialTimeout

  3. 确保你有一个适当的TestOnBorrow函数来摆脱死连接,特别是如果你有超时。如果连接空闲超过 3 秒,我通常会执行 PING(函数接收空闲时间作为参数)

  4. 尝试设置MaxIdle为更大的数字,我记得通过增加池中的参数来解决池化问题。


查看完整回答
反对 回复 2022-01-17
  • 1 回答
  • 0 关注
  • 263 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信