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