基于netty的socket服务端触发了channelInactive方法,但实际连接没有断开的问题
背景:
一个中小型H5游戏,后端使用基于 netty 的socket服务
服务端 分为 分发服务器 & 业务服务器,业务服务器可负载
用户客户端与分发服务器连接
分发服务器再作为客户端与每台业务服务器连接
为了方便快速得知服务宕机的情况,我打算在服务器上做一个宕机通知
因为 分发服务器与业务服务器都处于连接状态,在连接断开时都会触发 channelInactive 方法,所以我预想的是
一旦分发服务器宕机,则业务服务器可以监听到连接断开,然后做出警报通知
反之亦然,用分发服务器做业务服务器的宕机警报
代码写完测试过后,功能可以没什么问题,于是更新至线上,过了一天以后,问题就来了
我收到了 业务服务器的警报,说分发服务器宕机了,紧张的我打开游戏看了看,毛事没有,分发服务器好好的,连接也是正常的
看了一下日志,业务服务器的 channelInactive 方法确实被触发了。但是是什么原因导致触发的呢?
// 问题先记下来,正在解决中。。解决完了回来更新。
问题找到了,是因为重启业务服务时,直接kill了进程,导致,分发服务与业务服务之间的socket没有正常断开连接,随后的某个时刻,分发服务收到了一个请求,试图将请求转发到此业务服务时,就出现了异常并触发了断开连接,所以就产生了分发服务与当前业务服务断开连接的假象,其实是与以前已经关闭的业务服务断开,当前的连接是正常的。
解决方案:在分发请求之前,验证 channle.isActive()。如果false,则主动做出相应处理。
相关代码:

时隔多日补充:
自从根据上面的做法实施过后的几天里, 错误的宕机警报确实减少了, 且上线后的正式服务没有再有过误报的情况了.... 但是...
测试服误报逻辑服务宕机的问题没有了, 但是却出现了逻辑服务误报分发服务宕机的情况.并且当我查看后发现分发服务和逻辑服务都是好好的, 也不存在上面所说的老连接未正常断开的情况!!!...WTF...冤冤相报何时了????
随后我陷入了沉思, 为什么正式服好好的, 测试服却会出现这种问题??? 他们有什么区别?
经过我交警脑汁的思考,排错....终于我还是发现了一个问题!!
正式服: 分发服务开放外网链接, 逻辑服务只允许内网连接(也就是只允许分发服务连接)
测试服: 分发服务与逻辑服务皆允许外网连接且都开放了端口(因为贪图方便, 放在一台服务器上了)
因为从正常逻辑上讲, 只有分发服务才会去连接逻辑服务, 所以逻辑服务默认只要是连接了我的那就是分发服务, 并且在任何连接断开时发出警报!!
由此引发问题: 因为开放了外网端口, 所以有许多网络爬虫啊, 端口扫描等等奇奇怪怪的连接发生, 然而逻辑服务却傻乎乎的把他们当成是分发服务......并且在连接中断后发出警报!
就这样, 问题终于找到了, 然后就要去解决了, 怎么解决呢? ...那就让逻辑服务好好擦亮眼睛吧!
解决方案
分发服务在连接逻辑服务成功后, 需要发送一个指令告诉逻辑服务: 我是分发服务, 我的身份是*****, 这样逻辑服务就知道这个连接是谁了!
基于netty的socket服务端触发了channelInactive方法,但实际连接没有断开的问题的更多相关文章
- netty 实现socket服务端编写
import java.net.InetSocketAddress; import io.netty.bootstrap.ServerBootstrap; import io.netty.channe ...
- Winfrom 基于TCP的Socket服务端 多线程(进阶版)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- Netty 搭建 WebSocket 服务端
一.编码器.解码器 ... ... @Autowired private HttpRequestHandler httpRequestHandler; @Autowired private TextW ...
- 使用NewLife网络库构建可靠的自动售货机Socket服务端(一)
最近有个基于tcp socket 协议和设备交互需求,想到了新生命团队的各种组件,所以决定用NewLife网络库作为服务端来完成一系列的信息交互. 第一,首先说一下我们需要实现的功能需求吧 1,首先客 ...
- 基于netty的微服务架构
基于netty的微服务架构 微服务一篇好文章 http://san-yun.iteye.com/blog/1693759 教程 http://udn.yyuap.com/doc/essential-n ...
- 在python中编写socket服务端模块(二):使用poll或epoll
在linux上编写socket服务端程序一般可以用select.poll.epoll三种方式,本文主要介绍使用poll和epoll编写socket服务端模块. 使用poll方式的服务器端程序代码: i ...
- AutoCAD.net支持后台线程-Socket服务端
最近因为公司项目的需求,CAD作为服务端在服务器中常驻运行,等待客户端远程发送执行任务的指令,最终确认用Socket-tcp通讯,CAD需要实时监听客户端发送的消息,这时就需要开启线程执行Socket ...
- Vue 爬坑之路(十一)—— 基于 Nuxt.js 实现服务端渲染(SSR)
直接使用 Vue 构建前端单页面应用,页面源码时只有简单的几行 html,这并不利于网站的 SEO,这时候就需要服务端渲染 2016 年 10 月 25 日,zeit.co 背后的团队对外发布了一个 ...
- 第一个socket服务端程序
第一个socket服务端程序 #include <stdio.h> #include <stdlib.h> #include <string.h> #include ...
随机推荐
- js-模块化(三大模块化规范)
###1. JS模块化 * 模块化的理解 * 什么是模块? * 将一个复杂的程序依据一定的规则(规范)封装成几个块(文件), 并进行组合在一起 * 块的内部数据/实现是私有的, 只是向外部 ...
- Vue项目搭建与部署
Vue项目搭建与部署 一,介绍与需求 1.1,介绍 Vue 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue两大核心思想:组件化和数据驱动.组 ...
- java 虚拟机内存模型
[声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:[http://www.cnblogs.com/smyhvae/p/4748392.html] 文章来源:[http://www.cnblog ...
- idea在Terminal中使用maven指令
如果无法直接使用mvn指令,那么这里需要配置你idea中的maven的环境变量, 先说maven在idea中的位置,在你idea安装目录下的\plugins\maven 接下来配置环境变量:在你的用户 ...
- C# 数组、HashSet等内存耗尽的解决办法
在C#中,如果数据量太大,就会出现 'System.OutOfMemoryException' 异常. 解决办法来自于Stack Overflow和MSDN https://docs.micro ...
- python学习日记(初识面向对象)
面向过程 VS 面向对象 面向过程 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行.为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统 ...
- Mysql相关知识点梳理(一):优化查询
EXPLAIN解析SELECT语句执行计划: EXPLAIN与DESC同义,通过它可解析MySQL如何处理SELECT,提供有关表如何联接和联接的次序,还可以知道什么时候必须为表加入索引以得到一个使用 ...
- openstack项目【day23】:Neutron实现网络虚拟化
本节内容 一 Neutron概述 二 neutron openvswitch+gre/vxlan虚拟网络 三 neutron ovs opnflow流表和l2 population 四 dhcp ag ...
- 纯js Ajax 请求
var XMLHttpReq; function createXMLHttpRequest() { if(window.ActiveXObject ) { try { XMLHttpReq = new ...
- HTML(八)HTML meta标签&base标签
HTML meta元素 标签(meta-information)用于提供页面有关的元数据,除了提供文档字符集.使用语言.作者等基本信息外,还涉及对关键词和网页等级的设定.通过设置不同的属性,元数据可以 ...