我看了 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回答

bobby

2022-12-20

这个库可以先不用看了,grpc已经支持连接池了, 第二季的grpc源码分析部分中有从源码角度讲解这个问题

0

Go开发工程师

未来3-5年企业高性能项目不可替代的语言,从基础到项目实战再到重构,真正从入门到精通

508 学习 · 577 问题

查看课程