非常大的HTTP请求 vs 多个小请求

50
我需要将一个2D数组(以Json格式)从服务器发送到客户端。其大小大约为400x400,每个条目大约为4个字符。因此它的数据量大约为640KB。
以下两种极端方法哪一种更好?
1.我一次性发送所有数据的大型HTTP请求。 2.我进行400个请求——每个请求要求一行数据(大约1.6 KB)。
我认为最佳方法应该在中间某个位置。有人能给我一个关于这些数据最佳单个请求大小的想法吗?
谢谢。
3个回答

90

选择一个大请求还是多个小请求的考虑因素:

  • 在单个请求的情况下,您无法在数据到达时进行渐进式数据处理;您需要等待完整数据包到达后才能执行任何操作。如果请求失败,您需要从头开始执行所有内容。
  • 在多个请求的情况下,您可以进行渐进式数据处理。然而,现在你需要考虑多个请求可能会失败以及如何从这些失败中恢复。
  • 多个请求会产生每个请求的额外开销。这是您的应用程序将要使用的额外带宽。
  • 一些HTTP代理限制对同一服务器的并发请求数量,您可能需要编写一些逻辑来解决这个问题。
  • 单个请求情况下,响应压缩效果更好。
  • 多个请求不需要为数据分配完整的内存。尽管640KB不是很大的内存块,但根据您分配它的频率,这可能不是您考虑的重要因素。
  • 如果进程早期终止(取消按钮或应用程序终止或浏览器导航离开您的页面),则单个请求仍将完成完整的响应下载;然而,在多个请求的情况下,您的代码尚未开始的任何请求都将不会被执行。

老实说,我不会太担心后面两个问题,并且会基于以下两点来选择:

1)渐进式数据处理是否重要;2)您的应用程序对于失败和部分数据的容忍度是多少。


12
+1 我认为这个回答比目前被接受的回答更好,因为它提供了两个选项的很好比较,而不是直接回答。 - Wingblade
考虑缓存/破坏。缓存的单个请求意味着任何更改都会导致另一个大请求。将其拆分为多个请求,任何更改只需要重新下载该块即可。 - None

62

4
+1 - 并且你可以避免往返造成的开销。即使在20毫秒的情况下......400个请求也会导致8000毫秒的开销= 8秒。在80毫秒(较远)的情况下,将浪费32秒。 - TomTom
非常感谢David和Tom。这真的很有用。 :) - Nikhil Garg
5
@TomTom,你没有考虑到并行请求的因素!如果没有限制并发连接,并且连接很完美,则在开头和结尾只需要20毫秒 :) 如果我错了,请纠正我,这只是400 x(处理标头所需时间)而不是400 x RTT。 - Saravanabalagi Ramachandran
2
@ZekeDran — 浏览器对并发连接数有限制。 - Quentin
假设是六,最终值会减少6倍,接近1.33秒;因此,如果没有渐进式处理,这1.33秒仍然是浪费的! - Saravanabalagi Ramachandran

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接