Golang Go语言中使用 websocket 发送数据给前端过段时间后后端程序卡死

发布于 1周前 作者 itying888 来自 Go语言

Golang Go语言中使用 websocket 发送数据给前端过段时间后后端程序卡死

后端程序启动后 120 秒左右就卡死了,无论推送速度是快还是慢,总是会卡死。没有任何报错信息。

后端用的是 go,gin 框架中开了 2 个协程,1 个用来接受数据,1 个用来入库和用 websocket 发给前端。

接受数据和数据库写入都没问题。应该就是 websocket 推给前端时的问题。也检查了协程数,都是正常的。

var upgrader = websocket.Upgrader{
	//	ReadBufferSize: 1024,
	//WriteBufferSize: 1024,
	// 允许所有的 CORS 跨域请求,正式环境可以关闭
	CheckOrigin: func(r *http.Request) bool {
		return true
	},
}
var dataTmp []byte

func init() { http.HandleFunc("/ws", wsHandler) }

// 启动程序 func StartWebsocket(addrPort string) { http.ListenAndServe(addrPort, nil) }

func(){ … go StartWebsocket(“173.10.10.100:88”) … }

func wsHandler(resp http.ResponseWriter, req *http.Request) { // 答客户端告知升级连接为 websocket wsSocket, err := upgrader.Upgrade(resp, req, nil) if err != nil { fmt.Println(“升级为 websocket 失败”, err.Error()) return } go wsWriteLoop(wsSocket) }

func wsWriteLoop(wsConn *websocket.Conn) { for { if len(dataTmp) != 0 { fmt.Println(time.Now()) err := wsConn.WriteMessage(websocket.TextMessage, dataTmp) dataTmp = dataTmp[0:0] if err != nil { fmt.Println(“发送消息给客户端发生错误”, err.Error()) wsConn.Close() return } } } }


更多关于Golang Go语言中使用 websocket 发送数据给前端过段时间后后端程序卡死的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

9 回复

for 这样用合适吗,为啥不把 dataTmp 换成 channel 呢,for 配合 select 读 dataTmp 不好吗

更多关于Golang Go语言中使用 websocket 发送数据给前端过段时间后后端程序卡死的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


不是很好,但感觉问题不是出在这

dataTmp 的问题吧.
一般来说你写的 loop 数据应该是隔离的,就算要共性,也需要加锁

300 元帮你远程调试保证能找出问题并处理好。。。

老哥我错了,就是没用 channel 的问题。

是的是的,换了管道就好了。老哥可以详细说说这里使用切片和管道的区别吗?

共享内存可见性问题

懂了懂了,太菜了,太久不写并发居然忘了这茬

在Golang中使用WebSocket发送数据给前端时,遇到后端程序卡死的问题,通常可能由几个原因引起。以下是一些排查和解决此问题的建议:

  1. 资源泄漏:检查WebSocket连接是否正确关闭。如果连接未正确关闭,可能会导致资源泄漏,最终耗尽系统资源。确保在客户端断开连接或发生错误时,服务器端也相应地关闭连接。

  2. 死锁:分析代码中是否存在死锁情况。特别是在涉及并发编程时,不当的锁使用或竞态条件可能导致程序挂起。使用Go的race detector工具可以帮助检测竞态条件。

  3. 内存泄漏:长时间运行后,如果内存使用量持续增加,可能是内存泄漏。使用Go的内存分析工具(如pprof)来监控内存使用情况,查找可能的内存泄漏点。

  4. 阻塞操作:检查代码中是否有阻塞操作,如网络请求、数据库查询等,这些操作如果没有超时机制,可能会导致程序挂起。确保所有外部调用都有合理的超时设置。

  5. 日志和监控:增加日志记录,特别是关于WebSocket连接和数据处理的部分,以便在问题发生时能够追踪到具体的步骤和状态。同时,建立监控机制,实时监控应用的运行状态。

综上所述,解决后端卡死问题需要从多个角度进行排查,包括资源管理、并发控制、内存管理、外部调用等方面。建议逐步排查上述可能原因,并采取相应的优化措施。

回到顶部