我不太确定我想要建立的架构是否有一个术语,但我会尝试解释。
我有一个 API 和使用会话 ID 调用它的客户端。会话 ID 与存储在 Memcache 中的 PHP 会话中的本地会话信息相关联(如果已过期,则从 MySQL 数据库中提取)。根据会话信息,用户可能会或可能不会访问该 API(因此,访问该 API 不仅需要有效的登录名,还需要与该特定客户端相关联的许可证)。
我希望缓存请求,以便两个具有相同参数(但来自不同客户端/具有不同会话ID)的请求被缓存为一个请求,但保持会话信息检查。
在前一种情况下(Varnish 具有单独的身份验证检查):
________ _____________ _________ ________
| | Request w. | SSL | | | | Apache |
| Client |--------------| termination |-----| Varnish |------| + PHP |
| | SID | | | | | API |
‾‾‾‾‾‾‾‾ ‾‾‾‾‾‾‾‾‾‾‾‾‾ ‾‾‾‾|‾‾‾‾ ‾‾‾‾‾‾‾‾
| SID
____|_____
| Validate |
| SID |
| |
‾‾‾‾‾‾‾‾‾‾
换句话说:
- 客户端发送带有 SID 的请求。
- SSL 因 Varnish 而终止。
- Varnish 将 SID 从请求中分离出来,并将其转发到一个后端的验证。
- 如果有效,Varnish 会分离参数并将其转发到 API 后端(如果无效,Varnish 会返回验证后端的错误响应)。
- Varnish 返回(并缓存)不带 SID 的 API 响应。
或者后一种情况(身份验证检查后的 Varnish):
________ __________ _________ ________
| | Request w. | Validate | Request without | | | Apache |
| Client |--------------| SID |-------------------| Varnish |------| + PHP |
| | SID | | SID | | | API |
‾‾‾‾‾‾‾‾ ‾‾‾‾‾‾‾‾‾‾ ‾‾‾‾‾‾‾‾‾ ‾‾‾‾‾‾‾‾
换句话说:
- 客户端发送带有 SID 的请求。
- 一个单独的进程(我目前正在考虑 Node.js)验证 SID。
- 如果有效,请求参数将被分离并转发到 Varnish 和 API 后端(如果无效,则返回错误响应)。
- 返回 Varnish 的响应。
我可以毫无问题地实施后一种解决方案,但我有点担心使用 Node.js 作为反向代理(某些请求针对的是 200-500 MB 的文件),并且我也想避免实施 Node.js 会话验证,我已经在 Apache/PHP 中实现了该验证(由于 API 接收的并发请求量,在后一种解决方案中使用该验证不是一个选择)。
我确信前一种选择也被认为是“更好”的选择,但我发现的所有帖子似乎都声称响应是根据每个用户缓存的,这不是我想要的。
如果您能提供任何关于采取哪种解决方案以及如何实施前者的意见,我们将不胜感激。