Go语言如何做SSE推送_Go语言Server-Sent Events教程【技巧】

Go 的 http.ResponseWriter 实现 SSE 时需保持连接不关闭:设置正确响应头、使用 http.Flusher 显式刷新、监听上下文取消信号防 goroutine 泄漏,并严格遵循 SSE 协议格式发送消息。Go 的 http.ResponseWriter 怎么避免提前关闭连接Server-Sent Events 依赖长连接不中断,而 Go 默认的 HTTP handler 在函数返回时会隐式关闭响应体。一旦你写完数据就 return,连接立刻断开,客户端收不到后续事件。关键不是"怎么发",而是"怎么不让连接关":必须在 handler 函数内持续持有 http.ResponseWriter,不能让它被 GC 或作用域释放务必设置 Content-Type: text/event-stream 和 Cache-Control: no-cache,否则浏览器可能缓存或拒绝解析每次写入后调用 flusher.Flush() ------ 不是 w.Write() 就完事了;没 flush,数据卡在缓冲区,客户端永远等不到别用 log.Fatal 或 panic 中断 handler,会导致连接异常终止;用 return 前先 close channel、清理 goroutinefunc sseHandler(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/event-stream") w.Header().Set("Cache-Control", "no-cache") w.Header().Set("Connection", "keep-alive") flusher, ok := w.(http.Flusher) if !ok { http.Error(w, "streaming unsupported", http.StatusInternalServerError) return } // 后续写入 + flush...}用 net/http 实现 SSE 时如何安全推送消息直接往 ResponseWriter 写字符串容易出错:漏换行、格式错位、编码不一致,导致浏览器解析失败,表现为静默无事件或反复重连。SSE 协议对字段名和换行极其敏感,必须严格遵循 data: ... 或 event: xxx data: ... 格式:立即学习"go语言免费学习笔记(深入)";data: 行必须以 结尾,整个消息块以 结束(两个换行)如果 data 值含换行,需拆成多行 data:,每行一个;不能直接嵌 中文或 emoji 要确保响应头声明 charset=utf-8,否则可能乱码避免用 fmt.Fprintf 拼接,改用 io.WriteString + 显式 ,减少格式失控风险// 正确示例(发送 JSON 数据)msg := mapstringinterface{}{"id": 123, "msg": "hello"}b, _ := json.Marshal(msg)io.WriteString(w, "data: ")w.Write(b)io.WriteString(w, " ")flusher.Flush()goroutine 泄漏:为什么你的 SSE 服务跑几天就 OOM每个 SSE 连接对应一个长期运行的 goroutine,如果客户端断开但服务端没感知,goroutine 就卡在 write 或 time.Sleep 上,永不退出。 Mokker AI AI产品图添加背景

相关推荐
yyuuuzz10 分钟前
谷歌云基础服务的入门认知
linux·运维·服务器·数据库·人工智能·github
风之所往_15 分钟前
Python 3.5 新特性全面总结
python
超梦dasgg18 分钟前
工作中 MySQL 读写分离主从延迟:成因、影响、落地方案、生产实战处理
数据库·mysql
野生的小狗熊20 分钟前
【自学Agent开发之路】第二篇—从.NET到Python:Agent开发的本质就是投喂上下文
python
J-Tony1122 分钟前
【JVM】垃圾回收器
jvm
牵牛花主人26 分钟前
【无标题】
python·pandas
abcy07121332 分钟前
sqlalchemy 原生sql判断条件是否为空,为空则跳过
开发语言·python
知识分享小能手34 分钟前
数据预处理入门学习教程,从入门到精通, 实战演练——数据分析师岗位分析知识点详解(8)
python·学习·信息可视化
Wonderful U34 分钟前
Python+Django实战:打造智能生鲜果蔬进销存管理系统(采购入库、库存预警、销售开单、毛利统计)
数据库·python·django
yuhuofei202138 分钟前
【Python入门】Python中的集合set
python