粘性会话是什么:一句话定义

粘性会话(sticky session)指代理网关为同一业务身份持续分配同一个出口 IP 的路由机制:同一账号今天和下周的请求,只要租约有效,都从同一出口 IP 走出去。Resin 是 Go 编写的开源高性能代理池网关(GitHub 约 2300 star,2026-09 查询为 2337),粘性实现锚定出口 IP,节点故障时自动切到同 IP 的另一节点;本文拆解原理,部署步骤见 Resin 部署教程

为什么业务需要粘性出口

业务需要稳定出口,根源在账号与 IP 的绑定关系:目标服务的风控体系把 IP 当作账号行为画像的一部分,出口频繁变化会直接拉高异常评分。

代价有三类:

  • 登录态:频繁更换出口 IP 在风控模型里是异常信号,轻则触发验证,重则限制功能。
  • 会话中断:长任务跑到一半出口漂移,会话连续性流程直接失效。
  • 归因困难:出口漂移时,失败很难判断是节点问题还是目标服务问题;出口固定后才有干净对照。

多账号运营、数据采集这类场景的需求长期存在。Resin 把它做成网关的一等公民,README 明确写着”让同一业务账号优先绑定同一出口 IP,节点异常时自动切换同 IP 节点”。工具是中性的出口调度基础设施,合规由使用者负责,官方 README 单独列明了合法使用要求。

Resin 的粘性实现:锚定出口 IP,不锚定节点

Resin 粘性锚定的是出口 IP,节点只是到达该 IP 的载体(DESIGN.md)。两个概念(README):平台(Platform)是节点隔离池,默认有装载全部节点的 Default 平台;账号(Account)是业务侧唯一标识,带 Account 的请求会分到稳定出口。

调度流程(DESIGN.md):

  1. 首次请求租约表未命中,走随机路由选中节点,记录其出口 IP,创建租约;命中租约且节点仍在可路由集合、出口 IP 未变时继续复用。
  2. 节点失效或出口 IP 变了:同 IP 轮换,选延迟最小的同 IP 节点顶上,租约就地更新、过期时间不变。
  3. 同 IP 节点耗尽或租约过期:释放旧租约,重新随机分配。

同 IP 池内切换的价值:出口 IP 没变,目标服务看到的仍是同一个访客;底层走哪条节点业务无感。

租约细节(DESIGN.md):每个 Platform 独立维护 Account 到 Lease 的映射,Lease 记录节点 Hash、锚定出口 IP、过期时间、最后访问时间;过期时间创建时固定、不续期,后台每 13~17 秒清理过期项。超长任务要留意平台的 StickyTTL 配置。

身份怎么传给网关:四种接入方式

业务身份有四种传递方式,侵入度递减(README):

方式形态侵入度适用
正向代理认证认证写成 Platform.Account:密码能配置代理认证的客户端
反代 URL 携带账号路径里写 平台.账号简单使用与手动调试
X-Resin-Account 请求头显式请求头传递生产集成(官方推荐)
请求头提取规则从业务原有身份头提取无法改头的存量服务
# 正向代理:账号写入认证
curl -x http://127.0.0.1:2260 -U "Default.user_tom:my-token" https://api.ipify.org

# 反向代理:账号放请求头(推荐)
curl "http://127.0.0.1:2260/my-token/MyPlatform/https/api.example.com/v1/orders" \
  -H "X-Resin-Account: user_tom"

Account 来源优先级:X-Resin-Account 请求头高于反代 URL 中的 Account,高于请求头提取规则(README)。零侵入提取能把业务已有的稳定身份头(如 Authorization 里的 API Key)映射为 Account。README 提醒:请求头提取需有合法处理依据,日志与访问控制要符合当地法规。

健康检查体系:被动加主动双通道

粘性”无缝”切换的前提是故障被快速发现。健康数据来自两条通道(DESIGN.md):

  • 主动探测:ProbeManager 每 13~17 秒全局扫描一轮,经节点请求 https://cloudflare.com/cdn-cgi/trace 刷新出口 IP 与地区;延迟探测优先测 TLS Handshake 耗时。
  • 被动探测:利用真实业务流量,100% 采样、异步记录,不额外耗资源;HTTPS 流量统一测 TLS 握手 RTT。

判定标准宽松:网络层握手成功即记健康,哪怕 HTTP 返回 500,那是目标服务的问题。延迟统计用 TD-EWMA 按域名(eTLD+1)分桶,旧样本权重随时间指数衰减,平滑抖动又保留时效(DESIGN.md)。

P2C 加域名感知评分:为什么按域名评分更合理

Resin 随机路由用 P2C(Power of Two Choices):从可路由集合随机挑两个候选,比综合评分选低者,O(1) 完成(DESIGN.md)。评分两个维度:LeaseCount,节点出口 IP 被多少活跃租约占用;Latency,节点到目标域名的 TD-EWMA 加权延迟。

按域名评分比全局平均延迟更合理(工程解读,非官方原文):节点访问不同站点的延迟差异可以很大,全局平均分会把”访问 A 站快、B 站慢”的节点错当全能选手;按域名分桶后,P2C 比较的是”两个候选访问这一次这个目标”的真实口径。DESIGN.md 的严谨细节:只有两个候选都有同口径延迟时才比延迟,否则退化为按负载打分。

平台可配置分配策略(DESIGN.md):偏好低延迟、偏好闲置 IP 或均衡,评分越低越优。

熔断与坏节点剔除:一条完整闭环

熔断由连续失败计数器驱动(DESIGN.md):连续失败达到阈值 MaxConsecutiveFailures 即触发,节点立即从所有 Platform 可路由视图移除;主动与被动失败都累计计数,平台也可关闭被动熔断,只让主动探测决定节点生死。

闭环按时间顺序:探测发现失败、计数累计,期间 P2C 评分劣化、节点被冷落;达到阈值即剔除;熔断节点保留在全局池继续接受主动探测,探测成功立即恢复(DESIGN.md)。新节点默认待测,拿到出口 IP 与延迟数据后才进路由池。

可观测性配合:定位哪个账号走了哪个出口

结构化请求日志是配套审计面(DESIGN.md):每条记录含 account、platform、target_host、node_tag、egress_ip、耗时与上游错误归类,并按 platform+account 建索引。排查路径:按账号过滤日志确认出口 IP 是否固定;看 node_tag 变化区分同 IP 轮换还是租约重分配;结合错误码与失败阶段判断问题在网关还是节点。

参数调优建议:方法论先于数值

旋钮在官方 DESIGN.md 有定义:StickyTTL(平台粘性租约寿命)、MaxConsecutiveFailures(熔断阈值)、MaxEgressTestInterval 与 MaxLatencyTestInterval(探测间隔)等,但默认值没有承诺适配所有业务,数值应结合 DESIGN.md 与自身实测调整。方法论:

  1. 先用默认值上线,从日志观察出口重分配频率与疑似熔断误伤比例。
  2. 出口重分配过于频繁,先调大 StickyTTL,再检查上游订阅同 IP 节点冗余度——订阅聚合与自动刷新讲的正是这层。
  3. 熔断误伤偏多,放宽 MaxConsecutiveFailures 或关闭被动熔断,让主动探测主导判定。
  4. 每次只动一个参数,观察一个业务周期再走下一步;数值以官方 DESIGN.md 与自身流量画像为准。

常见问题

粘性会话是什么意思?

粘性会话指代理网关为同一业务身份持续分配同一出口 IP 的机制,绑定关系在租约有效期内保持稳定。Resin 锚定出口 IP,节点故障时在同 IP 节点间自动切换,业务侧无感。

sticky proxy 怎么实现?

通用做法是按身份标识维护租约表:首次分配出口并记录映射,后续命中租约即复用。Resin 的差异点是锚定出口 IP 而非具体节点,故障时在同 IP 池内轮换,目标服务看到的 IP 不变。

代理 IP 不稳定怎么办?

用带健康检查与熔断的代理池网关把订阅聚合成池,坏节点自动剔除、故障时同 IP 切换或重新分配,业务只面对稳定入口。Resin 还提供按账号的粘性绑定与结构化日志,工具定位见 Resin 是什么