我看了 grpc-go-pool 的一些问题
来源:1-9 将用户的grpc连接配置到全局共用
城中城
2022-12-20 14:34:39
p := &Pool{
clients: make(chan ClientConn, capacity), // 创建 channel
factory: factory, // 这是 连接 grpc 的方法
idleTimeout: idleTimeout, // 这是 设置 超时时间
}
if len(maxLifeDuration) > 0 {
p.maxLifeDuration = maxLifeDuration[0] // 获取 最大寿命
}
for i := 0; i < init; i++ {
c, err := factory(ctx) // 执行 连接 grpc 的方法
if err != nil {
return nil, err
}
p.clients <- ClientConn{ // 将 ClientConn 存储到 channel 中
ClientConn: c, // c 是 grpc 的 conn
pool: p, // 这里存储的是指针 所以不会报错 我的理解就是 方便后续调用
timeUsed: time.Now(), // 存储 使用的时间
timeInitiated: time.Now(), // 存储 初始化的时间
}
}
// Fill the rest of the pool with empty clients
for i := 0; i < capacity-init; i++ { // 这里 应该 channl 还有多余的容量 所以随便填充一下
p.clients <- ClientConn{
pool: p,
}
}
这是 NewWithContext 方法的代码
我有一个疑问 就是 它的init 和 capacity 这2个值 好像意义不大
为什么让我有这个感觉 在于 以下代码
Close 方法中
wrapper := ClientConn{
pool: c.pool,
ClientConn: c.ClientConn,
timeUsed: time.Now(),
}
if c.unhealthy { // 如果 不健康 关闭连接
wrapper.ClientConn.Close()
wrapper.ClientConn = nil
} else {
wrapper.timeInitiated = c.timeInitiated
}
select {
case c.pool.clients <- wrapper:
// All good
default:
return ErrFullPool
}
这里 的代码 说明
只要 我们多使用它的 连接池(没设置超时时间的情况下)
ClientConn 将全都是 连接中的状态 而不会去释放掉 就算后面不再使用的 也不会断开连接
我的疑问就是 NewWithContext 方法中 init 和 capacity 这2个参数中 init 岂不是很没用
1回答
这个库可以先不用看了,grpc已经支持连接池了, 第二季的grpc源码分析部分中有从源码角度讲解这个问题
相似问题