1.背景

最近一个项目中,出现了java.net.ConnectException:Cannotassignrequestedaddress的异常。通过查找资料、分析后,认为是由于程序对外建立新连接,结果本地端口已经用完导致的异常。

2.问题原因

为什么会出现这种情况呢?就要从linux的TCP/IP协议栈说起了。 先看一下TCP/IP的状态图:

主动关闭连接的一方,连接会处在TIME-WAIT的状态下,需要等2MSL时间后,系统才会回收这条连接,端口才可以继续被使用。

我们的项目场景是需要发送大量的短连接。这样在高并发的场景下,就会出现端口不足,从而抛出java.net.ConnectException:Cannotassignrequestedaddress的异常。

3.解决方案

3.1 横向扩展

简单就是加机器,减少单台服务器的TCP创建次数。

不过这样需要注意几个地方:

第一,项目是否可以支持横向扩展,我们的项目是基于kafka的consumer,很难简单通过加机器做到横向扩展。

第二,需要明确单台服务器的处理瓶颈,如果随着业务量的不断增加,还是会出现这种异常。需要对应业务量的增加,不断动态调整服务器数量。

3.2 调整linux内核参数

linux内核中存在两个参数:

      net.ipv4.tcp_tw_reuse = 1表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;

      net.ipv4.tcp_tw_recycle = 1表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。

在/etc/sysctl.conf文件中加入上述参数,然后执行/sbin/sysctl -p让参数生效。

但是由于我们项目在docker中运行,并且很难单纯通过增加机器进行横向扩展。当时从网上找到了docker调整网络内核参数的方式,但是经过试验,没有效果。

3.3 针对该异常进行单独处理

如果在对实时性要求不是特别高的场景下,可以采用如果出现这种异常,就暂停发送程序,类似一种限流保护的机制,等到可以发送之后,再进行发送。

这样处理,需要能够明确项目本身或者项目的使用方能够做缓冲。(我们项目的从kafka拉去消息,暂停发送后,将消息都缓存到了kafka中,是不存在风险的)。

3.4 修改TCP短连接为长连接

出现这种问题,归根到底还是因为需要频繁创建大量的连接。那么,可不可以修改一种方式避免,避免频繁创建大量的TCP短连接。这需要根据项目的具体原因进行评估。

4.总结

虽然是java程序员,还是需要了解操作系统的底层细节。这样,出现问题可以从多个角度、多个层次去分析解决。

作者:小小辉
链接:https://www.jianshu.com/p/51a953b789a4
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Cannot assign requested address问题总结相关推荐

  1. 阿里云配置服务器报:bind: cannot assign requested address

    阿里云服务器写网络程序时必须使用阿里云服务器的内网ip,不是他的公网ip,访问时是公网ip.具体可见下面这篇文章,十分感谢!!!!使得我写的小程序可以在服务器上运行,和前端小伙伴项目可以进行下去. 参 ...

  2. 对于高并发短连接造成Cannot assign requested address解决方法

    对于高并发短连接造成Cannot assign requested address解决方法 参考文章: (1)对于高并发短连接造成Cannot assign requested address解决方法 ...

  3. nginx 报错 99: Cannot assign requested address

    为什么80%的码农都做不了架构师?>>>    nginx 报错 99: Cannot assign requested address net.ipv4.ip_local_port ...

  4. java.net.NoRouteToHostException: Cannot assign requested address

    启动脚本 jmeter.sh -n -t test.jmx -l result.jtl 参数说明 - h 帮助 -> 打印出有用的信息并退出 - n 非GUI模式 -> 在GUI模式下进行 ...

  5. Could not connect to Redis at 127.0.0.1:13141: Cannot assign requested address

    使用redis-benchmark做基准测试时提示错误: Could not connect to Redis at 127.0.0.1:13141: Cannot assign requested ...

  6. ElasticSearch 6.4.3 启动报错: [Cannot assign requested address: bind]

    今天在本地搭建一个测试用的最新版ElasticSearch6.4.3 的环境时,遇到一个报: [Cannot assign requested address: bind]的错误. 错误日志内容如下: ...

  7. 记录一次etcd报错: listen tcp xxx.xxx.xxx.xxx:2380:bind: cannot assign requested address

    记录一次etcd报错 背景 问题定位 问题排查 解决方案 小结 背景 今天打算在腾讯云环境上安装k8s(采用ansible脚本自动化部署安装),当安装完etcd之后,发现启动报错. 机器:腾讯云服务器 ...

  8. I.MX6 ifconfig: SIOCSIFHWADDR: Cannot assign requested address

    /*************************************************************************** I.MX6 ifconfig: SIOCSIF ...

  9. pscp ssh_init: Network error: Cannot assign requested address

    使用 以下命令 pscg tnsnames.ora root@192.168.50.5:/home 会报ssh_init: Network error: Cannot assign requested ...

  10. 阿里云,百度云等云服务器中搭建gitblit-1.8.0时,报java.net.BindException: Cannot assign requested address: bind

    搭建gitblit-1.8.0服务器时,启动gitblit.cmd时,报如下错误: 2019-06-16 14:07:36 [WARN ] FAILED ServerConnector@1ba2af2 ...

最新文章

  1. Windows10~VS2019~OpenCV3.4.6配置
  2. IDC公司:服务器类微处理器市场最新预测
  3. 使用HMTL5 API监控前端性能
  4. 邀请合作如何表达_有偿兼职!土木在线全媒体平台招募原创合作
  5. 操作系统中的内存分配
  6. 出现Press ENTER or type command to continue的原因
  7. python 如何快速判断列表是否相同_Python-检查列表中的所有元素是否相同
  8. bootstrap table无法服务器分页_layui分页的大坑,RequestPayload和FormData
  9. 记一次ubuntu误操作导致无法用sudo
  10. 互联网岗位介绍和成长
  11. shell编程之函数简单使用
  12. phpcms调用语句
  13. ps图片去水印-图片一键去水印的app
  14. 基于Fuzzy Logic的人群疏散模型(考虑攻击者的情况)
  15. 运筹说 第92期|爱思唯尔“高被引学者“
  16. 快速开发一个h5游戏
  17. [C++OpenCv] 两点距离、三点角度的计算
  18. 什么是案例管理模型和符号(CMMN)
  19. 销售人员的优势和动力
  20. 人类高质量七夕!python玩出花!骚操作

热门文章

  1. Linux 桌面玩家指南:03. 针对 Gnome 3 的 Linux 桌面进行美化
  2. 智能手机成瘾者的大脑功能和结构的改变
  3. Android实现头像上传至数据库与保存 简易新闻(十七 上)
  4. CocosCreator之Tween缓动动画
  5. LaTex多张子图并排排列方法
  6. 函数的连续性以及间断点
  7. 【Python】【pygame】更逼真的星星、连绵细雨
  8. 【Java】用java程序求李白的酒
  9. 女主学霸男主学神小说计算机系的,5本双学霸校园甜文:忠犬学神男主VS低情商学霸女主,全程高甜!...
  10. 计算机学霸电视剧,“学霸爱上学渣”的4部电视剧,部部甜到爆炸,全看过的真有眼光...