🔗 另一个服务器端?a
.. 或者,实际上它是一个 HTTP 客户端。
🔗 什么?
需要一个简单的 HTTP 客户端来管理到源服务器/对等节点的连接。
🔗 它会做什么?
- 管理到源服务器/对等节点的网络连接。实际上,它应该将它们视为基本相同。
- 处理到上述源服务器/对等节点的身份验证(如果需要/在需要的地方)。
- 处理网络层转换 - 例如 SSL。
- 管理持久连接
- 正确处理固定连接
- 处理一组最终服务器/对等节点之间的简单基于连接的负载均衡。
- HTTP/HTTPS CONNECT 风格的连接
🔗 它不会做什么?
- 处理内容/传输编码(例如 gzip/deflate)
- 处理任何缓存逻辑
- ACL 检查
- 内容过滤/重写
- 决定如何处理目标主机 - 中间层应决定对等 IP,包括执行 DNS 查询并选择用于服务器或上游对等节点的 IP。
- 处理用于代理非 HTTP 内容的明文 TCP 连接(例如 Steven Wilton 最近为改进透明代理而进行的 Squid-2 补丁)。这应该作为另一个处理明文内容的客户端模块来实现,而不是 HTTP。实现起来应该很简单,但需要排队稍有不同的消息。
🔗 通用的流程是怎样的?
- 待处理服务器请求的队列运行器从队列中提取一个 HTTP 请求
- 它是固定连接吗?将其与现有的固定服务器连接匹配;如果该连接不再有效,则抛出错误
- 是否有可用的持久+空闲连接?选择它
- 否则,启动服务器连接
- 建立连接后,构建并发送 HTTP 请求,并在需要时参与 HTTP 请求正文的发送
- 处理返回的回复 - 如果需要我们本地处理的身份验证,则使用身份验证凭据重新提交请求,否则将状态返回给客户端处理(这可能需要固定此连接,以防 NTLM 身份验证)
- 将数据管道传输回客户端
- 如果到达 EOF,则销毁实例并告知 HTTP 请求/客户端
- 如果不是 EOF,则决定是否应关闭连接,然后要么关闭连接(执行上述操作),要么根据需要将其放入持久或固定池中。
🔗 如何处理错误?
🔗 线程?
线程需要考虑固定/持久连接池的概念。一些想法:
- 成本低:通过多个进程实现并发,并强制每个进程处理少量持久服务器连接(如果确实需要迁移内容,则使用相关的 BSD 技巧在进程之间传递 FD)。
- 实现多个线程来处理客户端和服务器事件;大多数连接(普通、固定)将在给定线程内,因此不需要涉及线程锁定来排队内容。可以按照上述方式管理持久连接以限制线程锁定开销,或者,嗯,我们可以只锁定持久连接集。
分类: WantedFeature
导航:站点搜索,站点页面,类别,🔼 向上