并发连接
代理在轻负载下可能运行稳定,但当更多工作进程或程序同时运行时,就开始报错。一个可能的原因是超过了允许的并发连接数。
这项限制属于代理使用限制。要理解它控制什么、为什么会达到上限,首先需要了解网络连接是什么,以及它如何通过代理工作。
什么是连接,它如何工作
网络连接是两个程序为交换数据而建立的通信链路。例如,浏览器连接 Web 服务器,请求页面并接收其内容。连接提供交换数据的通道;请求和响应则是通过该通道发送的消息。
以常规 TCP 连接为例,应用程序联系服务器的 IP 地址,以及所需服务使用的端口。双方交换控制消息来建立连接,随后以称为数据包的小单位传输数据。TCP 跟踪传送情况、安排重传丢失的数据,并将数据按正确顺序交给接收方。在连接存在期间,双方都会保存与此次通信有关的信息。
使用常规 TCP 代理时,应用程序先连接代理服务器。代理再单独连接目标网站,并在两个连接之间双向转发数据。因此,代理同时维持着与客户端和目标的通信。
应用程序可以发送请求、接收响应,然后利用已建立的连接再次通信。例如,收到页面并不一定会关闭连接:浏览器可能保留连接,以便继续向服务器发送请求。不再需要时,由其中一方关闭连接;错误或超时也可能使连接结束。关闭之前,连接可以一直存在,而不必持续传输数据。
程序可以同时保持多个这样的连接:通过一个接收数据,通过另一个等待回复,再保留第三个供后续请求使用。这些就是并发连接。其数量描述的是当时处于打开状态的通信通道,而不是程序启动以来发出的请求总数。
限制计量的是什么
一个打开的连接会占用相应额度中的一个名额。当连接关闭,且服务将其从计数中移除后,该名额便可再次使用。这项限制针对当前活动,因此达到上限并不代表用完了某个月度连接余额。
连接如何计入客户额度,是另一项服务规则。代理两侧的两段网络连接,并不自动意味着要占用两个额度单位。
服务商设置这些限制,是因为打开的连接即使很少传输数据,也会消耗服务器资源。等待回复的连接仍需维护。控制连接数量,有助于服务保留足够容量,承担其承诺支持的工作负载。
同一服务可能同时适用多种不同限制:
| 限制 | 控制的内容 |
|---|---|
| 并发连接 | 可以同时保持多少个连接 |
| 并发请求 | 可以同时处理多少个请求 |
| 每秒请求数 | 可以多频繁地发送或处理请求 |
| 传输速度 | 每秒可以传输多少数据 |
| 流量额度 | 一个计费周期内可以传输多少数据 |
因此,不限流量并不说明允许多少个同时存在的连接。新建连接的速度也可能另有上限。即使任一时刻保持打开的连接很少,快速建立并关闭连接,也可能触及该项上限。
为什么线程数不等于连接数
应用程序中的线程或工作进程数量,描述的是它如何组织任务,不能可靠地反映代理会计入多少个连接。一项任务可能联系多台服务器,而异步脚本可以管理许多网络操作,无须为每项操作单独创建一个操作系统线程。
也并非每个 HTTP 请求都需要新建连接。客户端可以复用已有连接,HTTP/2 也可以通过一个连接同时承载多个请求。因此,请求数和连接数不同。
服务商使用的术语也很重要。标为“线程”或“会话”的限制,可能指打开的连接,也可能指正在处理的请求。为相关请求保持同一代理 IP 的粘性会话,不一定对应一个网络连接。真正有用的定义,是服务实际计数的对象。
哪些程序共享额度?
上限可能适用于账户、已购套餐、单个代理 IP 或特定网关。对于账户或套餐级别的限制,应将使用同一额度的所有程序和设备的连接相加。把 IP 列表分给几台计算机,并不会让每台计算机各获一份独立额度。
按 IP 设置上限时,分布方式有所不同:一个繁忙地址可能已达到上限,另一个却还有空余。如果服务没有同时设置一个更低的共享上限,将部分任务移至第二个地址可能有帮助。一个套餐既可能有总体额度,也可能为各用户或客户端 IP 分配较小额度。
允许通过身份验证的客户端 IP 数量,是另一项设置。它控制哪些网络可以访问代理,而非这些网络能打开多少个连接。同一公网 IP 后的多台设备,可能共同使用这项访问规则及该 IP 对应的连接额度。
更换网站看到的代理 IP,不会重置整个账户的连接额度。同样,更换粘性会话名称或协议,也不会自动增加容量。上限仍归属于服务商用于计数的账户、套餐或连接端点。
为什么连接会积累
当新连接的建立速度快于现有连接的关闭速度时,连接就会积累。加载页面、下载文件或并行运行其他网络任务时,都可能出现这种情况:部分连接仍在传输数据或等待响应,应用程序却又打开了更多连接。这些连接同时计入额度,总数可能达到代理连接数上限。
响应缓慢会使连接被占用更长时间。如果程序继续以原来的速度启动新任务,未完成的工作就会堆积。如果程序将并行活动保持在固定水平,网站变慢通常意味着每分钟完成的任务减少。代理套餐不变时,这两种情况都可能发生。
长时间下载和等待超时的连接,也会产生相同影响。因此,大量打开的连接可能与较低传输速度同时出现:大量时间花在等待,而不是传输数据上。
有些连接会刻意在请求之间保持打开,通常称为 keep-alive。这样可以避免每次重新建立连接,但如果服务按打开的连接计数,空闲连接仍可能占用名额。连接归还应用程序的连接池后可供复用,但不一定已经在代理端关闭。
另一个问题是连接清理不当,现成软件和自定义脚本都可能出现。例如,代码开始读取响应后遇到错误,未完成或关闭之前的响应,就发起了另一个请求。如果新连接不断打开,旧连接却持续被占用,应用程序可能在没有完成更多有效工作的情况下耗尽额度。因此,除了成功请求之后,还应检查发生错误和取消操作之后的连接清理。
正确清理能让客户端复用合适的连接,或关闭不再需要的连接。超时设置可防止被放弃的操作无限等待。全面禁用复用并非通用解决办法:这会增加建立连接的工作,还可能提高新建连接速率。目标是控制可复用连接的数量,并正确释放或关闭不必要的连接。
为什么代理似乎时好时坏
负载增加时出现间歇性失败,应尽早检查连接数上限。有些代理地址似乎正常,另一些却失败;过一会儿,情况又变了。从应用程序角度看,可能像是代理列表中的不同部分不断掉线。
一种解释是共享额度已满。现有连接可能继续工作,而新建连接的尝试遭到拒绝或继续等待。较早的连接关闭后,一些新尝试可以通过;可用名额再次占满时,其他尝试又会失败。结果不断变化,是因为大家竞争同一额度,而不是某一批固定 IP 已经损坏。
这种行为有时被称为限流。这里限制的是新连接的接入,并不一定会降低每个已建立连接的速度。具体表现取决于服务:它可能返回明确的上限提示、拒绝连接,或让客户端一直等到超时,并不保证提供等待队列。
要验证这种解释,应对照失败时间和连接数,并临时降低所有共享额度的程序的并行活动。如果活动降至上限以下时失败消失,额度再次占满时失败重现,那么连接数上限很可能就是原因。类似中断也可能来自目标网站或网络。单凭超时或 HTTP 429、502、503 响应,无法确定代理连接数已达到上限;错误的来源和具体表述很重要。
如何在限制内完成有效工作
从软件实际需要访问的网站和执行的操作开始。逐步增加并行活动,观察成功结果、响应时间和连接峰值。仅对快速页面进行一次简短测试,可能无法代表包含登录、大型响应和较慢连接端点的完整运行。
- 为所有程序共同分配连接预算。为其他活动和短时峰值留出空间。如果多个进程使用同一套餐,每个进程都按套餐全部额度设置,同时运行时就可能使服务超载。
- 同时控制任务和连接。连接池保存连接以供复用。应确认其大小设置是硬性上限,还是仅表示操作后保留的数量;部分客户端若未启用等待模式,仍会打开额外连接。始终做好响应清理和超时设置,包括任务失败时。
- 错开启动和重试。所有浏览器同时启动,或每个失败请求立即重试,都会形成新的峰值。限制重试次数,逐次延长等待时间,并将重试纳入同一工作负载预算。超时也不能证明提交的操作已经失败,因此重复购买或更新操作时需要谨慎。
- 衡量实际完成的工作。增加工作进程,只有在提高成功处理量时才有用。如果主要增加的是等待和错误,降低设置反而可能更快完成同一任务。如果控制面板按时间显示活动平均值,短时峰值可能不如应用程序错误时间戳中明显。
对于浏览器任务,避免不必要的下载也能减少网络活动。任务不需要图片或视频时,阻止加载这些资源可能有帮助;移除脚本则可能破坏操作本身。应根据预期任务是否仍能正确完成来评估调整。
什么时候提高上限有帮助
当应用程序已妥善管理连接,而所需工作负载仍持续触及服务商上限时,增加连接容量就有意义。它可以让更多任务同时运行,不再争用同一小份额度。
购买的内容必须提高实际触及的那项上限。如果限制按 IP 设置,将任务分散到新增 IP 上可能有帮助。如果限制由整个套餐共享,新套餐或附加选项就必须提高该共享额度。仅增加 IP 数量,并不能证明额度也会随之提高。
其他环节也有上限。客户端的连接池可能更小,计算机可能缺少网络资源,目标也可能限制请求。无论允许多少个代理连接,一条移动网络连接也有其自身可用带宽。购买更多并发容量不会解除这些限制,也无法修复不断泄漏连接的脚本。
实际目标是为工作负载的正常峰值留出足够空间,同时保持较低失败率。确认这一点后,额外连接额度才是一项有用的容量升级,而非推迟修复应用程序的办法。
