我正在组合一个 REST API,由于我不确定它将如何扩展或对它的需求是什么,我希望能够对其使用进行速率限制,并且能够在以下情况下暂时拒绝请求:该盒子超出容量或者是否存在某种斜线情况。

当/如果我需要通过添加更多容量来扩展服务时,我还希望能够暂时关闭服务(同时向客户提供表明主服务暂时离线的结果)。

对于这种事情有什么最佳实践吗?实现是Rails 和mysql。

有帮助吗?

解决方案

这一切都是通过外部网络服务器完成的,它监听世界(我推荐 nginx 或 lighttpd)。

关于速率限制,nginx是能够限制的,即每个 IP 50 个请求/分钟,全部获得 503 页面,您可以自定义。

关于预期的临时停机,在 Rails 世界中,这是通过特殊的maintainance.html 页面完成的。当 Rails 应用程序服务器出现故障时,有某种自动化功能可以创建文件或符号链接。我建议不要依赖文件存在,而是依赖应用程序服务器的实际可用性。

但实际上,您可以在不丢失任何连接的情况下启动/停止服务。IE。您可以在不同的 UNIX 套接字/IP 端口上运行应用程序服务器的单独实例,并让平衡器(nginx/lighty/haproxy)也使用该新实例。然后,您关闭旧实例,所有客户端仅使用新实例提供服务。没有失去连接。当然,这种情况并不总是可能的,取决于您在新版本中引入的更改类型。

haproxy 是一个仅平衡器的解决方案。它可以非常有效地平衡对场中应用程序服务器的请求。

对于相当大的服务,你最终会得到类似的东西:

  • api.domain 解析为循环 N 平衡器
  • 每个平衡器代理对 M 个 Web 服务器的静态请求和对 P 个应用程序服务器的动态内容请求。哦,那么你的 REST API 没有静态文件,是吗?

对于相当小的服务(低于 2K rps),所有平衡都是在一两个网络服务器内完成的。

其他提示

已经有了很好的答案 - 如果您不想自己实现限制器,还有像 3scale 这样的解决方案(http://www.3scale.net) 进行速率限制、分析等。对于 API。它使用插件工作(请参阅此处 红宝石 API 插件)它与 3scale 架构挂钩。您还可以通过 varnish 使用它,并让 varnish 充当速率限制代理。

我建议您在应用程序之外实施速率限制,否则高流量仍然会杀死您的应用。一个好的解决方案是将其作为apache代理的一部分实现,例如 mod_evasive

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top