当前位置: 首页 > news >正文

旅游网站规划设计公司网站推广方案

旅游网站规划设计,公司网站推广方案,做网站的图片素材网站有哪些,wordpress 插件发文章什么是 gRPC 客户端连接池? 在 gRPC 中,创建和维护一个到服务器的连接是非常消耗资源的(比如 TCP 连接建立和 TLS 握手)。 而在高并发场景下,如果每次请求都创建新的连接,不仅会导致性能下降,还…

什么是 gRPC 客户端连接池?

  • 在 gRPC 中,创建和维护一个到服务器的连接是非常消耗资源的(比如 TCP 连接建立和 TLS 握手)。

  • 而在高并发场景下,如果每次请求都创建新的连接,不仅会导致性能下降,还可能耗尽系统资源。

  • 因此,客户端连接池的作用是复用一定数量的连接,提高资源利用率和性能。


gRPC 客户端连接池的原理

  1. 连接复用,池子里的连接使用时取出,用完放回
  2. 控制连接数,可以固定数量或动态调整,防止建太多连接
  3. 并发安全

先展示一个基于sync.pool创建的clientPool

  • 实际上,企业不推荐使用sync包里的无锁机制,
  • 因为sync包里的无锁设计适用于高并发,短暂资源的情况,
  • 而gRPC本身设计初衷是客户端连接是长生命周期,需要稳定管理的资源,与sync.pool的特性不完全匹配
因此为了更好实现,可以自己加锁设计,或者使用第三方库这里举例github:go-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 ("log""sync""time""google.golang.org/grpc""google.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.yayakq.cn/news/815730/

相关文章:

  • 自己的网站怎么样推广优化触动网站建设
  • 个人网站设计论文前言长沙网站seo收费标准
  • 制作网站团队洛阳专注网站建设的公司
  • 宁阳网站建设最新招总代理项目
  • 成都网站建设yingrihe中国十大教育培训机构有哪些
  • 家电维修 做网站还是搞公众号沃尔玛超市网上购物app下载
  • 企业网易邮箱html网站 怎么做seo
  • 企业网站模块建设流程网络营销方式的选择
  • 网站是先解析后备案成都市营销型网站建设
  • 西安网站开发工资wordpress自动水印代码
  • 招聘设计师去哪个网站电商网站设计思想
  • 做pc网站怎样建立网站
  • 企业营销网站建设价格如何创建网站?
  • wordpress怎么更改网站名字网站域名保护几年
  • 佛山建设局网站通许网站建设
  • 安阳住房与城乡建设局官方网站找装修公司上什么网站
  • 网站数据查询做好网站建设对企业有什么作用
  • seo网站制作优化购物商城名字
  • 网页网站制作公司南宁市公共资源交易网
  • 太平洋建设集团招标网站什么是sem营销
  • 海外建站公司闵行网站建设公司
  • 关键词调整排名软件在婚纱店做网站优化
  • 做网站选云服务器内核idc网站模板
  • 衣服 div网站怎么让网站绑定域名访问不了
  • 电子销售网站模板上海网站推广排名公司
  • 网站建设在哪学网站开发属于什么会计科目
  • 华硕建设公司网站互联网保险有哪些
  • 网站建设系统认证系统网站设计流程是什么
  • 新乡做网站的静态网页设计实训报告摘要
  • 画出网站开发项目流程图建设银行网站 购买外汇