问题背景
在如下场景中出现问题,在发送端使用EPGM协议进行发送,会发送topic(带上more),再发送data数据。
例如:A,B端发送数据到C端,A端分别为A1(带more标记),A2。B端分别发送B1(带more标记),B2。
当A1,A2总数据量比较大时,例如大于1500字节时,C端收到的数据顺序为A1,B1,B2。出现乱序情况。
相关测试结论:
1、当A1、A2数据量比较小时,例如在几百个字节的时候,则不会出现乱序问题。
2、当逻辑代码不变,只把传输协议转变为TCP的时候,不会出现乱序问题。
3、当A1、A2数据量比较大时,例如上万字节时,不把他们逻辑上分包,直接合并成一个逻辑包发送。接收端的数据能正常接收。
原理梳理
先从原理上理解整个机制的发生过程:
1、ZMQ是使用了第三方的openpgm库进行发送。而这里用的协议是EPGM,他是使用传输层的udp协议对数据进行传输。
2、udp协议在一次传输过程中,协议设计的极限是一次性不能传输超过65535字节的数据。
3、对于大数据量的传输来说,由于udp的限制,一定会在EPGM这一层对数据进行分包的。具体多少,需要查看代码。
4、整个的传输过程是这样 zmq -> 发送方pgm -> 网络中udp -> 接收端pgm -> zmq -> 用户代码拿到数据。