Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多个并行Http请求的优势_Java_Android_Http_Networking_Web - Fatal编程技术网

Java 多个并行Http请求的优势

Java 多个并行Http请求的优势,java,android,http,networking,web,Java,Android,Http,Networking,Web,当我们创建多个连接/请求时,实际会发生什么情况?与顺序请求相比,它的速度有多快?我有这个问题,因为在并行请求的情况下,带宽不是跨请求共享的,导致响应时间长 在我的例子中,我们使用volley库在不同的线程上执行多个请求,但它如何有用呢 有人能解释一下并行请求是如何以及为什么被优先选择的。那么,假设你和一个棒球和三个朋友站在一个场地上 你想把球扔给你的每个朋友,所以你把球扔给你的第一个朋友。他把它扔了回去。然后你把球扔给你的第二个朋友,他把球扔回去,然后你的第三个朋友,等等 现在让我们假设你站在一

当我们创建多个连接/请求时,实际会发生什么情况?与顺序请求相比,它的速度有多快?我有这个问题,因为在并行请求的情况下,带宽不是跨请求共享的,导致响应时间长

在我的例子中,我们使用volley库在不同的线程上执行多个请求,但它如何有用呢


有人能解释一下并行请求是如何以及为什么被优先选择的。

那么,假设你和一个棒球和三个朋友站在一个场地上

你想把球扔给你的每个朋友,所以你把球扔给你的第一个朋友。他把它扔了回去。然后你把球扔给你的第二个朋友,他把球扔回去,然后你的第三个朋友,等等

现在让我们假设你站在一个场地上,有三个棒球和三个朋友

你把一个球扔给你的第一个朋友。现在球在空中,所以你拿起另一个球并把它扔给你的第二个朋友。当球在空中时,你把最后一个球扔给你的第三个朋友


很容易看出,通过同时在空中放置多个球,整个过程所需的时间将大大减少。同样的原则也适用于HTTP请求。显然,正如您所说,您必须能够有多个连接和多个线程;但是,当您能够做到这一点时,您将在较短的时间内完成相同数量的工作。

我至少可以想到三个原因:延迟、数据包丢失和流量整形

  • 延迟:许多网络连接(尤其是蜂窝连接)之所以变慢,是因为延迟是指请求往返服务器所需的时间。假设您发送了五个请求,每个请求需要一秒钟的时间才能到达服务器并返回响应。如果您按顺序发送所有五个请求:

    0   1   2   3   4   5
     RQ1 RQ2 RQ3 RQ4 RQ5|
    
    然后需要五秒钟。假设你一个接一个地发送它们

    0   1   2   3   4   5
     RQ1    |
      RQ2   |
       RQ3  |
        RQ4 |
         RQ5|
    
    这需要更少的时间,因为设备可以在前一个请求仍在运行时发送下一个请求

  • 数据包丢失:另一个导致数据包丢失的原因(同样,特别是在蜂窝网络和Wi-Fi网络中)。TCP通常使用拥塞控制技术,以避免在网络链路(两个路由器之间的线路)饱和(容量)时造成过度的数据包丢失。当操作系统检测到数据包丢失时,它会暂停传出的数据包流,然后缓慢地再次开始发送数据包(包括重新传输丢失的数据包),速度越来越快,直到数据包丢失,然后再次退出,依此类推

    由于此退避过程对每个打开的TCP套接字独立进行,因此,如果同时打开多个套接字,则一个套接字上丢弃的数据包将不会对其他套接字产生影响。因此,请求不会因为在其他请求期间发生的数据包丢失而被任意延迟

  • 流量调整:通常,ISP会调整流量,使交互流量优先于下载流量。这会导致每个网络连接起初都非常快,然后在一定时间或传输一定量的数据后会减慢到爬行速度

    通过在多个连接上并行发出多个请求,您可以同时而不是连续地承受时间损失

  • 所有这一切的结果是,人们试图设计网络协议,以尽量减少往返次数,尽量保持多个请求同时运行,并尽可能减少请求之间的依赖性(根据请求A的响应发送请求B和C)

    例如,在编写web浏览器时,只要对HTML进行了部分解析,足以告诉您需要加载给定的图像或CSS文件,就可以开始获取图像和CSS。越早启动每个依赖请求,加载整个页面并呈现页面所需的时间就越短