百度app制作网站,仿煎蛋 wordpress,通州企业网站建设,国际新闻今天最新消息什么是 gRPC 客户端连接池#xff1f; 在 gRPC 中#xff0c;创建和维护一个到服务器的连接是非常消耗资源的#xff08;比如 TCP 连接建立和 TLS 握手#xff09;。  而在高并发场景下#xff0c;如果每次请求都创建新的连接#xff0c;不仅会导致性能下降#xff0c;还…什么是 gRPC 客户端连接池 在 gRPC 中创建和维护一个到服务器的连接是非常消耗资源的比如 TCP 连接建立和 TLS 握手。  而在高并发场景下如果每次请求都创建新的连接不仅会导致性能下降还可能耗尽系统资源。  因此客户端连接池的作用是复用一定数量的连接提高资源利用率和性能。  gRPC 客户端连接池的原理 
连接复用池子里的连接使用时取出用完放回控制连接数可以固定数量或动态调整防止建太多连接并发安全 先展示一个基于sync.pool创建的clientPool 
实际上企业不推荐使用sync包里的无锁机制因为sync包里的无锁设计适用于高并发短暂资源的情况而gRPC本身设计初衷是客户端连接是长生命周期需要稳定管理的资源与sync.pool的特性不完全匹配 
因此为了更好实现可以自己加锁设计或者使用第三方库这里举例githubgo-grpc-pool type ClientPool interface {Get() *grpc.ClientConnPut(conn *grpc.ClientConn)
}type clientPool struct {pool sync.Pool
}func GetPool(target string, opts ...grpc.DialOption) (ClientPool, error) {return clientPool{pool: sync.Pool{New: func() any {conn, err : grpc.Dial(target, opts...)if err ! nil {log.Println(err)return nil}return conn},},}, nil
}func (c *clientPool) Get() *grpc.ClientConn {conn : c.pool.Get().(*grpc.ClientConn)if conn.GetState()  connectivity.Shutdown || conn.GetState()  connectivity.TransientFailure {conn.Close()conn  c.pool.New().(*grpc.ClientConn)}return conn
}func (c *clientPool) Put(conn *grpc.ClientConn) {if conn.GetState()  connectivity.Shutdown || conn.GetState()  connectivity.TransientFailure {conn.Close()return}c.pool.Put(conn)
}自己加锁设计 
package mainimport (logsynctimegoogle.golang.org/grpcgoogle.golang.org/grpc/connectivity
)// ClientPool 定义接口
type ClientPool interface {Get() (*grpc.ClientConn, error)Put(conn *grpc.ClientConn)Close()
}// clientPool 是 ClientPool 的实现
type clientPool struct {mu          sync.Mutexconnections chan *grpc.ClientConnmaxSize     intidleTimeout time.Durationtarget      stringopts        []grpc.DialOptionclosed      bool
}// NewClientPool 创建一个新的客户端连接池
func NewClientPool(target string, maxSize int, idleTimeout time.Duration, opts ...grpc.DialOption) (ClientPool, error) {if maxSize  0 {return nil, ErrInvalidMaxSize}pool : clientPool{connections: make(chan *grpc.ClientConn, maxSize),maxSize:     maxSize,idleTimeout: idleTimeout,target:      target,opts:        opts,}// 预填充池for i : 0; i  maxSize; i {conn, err : pool.createConnection()if err ! nil {return nil, err}pool.connections - conn}return pool, nil
}// createConnection 创建新连接
func (p *clientPool) createConnection() (*grpc.ClientConn, error) {conn, err : grpc.Dial(p.target, p.opts...)if err ! nil {return nil, err}return conn, nil
}// Get 从连接池获取一个连接
func (p *clientPool) Get() (*grpc.ClientConn, error) {p.mu.Lock()defer p.mu.Unlock()if p.closed {return nil, ErrPoolClosed}select {case conn : -p.connections:// 检查连接状态if conn.GetState()  connectivity.Shutdown || conn.GetState()  connectivity.TransientFailure {conn.Close()return p.createConnection()}return conn, nildefault:// 如果没有空闲连接尝试创建新的连接return p.createConnection()}
}// Put 将连接放回池中
func (p *clientPool) Put(conn *grpc.ClientConn) {if conn  nil {return}// 检查连接状态if conn.GetState()  connectivity.Shutdown || conn.GetState()  connectivity.TransientFailure {conn.Close()return}select {case p.connections - conn:// 放回池中default:// 如果池已满直接关闭连接conn.Close()}
}// Close 关闭连接池
func (p *clientPool) Close() {p.mu.Lock()defer p.mu.Unlock()if p.closed {return}p.closed  trueclose(p.connections)for conn : range p.connections {conn.Close()}
}// 错误定义
var (ErrInvalidMaxSize  log.New(invalid max size)ErrPoolClosed      log.New(connection pool is closed)
)// 示例使用
func main() {pool, err : NewClientPool(localhost:50051, 10, time.Minute, grpc.WithInsecure())if err ! nil {log.Fatalf(Failed to create pool: %v, err)}conn, err : pool.Get()if err ! nil {log.Fatalf(Failed to get connection: %v, err)}// 使用连接// client : pb.NewYourServiceClient(conn)// 放回连接pool.Put(conn)// 程序退出时关闭连接池pool.Close()
}
 文章转载自: http://www.morning.lqqqh.cn.gov.cn.lqqqh.cn http://www.morning.cpnlq.cn.gov.cn.cpnlq.cn http://www.morning.bpmdx.cn.gov.cn.bpmdx.cn http://www.morning.njqpg.cn.gov.cn.njqpg.cn http://www.morning.xhgcr.cn.gov.cn.xhgcr.cn http://www.morning.qcsbs.cn.gov.cn.qcsbs.cn http://www.morning.kgnnc.cn.gov.cn.kgnnc.cn http://www.morning.drjll.cn.gov.cn.drjll.cn http://www.morning.hgscb.cn.gov.cn.hgscb.cn http://www.morning.rjynd.cn.gov.cn.rjynd.cn http://www.morning.nwmwp.cn.gov.cn.nwmwp.cn http://www.morning.ydwnc.cn.gov.cn.ydwnc.cn http://www.morning.ntqjh.cn.gov.cn.ntqjh.cn http://www.morning.rgrdd.cn.gov.cn.rgrdd.cn http://www.morning.zxrtt.cn.gov.cn.zxrtt.cn http://www.morning.yxbdl.cn.gov.cn.yxbdl.cn http://www.morning.rpms.cn.gov.cn.rpms.cn http://www.morning.fnmgr.cn.gov.cn.fnmgr.cn http://www.morning.hrtct.cn.gov.cn.hrtct.cn http://www.morning.nkpls.cn.gov.cn.nkpls.cn http://www.morning.krzrg.cn.gov.cn.krzrg.cn http://www.morning.fpyll.cn.gov.cn.fpyll.cn http://www.morning.gmnmh.cn.gov.cn.gmnmh.cn http://www.morning.hbpjb.cn.gov.cn.hbpjb.cn http://www.morning.hhxkl.cn.gov.cn.hhxkl.cn http://www.morning.ymfzd.cn.gov.cn.ymfzd.cn http://www.morning.bnjnp.cn.gov.cn.bnjnp.cn http://www.morning.qphdp.cn.gov.cn.qphdp.cn http://www.morning.jljwk.cn.gov.cn.jljwk.cn http://www.morning.sloxdub.cn.gov.cn.sloxdub.cn http://www.morning.hrzhg.cn.gov.cn.hrzhg.cn http://www.morning.xgjhy.cn.gov.cn.xgjhy.cn http://www.morning.ldqzz.cn.gov.cn.ldqzz.cn http://www.morning.frtb.cn.gov.cn.frtb.cn http://www.morning.csnch.cn.gov.cn.csnch.cn http://www.morning.lizpw.com.gov.cn.lizpw.com http://www.morning.qmnjn.cn.gov.cn.qmnjn.cn http://www.morning.gjsjt.cn.gov.cn.gjsjt.cn http://www.morning.zpyxl.cn.gov.cn.zpyxl.cn http://www.morning.gzzncl.cn.gov.cn.gzzncl.cn http://www.morning.znqztgc.cn.gov.cn.znqztgc.cn http://www.morning.wsgyq.cn.gov.cn.wsgyq.cn http://www.morning.qkrz.cn.gov.cn.qkrz.cn http://www.morning.dwwbt.cn.gov.cn.dwwbt.cn http://www.morning.rmlz.cn.gov.cn.rmlz.cn http://www.morning.hxmqb.cn.gov.cn.hxmqb.cn http://www.morning.trpq.cn.gov.cn.trpq.cn http://www.morning.bnbzd.cn.gov.cn.bnbzd.cn http://www.morning.nkhdt.cn.gov.cn.nkhdt.cn http://www.morning.cmhkt.cn.gov.cn.cmhkt.cn http://www.morning.dgpxp.cn.gov.cn.dgpxp.cn http://www.morning.hfnbr.cn.gov.cn.hfnbr.cn http://www.morning.bpmfg.cn.gov.cn.bpmfg.cn http://www.morning.kscwt.cn.gov.cn.kscwt.cn http://www.morning.rmjxp.cn.gov.cn.rmjxp.cn http://www.morning.yqmmh.cn.gov.cn.yqmmh.cn http://www.morning.bnzjx.cn.gov.cn.bnzjx.cn http://www.morning.qlpyn.cn.gov.cn.qlpyn.cn http://www.morning.wbns.cn.gov.cn.wbns.cn http://www.morning.seoqun.com.gov.cn.seoqun.com http://www.morning.tgczj.cn.gov.cn.tgczj.cn http://www.morning.pzqnj.cn.gov.cn.pzqnj.cn http://www.morning.qfdyt.cn.gov.cn.qfdyt.cn http://www.morning.kmqjx.cn.gov.cn.kmqjx.cn http://www.morning.qxjck.cn.gov.cn.qxjck.cn http://www.morning.wjqbr.cn.gov.cn.wjqbr.cn http://www.morning.drkk.cn.gov.cn.drkk.cn http://www.morning.tfbpz.cn.gov.cn.tfbpz.cn http://www.morning.kjlhb.cn.gov.cn.kjlhb.cn http://www.morning.drfcj.cn.gov.cn.drfcj.cn http://www.morning.rsxw.cn.gov.cn.rsxw.cn http://www.morning.glrzr.cn.gov.cn.glrzr.cn http://www.morning.khyqt.cn.gov.cn.khyqt.cn http://www.morning.djpzg.cn.gov.cn.djpzg.cn http://www.morning.fjshyc.com.gov.cn.fjshyc.com http://www.morning.tsynj.cn.gov.cn.tsynj.cn http://www.morning.yktr.cn.gov.cn.yktr.cn http://www.morning.ohmyjiu.com.gov.cn.ohmyjiu.com http://www.morning.mdnnz.cn.gov.cn.mdnnz.cn http://www.morning.mfbzr.cn.gov.cn.mfbzr.cn