Java面试笔试面经、Java技术每天学习一点

Java面试

关注不迷路

作者:haolujun

来源:https://www.cnblogs.com/haolujun

背景

今年开发了好多服务,着实踩了不少的坑。这不,分分钟就被探活搞的死去活來。这里我把这些经验分享给大家,避免大家再继续犯这种错误。

通用tcp探活原理

其实,探活原理特别简单,只要稍懂计算机网络就能够理解。

  • 检测端 发起tcp三次握手,建立新连接,连接建立成功代表服务活着,建立失败代表服务死了,之后发送rst包主动断开连接。

  • 被检测端 接受检测端发送的三次握手手建立连接,当接收到检测端的rst包后,被检测端断开连接,释放资源。

但是假如rst包丢失了,会发生什么样的情况呢?我们以thrift为例讲述一下之后所发生的事情,如下图所示。

经过三次握手后,服务端已经建立一个新的数据连接,并把连接丢给工作线程。服务端的工作线程监听连接,并准备接收请求(毕竟,任何一个thrift服务都是先接收请求数据,之后进行计算,最后返回响应数据,所以当新连接建立后,thrift默认首先读取连接上的数据)。

检测端建立连接成功后,认为下游服务还活着,所以立刻发送rst包(检测端认为这个rst包一定会到达被检测服务),并且释放连接资源。

但是如果网络状态不好,rst包丢失,那么服务端(被检测端)的工作线程就会无限制的hang在读取连接数据上(因为检测端已经单方面认为连接断开,不会写任何数据,所以服务端也读不到任何数据)。如果多丢几个rst包,那可以预期无论你有多少thrift工作线程,都将会hang死。

此时真正调用服务的客户端的请求也无限制的hang住,因为这些请求得不到thrift工作线程的处理。

最最可怕的是:由于探活只是单纯的建立连接而并不发送或者接受额外数据,并且thrift服务有单独的线程进行accept,这导致了连接建立每次都成功,但实际上服务已经没有了计算能力。

最后的结局就是:整个系统流量突然降低,下游接收不到请求(以为是上游调用的锅),上游发出的请求得不到响应(认为是下游服务的锅),并且没有报警短信发出(以为是运维的锅),对排查问题造成很大的困扰。

出现这种问题时有一个非常明显的现象:即使在系统流量为0的情况下,服务端也会不断有新连接建立并处于Establish状态(这是因为周期性的探活导致的),并且服务端日志不滚动,客户端请求无响应。如果你的系统有这种情况,那么多半和探活有关。

我当时遇到的情况比较糟糕,因为之前一段时间rst丢包率特别低,平均几天丢一个rst包,所以服务hang死造成的影响并不大,只要抽空重新启动服务即可。可是突然某一天,单台服务的rst丢包数达到了秒级:隔几秒丢一个rst包,导致我的服务短时间内全部hang死。

HTTP探活原理

在实际工作中,对于HTTP服务的探活通常也采取TCP探活原理,毕竟HTTP建立在TCP服务之上,所以TCP探活同样适用于HTTP服务。很多HTTP服务实现原理和thrift大同小异,所以当TCP探活的rst包丢失后,HTTP服务同样会hang在读取连接数据。

为了避免rst包丢失,HTTP服务通常使用HTTP探活请求:探测端对被探测端发送特定的HTTP请求,并且验证被探测端的响应数据是否符合预期。如果rst包丢失,服务端连接最差的情况下会处于TIME_WAIT状态,经过2倍超时时间后服务端会主动关闭连接释放资源,这样服务端的工作线程不会长时间的被占用,相比于用TCP探活要好的多。HTTP探活原理如下图所示。

此时rst包虽然丢失,但是由于探测使用的HTTP请求,那么整个请求的交互就会完成(探测端会等待服务端的响应数据,所以能够确保服务端能够完成这个响应),服务端发送完响应数据后会主动关闭连接,发送FIN包(一般的HTTP服务框架默认都会这么做),服务端连接处于TIME_WAIT状态,经过一段时间后连接释放,不会长时间占用服务端资源。

对于HTTP服务,我们需要提供一个不耗费cpu和内存的调用接口,这个接口只是为了满足HTTP探活请求调用,如果探活接口死了,可以认为这个服务也死了。

如何确保不被探活搞死?

我们不能保证网络时时刻刻正常rst包不丢失,所以我们只能改造服务使得其更健壮。
正确解决方案如下:

  • 服务端加入读超时时间。当rst包丢失导致服务端线程hang在读取上,超过一定时间后服务端线程会主动断开连接,释放资源,从而确保服务端线程能够服务于其它请求。

  • 客户端请求服务端加入超时限制并进行重试。当一个服务hang死,导致连接其上的客户端也hang住后,超过一段时间后,客户端主动断开连接并且尝试请求其它可用服务。

现在我们清楚探活问题的来龙去脉,那么我想问:你的服务加入超时时间了么?你的服务会被探活搞死么?

什么?-你的服务竟然被探活搞死了?相关推荐

  1. 针对数据库连接池到DRDS连接探活的优化

    简介: 针对数据库连接池到DRDS连接探活的优化 1. 问题背景 近期在给某专有云客户进⾏云产品应⽤性能优化分析时,发现了⼀个有趣的关于DRDS使⽤层⾯的问题,这⾥给⼤家分享⼀下. 使⽤过DRDS产品 ...

  2. 【计算机网络】2、TCP:四次挥手与TIME_WAIT、shutdown() 优雅关闭 server、探活、拥塞窗口与 Nagle 算法、端口占用、tcp 的流式协议、可靠性

    文章目录 六.四次挥手 与 TIME_WAIT 6.1 TIME_WAIT 的作用 6.2 TIME_WAIT 的危害和方案 七.server 用 shutdown() 优雅关闭 7.1 close( ...

  3. 技术分享 | 探究 Druid 连接池探活方式的实现

    作者:刘开洋 爱可生交付服务团队北京 DBA,对数据库及周边技术有浓厚的学习兴趣,喜欢看书,追求技术. 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源 ...

  4. HikariCP探活机制如何保证链接有效

    最近遇到了数据库链接池的链接被负载均衡器关闭之后,应用端没有准确捕获到无效链接,导致最终报错.所有很想知道HikariCP探活机制如何保证链接有效的.关键的参数如下: connection-timeo ...

  5. 活与死、回调以及面向对象设计

    [关键词] 活与死 回调函数 面向对象设计 [活与死] 在面向过程的程序设计里,main函数是活的,函数库等是死的.可以说,所有非main函数的函数,都是直接或间接被main函数调用. 在MFC程序设 ...

  6. 进医院就有活有死!这标题真吓人!

    进医院就有活有死!这标题真吓人! 医院本是救死扶伤的地方.一个健康的人谁会抽风去医院呢!如果知道你这医院是这样的态度还会有谁去你哪里看病医治!进医院就有活有死这是处于一个医院负责人之口!个人看到这个标 ...

  7. 微软29岁员工年薪税后85W!竟然说自己活得很惨!网友:确实挺惨!

    什么是真正的穷?什么是真正的惨? 可能很多漂在大城市的人都觉得自己惨,收入不高,没房没车,惨兮兮的故事可以搜集一箩筐,但这位微软员工的哭惨却让人越看越不是滋味. 微软,29岁,税后85万,竟然还觉得自 ...

  8. Nginx负载均衡探活max_fails和fail_timeout的设置、根据参数转发upstream

    Nginx负载均衡max_fails和fail_timeout的设置作用,直接贴配置上,看干货 server { listen 80; server_name xxxx.ikong.com; loca ...

  9. mysql探活_MYSQL探索

    concat select * from where concat(字段1,字段2,...)   = 'e1234234'; 查询几个字段拼接起来是e1234234的数据, concat(字段1,字段 ...

最新文章

  1. springboot原生mysql写法_【Rainbond最佳实践】Spring Boot框架配置MySQL
  2. Ubuntu 防火墙配置小记
  3. 为了你,我一定要写诗
  4. linux下devel包的作用
  5. 无人值守网络安装Linux
  6. vscode自定义HTML、vue等模板内容(一个、多个)- 教程篇
  7. Android Logcat 报错:Could not create the view: For input string:
  8. Mybatis系列全解(六):Mybatis最硬核的API你知道几个?
  9. Linux内核写入s3c2440,Linux空板的系统写入
  10. python开发精典课程_Andrew Ng经典机器学习课程的Python实现(第1部分)
  11. os.path.join()函数
  12. 霍尔编码器-STM32读取
  13. JAVA领域10位大神
  14. 【云图】自有数据的多边形检索(云检索)
  15. 为啥现在还有人相信5G辐射危害健康?
  16. Android开源的精美日历控件,热插拔设计的万能自定义UI,你值得拥有
  17. 唱好铁血丹心谐音正规_铁血丹心 谐音
  18. 一款基于 SpringBoot 开发 OA 系统 !
  19. windows2008 iis7环境SSL部署https多站点
  20. 对于一个大于或等于3的正整数,判断它是不是一个素数。

热门文章

  1. 六月集训(第26天) —— 并查集
  2. Google Play Game Services LeaderBoard
  3. iVMS-4200 Vs区别_增额终身寿比拼:中华尊VS如意尊VS锦绣传承VS君康金生金世
  4. 理解单端,全差分、伪差分
  5. FPGA差分转单端,单端转差分 IBUFDS OBUFDS BUFG
  6. 以色列摩萨德针对伊朗核设施进行破坏性网络攻击导致断电
  7. 文档识别,OCR录入
  8. 寂静之地百度云在线观看迅雷下载A Quiet Place高清BT下载
  9. 用smtplib来发送邮件
  10. mysql配置域名_bind+mysql域名解析的简单配置