长连接心跳问题解决总结
一、长连接的定义与心跳说明
我们在客户端(手机APP、浏览器、电脑客户端等)去向服务器请求数据交互的时候,一般是通过网络进行消息的传输。其中依据网络传输协议,与服务器建立的连接都是基于TCP/UDP进行。依据这些,我们可以粗略的认为客户端与服务器建立了能长期进行数据传输的网络通道,这就是长连接。
一般来说,TCP的机制可以为我们提供相对稳定的连接监听,即当客户端主动断开网络连接的时候,服务器也能及时(5秒以内)收到相关动态。但存在一种情况,当客户端被动断开网络连接的时候,例如网线被拔、路由器瞬间短路烧毁等,TCP的保活定时器往往需要很长时间(一般在30分钟以上)才能让服务器知道这条连接已经中断,往往需要使用长连接的场景都伴随着大量的高频度的数据交互,这样就会对我们的业务逻辑造成影响。
为了解决上述问题,于是就有了名为“心跳“的解决方案。即让客户端每隔一定的时间间隔(一般是3秒-10秒不等)向服务器发送一次专门用于标记连接存活的消息,如果几次时间间隔后服务器仍未接收到该消息,就默认该连接已中断,从而执行用户的下线处理。
二、心跳问题解决
笔者这里的模拟场景是游戏连接中的心跳问题解决流程。
基本环境:游戏服务器 + Redis存储玩家数据
1. 初始思路是服务器维护一个玩家在线连接池,同时在玩家身上设置一个时间戳参数,专门用于接收到的玩家心跳消息后进行刷新,服务器会有一个单独线程每隔一段时间检测在线玩家的时间戳,如果超过一定时间就默认断连,执行玩家下线处理。
问题:玩家在偶然情况下会在刚登陆服务器,即还未来得及发送心跳消息刷新时间戳(时间戳还是上次掉线时的时间戳),就被检测线程误伤断连,导致玩家登陆游戏失败。具体表现就是玩家偶尔会无法登陆服务器。
2. 优化思路:在玩家连接到服务器的时候就默认执行了一次心跳消息的发送,执行心跳消息时间戳的刷新。
问题:依旧存在玩家在执行心跳消息处理期间被检测线程误伤断连的可能性。
3. 继续优化:改造检测线程,在玩家身上增加一个时间戳参数用于记录玩家登陆时的时间戳。玩家未登录则对登陆的时间戳检测,检测时间间隔较长;玩家登陆后对心跳时间戳进行检测,检测时间间隔较短。
问题:玩家数据放置在redis中,出现了因为网络抖动造成的redis玩家数据获取失败,导致断连情况出现。
4. 接着优化:将两个记录时间戳的参数从玩家身上取出,单独放置在游戏服务器本地进行维护。具体方法是在每个网络连接上都绑定两个相关的局部时间戳参数,一个在玩家登陆时进行时间戳更新,一个在玩家登陆后进行心跳时间戳更新。这样就保证了时间戳参数获取的可靠性与及时性。
目前的优化只到如此程度,特地写一篇文章分享一下自己的相关优化思路。如果还有可能存在的问题还请大家留言指出。
长连接心跳问题解决总结相关推荐
- 转 互联网推送服务原理:长连接+心跳机制(MQTT协议)
http://blog.csdn.net/zhangzeyuaaa/article/details/39028369 目录(?)[-] 无线移动网络的特点 android系统的推送和IOS的推送有什么 ...
- mqtt如何发送心跳 安卓_互联网推送服务原理:长连接+心跳机制(MQTT协议)
互联网推送消息的方式很常见,特别是移动互联网上,手机每天都能收到好多推送消息,经过研究发现,这些推送服务的原理都是维护一个长连接(要不不可能达到实时效果),但普通的socket连接对服务器的消耗太大了 ...
- 互联网推送服务原理:长连接+心跳机制(MQTT协议)
互联网推送消息的方式很常见,特别是移动互联网上,手机每天都能收到好多推送消息,经过研究发现,这些推送服务的原理都是维护一个长连接(要不不可能达到实时效果),但普通的socket连接对服务器的消耗太大了 ...
- [心跳] 互联网推送服务原理:长连接+心跳机制
互联网推送消息的方式很常见,特别是移动互联网上,手机每天都能收到好多推送消息,经过研究发现,这些推送服务的原理都是维护一个长连接(要不不可能达到实时效果),但普通的socket连接对服务器的消耗太大了 ...
- 移动互联网消息推送原理:长连接+心跳机制(MQTT协议)
互联网推送消息的方式很常见,特别是移动互联网上,手机每天都能收到好多推送消息,经过研究发现,这些推送服务的原理都是维护一个长连接(要不不可能达到实时效果),但普通的socket连接对服务器的消耗太大了 ...
- Android长连接心跳机制
在写之前,我们首先了解一下为什么android维护长连接需要心跳机制,首先我们知道,维护任何一个长连接都需要心跳机制,客户端发送一个心跳给服务器,服务器给客户端一个心跳应答,这样就形成客户端服务器的一 ...
- php 长连接心跳_支持gRPC长链接,深度解读Nacos2.0架构设计及新模型
作者 | 杨翊(席翁) Nacos PMC 来源|阿里巴巴云原生公众号 Nacos 简介 Nacos 在阿里巴巴起源于 2008 年五彩石项目,该项目完成了微服务拆分和业务中台建设,随着云计算和开源环 ...
- Netty(一) SpringBoot 整合长连接心跳机制
https://github.com/crossoverJie/JCSprout 原创: crossoverJie 阅读原文 前言 Netty 是一个高性能的 NIO 网络框架,本文基于 Spring ...
- java长连接心跳包_socket中的短连接与长连接,心跳包示例详解
TCP连接简介 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接, 当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接, 连接的建立是需要三 ...
最新文章
- openssl-1.0.1用mingw编译
- _捷豹F-pace汽车音响改装黄金声学,中道隔音——哈尔滨小蒋
- DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解
- SIM7600X 获取GPS信号 TCP/IP连接与PPP拨号上网 4G上网
- 帝国CMS后台getshell
- python3 输入输出_Python3基础之输入和输出实例分析
- python3下使用cv2.imwrite存储带有中文路径图片或者绝对路径图片
- 大数据预测实战-随机森林预测实战(三)-数据量对结果影响分析
- typora设置代码不自动换行
- 7.过渡案例:①进度条 ②小米图标翻转(父盒子一定要加初始值!!!)
- 计算机处理器性能排名,cpu天梯图2018最新版 2018电脑cpu处理器性能排行榜
- cdr怎么抠图轮廓线条_CDR怎么抠图?CorelDRAW快速抠图方法
- neo4j图数据库--Cypher入门
- 电脑端10大图片处理类神器
- Mikrotik路由器(routerOS)调试环境搭建
- 【css】css动画实现的3种方式
- WuThreat身份安全云-TVD每日漏洞情报-2023-02-27
- 神马广告投放的展现样式有哪些?神马广告投放的优势
- 股权交易中心+区块链试点将开始
- Excel 2010 VBA 入门 081 数据处理之获取不重复的数据