thrift无法判断连接失效的原因与解决方案
来源:互联网 发布:dj舞曲视频软件 编辑:程序博客网 时间:2024/05/15 17:20
公司的软件系统使用thrift来进行系统内部各服务的沟通调用。thrift客户端采用了连接池的方式减少连接频繁创建销毁产生的开销。连接池之前一直存在无法即时判断连接是否有效的问题。今天抽空看了下thrift的源码,分析出原因如下:
我们在程序中判断连接是否有效时,调用的是TTransport类的isOpen()函数
一路调试跟踪查看TTransport的isOpen()源码,得到如下:
即最终调用的是jdk中 Socket类的isConnected()方法
根据源码中的英文注释内容及网上的资料,得出答案:isConnected方法得到的并不是Socket的当前连接状态,而是只要是Socket连接曾经成功过,isConnected始终返回true。
Thrift并没有提供一个可以获取当前连接状态的方法。
之前连接池的解决方案是:在当前远程调用操作失败后,将失败状态写入当前客户端类变量,下次校验时,查看此变量,获取连接状态,销毁重连。这样导致的结果是异常连接总会失败一次,当连接池中缓存的异常连接过多,就会造成过多的业务请求失败,且单独服务的重启操作需要也重启依赖此服务的程序,避免失败,很麻烦。
这次采用的解决方案为:各个服务thrift服务端统一新增一接口函数,名为ping()(或其他名称),ping()函数中什么也不操作。这样连接池在校验连接时,统一调用各服务的ping()即可精确得知连接状态(调用ping()失败即连接异常,调用成功即连接正常)。由于ping()为空,不进行任务业务操作,对服务端造成的压力也会很小。
1 0
- thrift无法判断连接失效的原因与解决方案
- Win10无线网络WiFi提示无法连接此网络的原因与解决方案
- 左连接失效的原因
- WinCE ActinvSync与PC机无法连接的一些原因
- vpn无法连接的原因
- MySQL中判断连接失效的方法
- javascript 与jquery 语句失效的原因
- MOF编译器无法连接VMI服务器。原因可能是语义错误的解决方案
- Xcode 代码提示失效的原因和解决方案
- NavigationView的点击事件失效原因和解决方案
- sqlserver2000无法远程连接的原因之一
- ftp无法连接的可能原因
- 无法连接到sqlsever2008 数据库的原因
- 【php】Apache无法自动跳转却显示目录与php无法连接mysql数据库的解决方案
- session失效的原因
- 过程失效的原因?
- session失效的原因
- css 失效的原因
- 安卓当下最流行的吸顶效果的实现
- cookie 的路径和domain
- Spark学习(文件读取路径)
- mysql命令行修改字符编码
- ftp命令的使用方法
- thrift无法判断连接失效的原因与解决方案
- 进程控制(上):进程创建,进程等待,进程终止
- androidStudio适应期:as中找不到R文件
- eclipse导入工程中文乱码问题
- 关于RecyclerView的一些使用见解以及使用过程中踩过的一些坑
- android联系人的简易通讯录
- 并发和并行
- 正则表达式
- js立即执行函数