DatagramPacket与DatagramSocket
背景
系统需要用UDP接收三类数据报文(不同长度),接收到对十进制转换成十六进制进行在线解析,进行一些校验并标记异常。
实现方式
发送端
DatagramSocket datagramSocket = new DatagramSocket();
DatagramPacket datagramPacket = new DatagramPacket(new byte[每类数据固定长度], new byte[1024].length, InetAddress.getByName("127.0.0.1"), 9999);
datagramSocket.send(datagramPacket);
接收端
DatagramSocket datagramSocket = new DatagramSocket(9999);
//按三类数据中最大长度来接收
DatagramPacket datagramPacket = new DatagramPacket(new byte[1400], new byte[1400].length);
//接收数据
datagramSocket.receive(datagramPacket);
//接收到的内容
recvByte = datagramPacket.getData();
//后续十进制转十六进制,对头字进行校验,进行在线解析
问题
发现进行在线解析每一条有效数据耗时150ms左右,发送端发送完数据进行关闭,接收端丢包,发送60万条数据,仅接收到8万条数据
采用多线程的方式对数据进行接收和对数据进行在线解析,但是后续做行为分析时数据是无序的报错率很多。
缩短每条数据的耗时发送kafka进行异步解耦操作,将处理一条数据的时间缩短到10ms-20ms,实现了可以接收40万条,但是还是丢了很多数据
通过写文件的方式,将在线解析转换成离线文件,再进行解析,文件过大,对文件不好操作,每条都写入,只能写入2万条
通过批量写文件的方式,每次将接收到的数据放到数组中,统一写入文件,但是会丢失最后几次的数据
最后通过队列,将接收到的数据放到队列中,开辟新线程对队列中的数据进行弹出消费,进行后续的解析