问题引入
A与B之间需要通信,通信传输的内容数据量有大有小,比如:发送聊天消息的数据量小传输快,发送一张图片或一个文件的数据量大传输慢。现在A给B发送一个文件,紧接着发送一段聊天消息,于是B先收到一个消息提示:正在接收一个文件,然后收到聊天消息。容易发现,A发送文件时并不是等文件全部发送完后才发送聊天消息,而是先发送一个消息告诉B有文件在传输,然后发送聊天消息,最后慢慢发送文件。如果A与B只有一个传输通道就无法实现这样的用户体验,需要双通道甚至更多通道来提升传输的实时性。
双通道传输
主线程接收用户输入请求,处理请求,反馈请求结果。当处理请求时间很长,无法及时反馈给用户,会让用户很着急,于是开启工作线程后台处理请求,然后反馈处理进度给用户。为了提升用户体验,主线程和工作线程互相配合。
网络传输机制需要有一个主通道和至少一个辅通道。接收到一个网络传输请求时,如果数据量小传输快直接通过主通道传输,如果数据量大传输慢就先发送一条短消息,然后通过辅通道传输大数据。短消息的内容是用来描述大数据的业务语义信息,比如图片ID、图片缩略图,对方收到短消息后先展示缩略图,辅通道收完大图后再显示大图。
主通道需要具备有序可靠的传输能力。有序要求先发送的消息先收到。可靠要求通道链路连接的情况下消息必须送到对方,如果失败内部需要重传直到成功。所以,实现上建议主通道使用TCP。
辅通道传输没有要求,可以使用TCP、UDP直接发送,也可以使用HTTP、FTP将文件存储在服务器再通知对方下载。
发送大数据时需要主通道和辅通道配合,经过多次通信交互才能完成,于是需要引入会话。会话是一个具有唯一标识的资源,将多次通信交互过程的信息组织在一起。
双通道传输实践
主通道使用TCP、辅通道使用UDP,发送大数据的网络传输过程如下图:
1、A在发送大数据时,业务层先创建会话资源,获得会话ID
2、业务层将会话ID、大数据、大数据的业务语义描述发给传输管理器
3、传输管理器通过主通道将会话ID、业务语义发送给B
4、B收到业务语义后交给业务层,业务可以做些反馈,比如:显示进度条
5、A传输管理器通过辅通道将会话ID、大数据发送给B
6、B收到大数据后交给业务层
实现上需要注意:
1、主通道和辅通道之间不耦合,而是由传输管理器采用会话让它们互相配合
2、A只调一次发送接口,B会收到两次回调,第一次是业务语义描述,第二次是大数据
领取专属 10元无门槛券
私享最新 技术干货