我有一个 IIS7 机器的网络农场。运行良好。我们即将发布一个 API。它非常简单,但我们知道从第一天起它就会受到很大冲击(我们至少有一个注册客户)。
因此,我们正在考虑在我们的 Web 服务器和互联网之间添加一个缓存层。首先,我不知道这是否是一个好的解决方案,所以我愿意听取大家的意见。其次,我们在服务器场前面放什么?专用的 Windows 还是 Linux 机器?我们的 Web 负载均衡器是 F5 BIG IP。
我愿意接受建议:)
大家有什么想法吗?
答案1
答案2
我来晚了;但我可以做出一些贡献……
Cal Henderson 在他的书籍《构建可扩展网站》. 您应该通读有关 Web 服务 API 的章节。
正如 easel 正确指出的那样,反向代理缓存通常不会给 API 带来太多好处。
有两件事对你有好处:
- 分布式键值缓存,用于存储您正在处理的的数据。例如,您可以缓存您的热的数据以您平台的本机对象格式,或简单的序列化数组,或任何其他对您的平台来说速度快的格式。这会限制对您的数据库的命中次数,而您将在其中遇到最严重的扩展问题。您的 API 服务器仍将需要获取任何非缓存数据集,并序列化响应 - 但至少序列化部分仅受 CPU 限制,并且可以轻松扩展。
- 某种速率限制系统,即限制或拒绝发出过多请求的客户端的能力。API 调用通常会在您的服务器上涉及相当繁重的处理(因为它们会读取或操作原始数据),因此保护自己免受编写不当的客户端的侵害是有意义的。
除上述内容外,Cal Henderson 建议用流行语言创建开源客户端库,并将最佳实践融入其中(即客户端缓存、速率限制)。这样,第三方开发人员将拥有一个简单、兼容的代码平台,可以重复使用和构建。在我看来,这个想法很棒,但也有点昂贵。
答案3
A缓存层有助于处理静态内容,但我看不出它对动态 API 有多大帮助。不过,这仍然有帮助。
例如,您可以使用 CDN 来帮助缓存和分发静态内容,以减少服务器的工作量,以便它可以花更多时间处理动态内容。
对于你的动态内容,你可能想要使用类似它提到的内容这里如果您使用 CDN 来处理动态内容。
答案4
像 Akamai 这样的 CDN 甚至对动态内容(如 API 和 SSL)也很有帮助。它们通过在其边缘节点和您的服务器之间保持开放的 TCP 会话来实现这一点。这减少了服务器上开放的连接数,并在建立新的 TCP 会话时节省了大量的时间和数据包。
HAProxy 之类的负载均衡器也可以通过简化和优化 TCP 会话来提供帮助。它甚至可以在“World”端运行 1500 MTU 数据包,在后端运行巨型帧,以减少真实服务器上的处理时间。它有许多技巧可以将连接处理从真实服务器转移到 LB。将 API 服务器上的线程和 TCP 套接字仅用于某些慢速 TCP 客户端是一种资源浪费。