paho mqtt不定时抛出Connection reset异常导致客户端掉线

  • 现象
  • 分析
  • 优化方案

现象

我们的项目采用paho的mqttv3库作客户端,起初运行状况良好,随着终端设备和用户量的增加,发现服务端经常自动抛出异常导致mqtt client掉线且无法reconnect。异常信息如下:

org.eclipse.paho.client.mqttv3.MqttException: 已断开连接at org.eclipse.paho.client.mqttv3.internal.CommsSender.handleRunException(CommsSender.java:194)at org.eclipse.paho.client.mqttv3.internal.CommsSender.run(CommsSender.java:171)at java.lang.Thread.run(Thread.java:748)
Caused by: java.net.SocketException: Connection resetat java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:115)at java.net.SocketOutputStream.write(SocketOutputStream.java:155)at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)at org.eclipse.paho.client.mqttv3.internal.wire.MqttOutputStream.flush(MqttOutputStream.java:49)at org.eclipse.paho.client.mqttv3.internal.CommsSender.run(CommsSender.java:149)... 1 common frames omitted

分析

我们知道,Connection reset的原因是服务端关闭了connection,而客户端依然在读写数据,此时服务器返回复位标识RST,此时客户端就会提示java.net.SocketException: Connection reset

我们在排除了服务器、网络、EMQX的嫌疑后重新分析,发现问题在随着设备和用量的增加而出现得愈加频繁,怀疑是mqtt消息量太大造成了积压,于是进行了模拟测试——我们频繁发送mqtt数据到服务,而每次接收到mqtt消息后让线程sleep 30秒,人为造成消息的积压。果然,几分钟后又抛出了java.net.SocketException异常。

可见,该异常的产生是由于我们处理mqtt消息速度较慢,导致了后面消息的积压。在处理最后这条消息的时候,由于发送消息的connection已经关闭,读取该消息就会出错。

优化方案

知道了问题产生的原因,自然就可以进行修改优化了。我们提出了以下几个方案,小伙伴们可以根据自己的实际情况考虑:

  1. 采用缓存技术处理数据,减少消费消息时的耗时;
  2. 如果mqtt消息是设备端定时发送的数据,考虑抛弃掉一些不关键的消息;
  3. 采用多线程技术异步处理消息,降低消息处理的延迟;
  4. 启用多个客户端处理来自不同设备的消息;
  5. 考虑引入流处理计算引擎等。

paho mqtt不定时抛出Connection reset异常导致客户端掉线相关推荐

  1. java抛出数组格式异常,Java中异常

    一.异常的概述 在Java中,把异常信息封装成了一个类.当出现了问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置.原因等). 二.异常的继承体系和错误的区别 1.异常的继承体系 Thr ...

  2. java中子类可否抛出两个父类抛出的异常的子类_父类的多个构造方法各自抛出不同的异常,子类的构造方法应该抛出哪个/些异常?...

    [情况描述]如下代码,在父类中定义了两个构造方法,各自throws不同的异常.当定义子类时,IDE会提示需要显示定义构造方法来抛出父类构造方法的异常.很自然地认为应该抛出父类所有构造方法的异常,然而只 ...

  3. c# throw抛出上一个异常

    c# throw抛出上一个异常 参考文章: (1)c# throw抛出上一个异常 (2)https://www.cnblogs.com/gaara-zhang/p/9215031.html 备忘一下.

  4. C++ 抛出和接收异常的顺序

    代码编译运行环境:VS2017+Debug+Win32 异常(exception)是 C++ 引入的错误处理机制.它采用了统一的方式对程序的运行时错误进行处理,具有标准化.安全和高效的特点.C++ 为 ...

  5. 一次SocketException:Connection reset 异常排查

    一次SocketException:Connection reset 异常排查 参考文章: (1)一次SocketException:Connection reset 异常排查 (2)https:// ...

  6. oracle异常抛出,ORACLE 存储过程异常捕获并抛出

    for tab_name in tables loop execute immediate 'drop table '||tab_name; --此处可能会报错 end loop; 当前情况是,循环表 ...

  7. python输入字符a时停止_Python解释器在主提示符或从属提示符后输入中断符( )就会取消当前输入,回到主提示符,会抛出一个KeyboardInterrupt异常。...

    [单选题]下列对于字符编码的发展历史节点,正确的是( ). [单选题]Python3解释器执行 not 1 and 1的结果为( ). A. B. C. 0 D. 1 [单选题]Python3解释器执 ...

  8. java 非法参数异常_Java的比较抛出非法参数异常

    我得到这个错误:当我试图在Java中运行这个比较对我的实体系统Java的比较抛出非法参数异常 Exception in thread "Thread-3" java.lang.Il ...

  9. 怎么一次抛出多个异常

    定义一个自定义异常,如下: import java.util.ArrayList; import java.util.List;/*** 自定义异常*/ public class MyExceptio ...

最新文章

  1. 3名女研究生,状告哈佛!
  2. Python学习教程实用技法:通过公共键对字典列表排序—itemgetter
  3. 在SAP ABAP和Hybris Commerce里启动后台作业
  4. python元组操作_Python 列表和元组操作
  5. GC内存可视化器教程–第一部分
  6. JDK8利用Stream为集合对象分组并编号
  7. TikTok最适合普通小白的赚钱方法?
  8. 中livechart显示大数据_大数据显示:辽宁新基建技能人才存量居全国第十位
  9. [NEHE Couse] 05.3D Objects
  10. Linux分区的那些方案
  11. tensorflow的类、变量和函数讲解
  12. 平稳性的检验 java_[时间序列分析]--平稳性,白噪声的检验
  13. KMeans聚类分析实战——如何把城市划分成不同的种类
  14. matlab华侨大学,范文涛
  15. php连接mongodb数据库报错No suitable servers found
  16. 802.11协议wifi新加密方式WPA3介绍
  17. 软件性能测试需要什么资质,性能测试CNAS资质软件验收测试报告
  18. HTML——3D旋转+动画 旋转木马案例
  19. Linux操作,su切换用户命令中有无横杠“-”的区别
  20. PyCharm Community 2021.2 安装与汉化

热门文章

  1. 数字电位器程控可调电阻IC
  2. MySQL小的出库入库_根据出库、入库表,实现对库存的信息查询
  3. 基2-booth乘法器原理及verilog代码
  4. Trade and the world economy -- 贸易与世界经济
  5. 图解IFRS 9 金融工具(13)实施时间及结语
  6. 人生在世究竟是为了什么
  7. Linux的bind服务
  8. 微服务架构下路由、多活、灰度、限流的探索与挑战
  9. 杀狗问题(帽子问题)
  10. 微信小程序开发教程-微信小程序入门