我正在组建一个REST API,因为我不确定它将如何扩展或对它的需求是什么,我希望能够对它的限制使用率以及能够暂时当容器超出容量或存在某种斜线情况时拒绝请求。
我还希望能够优雅地暂时关闭服务(同时为客户提供表明主服务稍微离线的结果)/当我需要通过添加更多容量来扩展服务时。
这种事情有什么最佳做法吗?使用mysql实现Rails。
答案 0 :(得分:18)
这一切都是通过外部网络服务器来完成的,它可以监听世界(我推荐使用nginx或lighttpd)。
关于速率限制,nginx能够限制,即每个IP 50个req /分钟,全部获得503页面,您可以自定义。
关于预期的临时停机,在rails world中,这是通过特殊的maintenanceance.html页面完成的。当rails app服务器出现故障时,会创建某种自动化文件或符号链接。我建议不依赖于文件存在,而是依赖于应用服务器的实际可用性。
但实际上,您可以在不丢失任何连接的情况下启动/停止服务。即您可以在不同的UNIX套接字/ IP端口上运行单独的应用服务器实例,并使平衡器(nginx / lighty / haproxy)也使用该新实例。然后关闭旧实例,所有客户端只提供新实例。没有连接丢失。当然,这种情况并非总是可行,取决于您在新版本中引入的更改类型。
haproxy是一种仅限平衡器的解决方案。它可以非常有效地平衡对服务器场中应用服务器的请求。
对于非常大的服务,你最终得到的结果如下:
对于非常小的服务(低于2K rps),所有平衡都在一两个网络服务器内完成。
答案 1 :(得分:5)
已经有了很好的答案 - 如果您不想自己实施限制器,还有像3scale(http://www.3scale.net)这样的解决方案,可以对API进行速率限制,分析等。它使用一个插件(参见此处的ruby api plugin),它与3scale架构挂钩。您也可以通过清漆使用它,并使用清漆充当速率限制代理。
答案 2 :(得分:2)
我建议您在应用程序之外实施速率限制,否则高流量仍然会杀死您的应用。一个好的解决方案是将其作为apache代理的一部分实现,类似mod_evasive