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

大安移动网站建设大学 建网站

大安移动网站建设,大学 建网站,做淘宝客网站要多少钱,长沙网站制作首页使用Go开发web服务时很多情况下都会使用号称比标准库快10x的FastHttp, 但fasthttp(版本: 20180529.0.0)至今也没有提供优雅关闭的方法,默认情况下退出服务只能kill。下面谈几个实现方案。 首先,要明确所谓的优雅关闭是要求我们在调用close()时要做到以下…

使用Go开发web服务时很多情况下都会使用号称比标准库快10x的FastHttp, 但fasthttp(版本: 20180529.0.0)至今也没有提供优雅关闭的方法,默认情况下退出服务只能kill。下面谈几个实现方案。

首先,要明确所谓的优雅关闭是要求我们在调用close()时要做到以下几点:

  • 拒绝接受新连接
  • 等待正在处理的请求完成,然后关闭连接
  • 关闭剩余空闲的连接

要做到第一点,我们需要重写一下net.Listener实现,例如叫GraceListener, 在此结构体中组合一个真正干活的Listener,覆盖Close()方法,在此方法中先将干活的Listener关闭,此时就不会再监听新请求了,然后再block当前routine直到所有连接全部关闭为止。代码如下:

type graceListener struct {net.Listener
}func (gl *graceListener) Close() error {err := gl.Close()if nil != err {return err}// block, 直到所有连接关闭
}
fastServ := &fasthttp.Server{Concurrency:  100,Handler:      xxxFunc,LogAllErrors: true,}ln, err := net.Listen("tcp4", ":8080")if nil != err {// err}graceLn := &graceListener{Listener: ln,}fastServ.Serve(graceLn)

接下来看看如何满足后面两条要求。这里有两种方案,第一种最简单的方案是,保存一个全局的sync.WaitGroup指针,在你的请求处理函数中,先调用wg.Add(1), 然后defer wg.Done(), 最后在上面的Close()方法中使用wg.Wait()即可。这里建议最好使用select给等待加个超时功能,即如果超过指定时间还没有退出则强制退出:

// 此方法一直block到所有请求退出或超时
func WaitForGracefullyClose() error {select {case <-waitAllRoutineDone():return nilcase <-time.After(maxWait):return fmt.Errorf("force shutdown after %v", maxWait)}}// 等待所有请求处理routine完成;
// 此方法返回只有1个缓冲的channel, 只有当所有routine结束时channel才会有元素
func waitAllRoutineDone() chan struct{} {flagChan := make(chan struct{}, 1)go func() {wg.Wait()flagChan <- struct{}{}}()return flagChan
}

此外还有第二种方案,那就是在自己的graceListener中添加一个计数器用于统计当前的连接数,重写Accept()方法,将计数器+1,再定义一个自己的套壳net.Conn实现,重写Close()方法,在里面将计数器-1。这里要注意线程安全问题,最好使用atomic包进行操作。最后在graceListener#Close()中关闭Listener后等待计数器归零。这种方案有以下几个缺点:

  • 实现繁琐
  • 无法处理keep-alive连接。即请求已经处理完成,但是连接并没有关闭,这时计数器不会归零。不过可以使用go 1.3新增加的 Conn State Hook来实现当连接状态变更时的通知,但是也是比较繁琐的。

因此不推荐这种方案。

完成Http Server的关闭后,就可以添加一些清理自己业务资源的逻辑了,比如关闭数据库连接,redis连接,取消注册,刷新日志等。

http://www.yayakq.cn/news/386952/

相关文章:

  • 创客贴网站建设asp网站模板安装教程
  • 促销礼品网站建设唐山企业网站建设公司
  • 临夏城乡建设局网站跨境网站建设
  • 用asp.net做企业网站软件界面设计软件有哪些
  • 辽宁建设培训网站钉钉企业注册流程
  • 片头制作网站大型地方门户网站源码
  • 建设个人技术网站免费空间已经注册 怎么做网站
  • 诊所网站建设深圳 网站设计公司
  • 网站seo技术网站模块添加
  • 酒泉网站建设优化备案期间网站可以做竞价吗
  • 做一元云购网站中企动力科技股份有限公司潍坊分公司
  • 网站 多个ip 备案建设网站硬件需要
  • 宁波网站设计服务企业网站怎么注册官网
  • 依兰县建设局网站团建智慧登陆官网
  • 加强网站信息内容建设管理企业注册网站
  • 国外网站问题微信公众号运营规则
  • 企业网站设计步骤网站访问速度慢的原因
  • 浦东手机网站建设免费搭建单页网站
  • 学习网站建设与管理中国轻工建设公司网站
  • 东莞朝阳企讯网做的网站网站设计用什么字体好
  • 求个网站没封的2021南京已经开始二次感染了
  • 豪柏大厦做网站的公司管家婆免费资料网站
  • 如何弄自己的网站余姚做轴承网站
  • 网站设计小技巧表单付款 wordpress
  • 宝安有效的网站制作旅游网站建设意义
  • 全企网建站怎么样图书馆网站建设需求方案
  • 招聘网站建设人员条件如何利用互联网进行宣传推广
  • 上海网站制作建设多少钱网站推广网站
  • 经营网站备案陕西专业网站开发公司
  • 江西安福县建设局网站无锡网站制作厂家地址