平台有一个需求:处理客户端传上来的文件,并返回给客户端一个信息。如果客户端接收的信息不是200(即平台端接收文件有异常)或着平台端返回的信息超时,则会发起重传。而平台端要处理的事情是,接收文件并分析处理将关键信息入库
我刚开始的设计逻辑是这样的
刚开始一切都是OK的,但是后来文件数据量的增多,文件解析就需要耗费一定的时间,返回给客户端的信息的时间就会增加,导致返回的时候时间超时,又引发客户端超时重发的机制,所以平台端最后收到好几份数据重复的文件。
为了解决这一问题,想到的方法便是,采取多线程方式。每个文件都开启一个线程对它进行解析,不等解析结果,而是收到完整文件后就直接返回客户端OK的信息,将耗时的操作都放在多线程之中,避免客户端超时。
这个问题给我的启发是,当你和别的模块合作时,你要理解合作的模块需要你返回什么信息。比如,客户端只需要我告诉他我是否已经接收到文件,因为平台接收到文件意味着他的任务完成了,至于解析成功与否是平台的任务。
还有需要了解合作模块的基本机制,比如,如果我事先了解到客户端在超时情况下会重传,那么我会有这样的风险意识:如果我在耗时操作后再返回给客户端信息,那我可能会导致客户端重传,所以我应该抓住最关键点去返回信息给客户端,避免后续的问题产生。