问题1:业务场景:
一个netty的服务端,和上百台的硬件储物柜连接,储物柜每200毫秒发送一次当前储物柜物品存储信息
我的疑问:
储物柜每200毫秒发送一次当前储物柜的存储信息,我可以认为这是心跳信息,但是服务器有没有必要每次都进行回复?如果不回复的话,只是储物柜单方面发送信息,会不会导致tcp连接断开?
答:两种结果,如果储物柜端发送出去,不等回复。那么就是在服务端,需要有一个检测机制,定时轮询的检查有哪些终端没有请求。没有请求的就是异常,基本可以判定故障,可以服务端发送请求到终端尝试重新建立连接,能够建立成功,说明没啥问题。不成功就是断开了。
如果是需要服务端回复,那终端就会有实时的网络连接状态感知。没有收到回复的时候,从终端尝试发起重试。
一般常见的,第二种有请求回复的比较多
问题2:业务场景
1.客户有几百个储物柜,储物柜一共6层,每2秒会发送一层的RFID电子标签信息到服务端,由服务端判断储物柜里的物品是否取出、或存入
服务端也可以发指令给储物柜进行开门操作
2.目前是用netty和储物柜进行tcp通讯,24小时不间断的,每2秒储物柜就会发送一层信息给到服务端
遇到的问题:
程序运行一段时间后,偶尔会出现程序下发开门指令后,储物柜不能正常开门
我的疑问:
1.储物柜24小时不间断,以每隔2-5秒发送一次信息给服务端,是不是可以替代心跳信息?
2.储物柜发送过来一层rfid信息,我随便回复一个文本,是否可以认为这也是一次心跳检查结束?还是说一定要发ping、pong心跳?
3.如果出现断连的情况后,能从服务端进行重连操作么?因为所有储物柜的ip,服务端都是知道的,还是说重连操作只能在客户端进行?
4.像这种偶发性的断连,如果问题出在防火墙上,其他因素的拦截上,这时候应该如何排查?排查思路是怎么样的?
5.我现在的项目架构是硬件和服务端通讯通过netty搞定,至于产生的大量消息的处理是通过rocketmq去削峰处理,想请教下老师类似这种业务场景还有其他更好的解决方案么?我听说MQTT是专门解决硬件通讯的场景的?谢谢!
答:
1、完全可以的,相当于上报自己的健康状态。本质上也是心跳机制
2、只要能正常的请求和响应,就认为是一次健康的请求,服务端可以做一些记日志的操作。
日志量大的话,通过rocketMQ或者kafka去做异步化。没有必要一定是ping、pong,这里内容不重要。
3、既然知道储物柜的ip,最好的方式,是在储物柜端和服务端都预留好重建连接的接口,两边都可以尝试重新建立连接。
4、网络问题、防火墙问题的排查:一方面,通过网络请求抓包,查看TCP/IP协议的请求头,根据失败的类型大致判断出来出问题的点,然后查看相关的日志分析。另外一方面,根据出问题的时间段,排查日志
5、RocketMQ网络方面可能是比较重的。MQTT是专门的高效可靠连接海量物联网设备,每秒处理百万级的消息。他适用于硬件性能比较低的远程设备,和网络状况不太好的情况。网络开销非常小,也可以降低网络流量,还有特性通知客户端的异常中断机制。很适合你们的这种硬件储物端到服务端的场景。