最近从在写一个课程上报的模块,要求前端使用websocket长连接到后端,实现实时上报学习进度的功能。这次没有使用php或者java,尝试使用一把golang作为上报模块的开发语言。用到了gorm和websocket,这次总结下遇到的坑。
1.websocket无法检测到连接断开
在使用websocket的时候,因为其底层基于tcp连接,所以不执行发送命令是获取不到连接断开的通知的;因此前端发送心跳包到后端,后端可以以返回一个心跳包的形式,判断是否出现err,如果出现err则说明连接断开,处理断开后的逻辑,保存进度等操作。
2.gorm导致的504问题
从百度和google搜到的全部都是因为Quer导致的rows没有close的问题,还有说使用gorm的db.Close解决,但我们都没解决。用navicat->工具->服务器监控发现数据库里建立了大量的链接。
最后发现是程序处理心跳的协程使用for死循环,使用了事务,但是open没有执行rollback或者commit,直接continue了,continue之后又会执行一个新的事务begin。加上rollback就解决了