Go FastHttp优雅关闭实现方案

企业级智能体路由韧性设计:降级、诊断与恢复实战 在分布式系统与微服务架构中,服务路由是保障系统稳定性和高可用的核心组件。其核心原理在于通过智能的流量调度策略,将请求高效、可靠地分发到后端服务实例。这项技术的价值在于能够显著提升系统的容错能力、资源利用率和用户体验。在AI智能体、云原生应用、大规模在线服务等场景中,一个健壮的路由层尤为关键。本文聚焦于企业级智能体系统的路由层,深入探讨如何构建具备韧性的架构。面对服务实例故障或性能波动,系统通过多维度的**降级策略**(如实例熔断、服务级功能降级)实现自我保护。同时,借助强大的**可观测性**体系(包括指标、 阅读详情

使用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 nil

    case <-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连接池遇上keepalive 最近在使用netty作为http客户端通过pool连接tomcat的时候,出现了很多Connection reset by peer 的IOException的异常。便对问题的根源做了细致的调研。 阅读详情

相关推荐

fasthttp-graceful-shutdown:使用带有正常关闭功能的fasthttp和fasthttprouter的示例服务器

此示例应用程序基于fasthttp和fasthttprouter构建-设计得非常快,并且只使用很少的内存。 它还旨在成为使用fasthttp正常关闭的示例。 欢迎您提出评论,反馈和请求。 干杯! 注意:假设您已安装Dep。 要运行克隆存储库并运行dep ensure然后go run $(ls *.go | grep -v _test.go) (假设我在某个时候编写了测试) 资源:

Http——Keep-Alive机制 keeplive

翻译成代码,当发送一次请求,得到响应之后,不是调用HttpURLConnection.disconnect方法关闭,这会导致底层的socket连接被关闭。JDK对keepalive的支持是透明的,keepAlive默认就是开启的。举个例子,你搞了一个好项目,想让马云爸爸投资,马爸爸说,"我很忙,最多给你3分钟”,你需要在这三分钟内把所有的事情都说完。例如 Tomcat 的 BIO 实现中,未关闭的连接会占用对应的处理线程,如果一个长连接实际上已经处理完毕,但关闭的超时时间未到,

chuyouyinghe的专栏 6138

告别‘小爱同学’:用ESP32-S3和esp-sr SDK,从零打造一个离线语音助手(含完整代码)

本文详细介绍了如何利用ESP32-S3芯片和esp-sr SDK从零构建一个离线语音助手,涵盖硬件选型、声学设计、SDK配置及低功耗优化等关键步骤。通过实战案例和完整代码,帮助开发者实现自定义唤醒词和命令词,打造低成本、高隐私的本地语音控制解决方案。

weixin_29041195的博客 370

golang的web开发 之 fasthttp

fasthttp是go的开源web开发框架,具体介绍很多大佬也都有过,我只是总结我遇到的问题和解决方案。 一些资料和文档可以看:fasthttp中文文档,fasthttp原理简析, fasthttp源码 如何启动http监听 package main import ( "fmt" "github.com/valyala/fasthttp" ) const ( // 静态目录 cssHa...

qq_40896725的博客 1930

基于C#的跨平台上位机开发:一次编写,多平台运行

摘要: 本文探讨了如何利用C#进行跨平台上位机开发,以适配Windows、Linux、macOS等多平台需求。通过分析传统单平台开发的局限性(如API差异、硬件接口兼容性),提出基于.NET 5/6/7的解决方案,重点推荐Avalonia(类WPF的跨平台UI框架)和GtkSharp(基于GTK+)实现图形界面。同时,针对硬件通信需求,介绍了System.IO.Ports串口通信和LibUsbDotNet的跨平台支持,并强调多平台调试(VS Code、Docker)的重要性,最终实现一次编码、多端部署的高效

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1403

英飞凌TC377的Flash管理、UCB配置与HSM安全机制解析

本文深入解析了英飞凌TC377微控制器的Flash存储结构、UCB配置机制与HSM安全模块。详细阐述了带Cache与不带Cache的PFlash地址访问差异、利用SOTA与AB Swap实现无感OTA更新的原理,以及如何通过UCB安全配置启动流程与写保护。重点剖析了HSM硬件安全模块在密钥管理、安全启动与安全OTA中的核心作用,为开发高可靠性嵌入式系统提供实战指南。

weixin_29170327的博客 520

[golang]fasthttp源码

一.核心逻辑 func (s *Server) ListenAndServe(addr string) error { //1.监听端口 ln, err := net.Listen("tcp4", addr) if tcpln, ok := ln.(*net.TCPListener); ok { return s.Serve(tcpKeepaliveListener{ TCPListener: tcpln, keepalive: s.TCPKeepa.

小小李的博客 625

1篇1章3节:R 语言的产生与发展轨迹(更新2024/08/14)

药物的研究阶段包括靶标确定、生物学模型建立、新化学实体的发现和优化新化学实体四个关键环节。每个环节都在药物研发过程中发挥着至关重要的作用。通过科学严谨的方法和技术手段,研究人员能够在药物研发过程中不断探索和优化,从而发现和开发出具有高效、安全性的候选药物,为疾病治疗提供更多的选择和希望。

MD Code 2659

fast服务器响应,fastHttp服务端处理请求的过程

设置监听地址 server.gotcp func (s *Server) ListenAndServe(addr string) error {ln, err := net.Listen("tcp4", addr)if err != nil {return err}if tcpln, ok := ln.(*net.TCPListener); ok {return s.Serve(tcpKeepal...

weixin_39873741的博客 446

基于知识图谱的智能工作流引擎

随着大数据和人工智能技术的快速发展,企业和组织对数据的依赖程度日益增加。为了更好地管理和利用这些数据,知识图谱逐渐成为一种重要的工具。知识图谱不仅能够以结构化的方式表示复杂的知识,而且能够通过推理和查询提供深层次的信息。然而,如何将知识图谱应用于实际业务场景中,尤其是如何构建智能工作流引擎,仍然是一个具有挑战性的问题。智能工作流引擎是一种能够自动化执行复杂业务流程的系统,它可以通过对业务规则和数据的分析,自动生成和优化工作流,从而提高工作效率和准确性。

AI天才研究院 1869

【YOLO系列】YOLOv5超详细解读(源码详解+入门实践+改进)

一文带你详细了解YOLOv5(含YOLO系列论文讲解+源码详解+入门实践+算法改进)

路人贾的博客 25万+

Go语言的网络编程进阶

import ("fmt""net/http"// 自定义处理器// 可以添加依赖// 实现ServeHTTP方法default:fmt.Fprintf(w, `{"users": [{"id": 1, "name": "张三"}]}`)// 创建处理器// 注册处理器// 启动服务器if err!= nil {Go语言的网络编程提供了强大的能力,通过标准库和第三方库,可以构建各种网络应用,如HTTP服务器、WebSocket服务、TCP/IP应用等。

好代码自己会说话,烂代码才需要注释来圆谎 4232

OPC通信从入门到精通_1_OPC基础知识及简单C#程序编写(OPCDA,OPCUA简介;OPC通信数据流框架图;C#程序编写)

ModbusTCP通信是采用直接方式进行通信,用OPC的方式如何去做呢?PLC作为ModbusTCP服务器,用KepServer作为ModbusTCP客户端,同时作为OPC服务器,PC作为OPC客户端新建项目,加载dll库(利用COM技术写的)添加引用,查看到其中包含了众多方法其中OPCGroups继承于IOPCGroups接口。

分享学习成长历程,Winter is coming! 1万+

Fiber WebSocket应用开发:实时通讯系统的高性能实现

Fiber是一个基于Express风格构建的Go语言Web框架,专门为高性能实时应用而设计。本文将深入探讨如何在Fiber框架中构建WebSocket实时通讯系统,实现毫秒级响应的实时数据交互体验。Fiber的轻量级架构和fasthttp底层支持,使其成为构建WebSocket应用的理想选择。 ## 为什么选择Fiber进行WebSocket开发?⚡️ Fiber框架在WebSocket应用开

gitblog_00114的博客 1009

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Golang开发笔试复盘:从GMP调度到工程能力考点解析

在现代后端开发中,并发编程是衡量工程师能力的重要标尺,而Golang凭借goroutine与channel提供了独特的并发原语。理解GMP调度模型、内存逃逸分析以及垃圾回收机制,不仅有助于写出高性能服务,更是面试中区分应试者思维层次的关键。从channel的易错场景到同步包的竞态控制,从错误处理设计到缓存限流等业务场景,每一类考点背后都对应实际工程中的典型问题。本文以一份2019年春招Golang开发试卷为样本,拆解语言基础、底层原理、工程能力与系统设计四层考察逻辑,帮助读者建立应对变式题的知识体系,为后端

weixin_34341117的博客 311

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【Go高并发请求处理】:揭秘百万级QPS系统背后的核心架构设计

掌握Go高并发请求处理核心技巧,轻松应对百万级QPS场景。详解异步协程、连接池、限流熔断等关键设计,适用于高负载微服务与API网关架构。性能稳定、响应高效,值得收藏。

LiteCompile的博客 406

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Limiter最佳实践:企业级应用的限流架构设计

Limiter是一款适用于Go语言的企业级限流中间件,它采用简洁API设计与灵活存储方案,帮助开发者轻松实现高并发场景下的流量控制。本文将深入剖析Limiter的核心架构与最佳实践,助你构建可靠的分布式限流系统。 ## 为什么选择Limiter? 在微服务架构中,限流是保障系统稳定性的关键环节。Limiter凭借三大核心优势脱颖而出: - **极简API设计**:通过`limiter.Rat

gitblog_00936的博客 407

go性能调优之pprof

pprof pprof是go语言自带的性能分析工具,在对go程序进行故障定位、性能调优时应用非常广泛。 pprof是一个分析工具,通过go tool pprof可以直接对采集样本进行分析。 什么情况下需要进行性能调优 一般常规内容: cpu:程序对cpu的使用情况 - 使用时长,占比等 内存:程序对cpu的使用情况 - 使用时长,占比,内存泄露等。如果在往里分,程序堆、栈使用情况 I/O:IO的使用情况 - 哪个程序IO占用时间比较长 golang 程序中: goroutine:go的协程使用情况,调

maybe的博客 2031

go http 端口代理proxy(监听数据)

需求: 想了解服务上报给zipkin的数据 实现: 另起一个端口8080,使客户端上报到该端口,打印body信息后转给真实的服务 package main import ( "compress/gzip" "fmt" "io" "io/ioutil" "net/http" "net/url" ) var ( targetURL *url.URL targetHttp = "http://127.0.0.1:9411" //要代理的服务的http地址 proxyAddr =

qq_17303159的博客 1795

Go的fasthttp快的秘诀:简单事情做到极致

fasthttp的作者并不是拍脑门优化的,是通过go tool pprof --alloc_objects your-program mem.pprof哪里有内存消耗然后针对性优化。

flynetcn的专栏 2123

FastDFS的启动与关闭及文件上传命令

FastDFS的启动与关闭及文件上传命令

SLQ1893的博客 5375

基于Fasthttp实现的Gateway,性能媲美Nginx

springcloud里的gateway可以和配置中心实现gateway的配置,可以和hytrix以及alibaba的Sentinel结合,实现熔断限流的功能,springcloud升级到3.0.1后,摒弃了netfix里的hytrix,使用新的熔断器reslience4j,这几种限流器都未提供比较完善的管理界面进行管理,sentinelboard提供管理工具,但是要做到完全的动态和配置管理,必须添加自己的代码,alibaba开源出来的sentinel的项目,这块的代码目前是没有公开的。

1159

Go-Gateway反向代理,性能比拼Nginx

在以前的一篇文章《基于Fasthttp实现的Gateway,性能媲美Nginx。

2943

HttpClient当HTTP连接的时候出现大量CLOSE_WAIT连接

ESTABLISHED 表示正在进行网络连接的数量TIME_WAIT 表示表示等待系统主动关闭网络连接的数量CLOSE_WAIT 表示被动等待程序关闭的网络连接数量上篇文章给出了解决TIME_WAIT太多的方法,本篇文章以HttpClient为例说明解决大量CLOSE_WAIT状态的方法。HttpClient是大量使用的用于HTTP连接的包,首先需要说明的是HttpClient 3.x和4.x之间...

z69183787的专栏 7174
上一篇: Spring事务隔离级别与Mysql InnoDB事务隔离级别的关系
下一篇: @FeignClient同一个name使用多个配置类的解决方案
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值