2009-03-05 96 views
30

我正在放置一个REST API,因为我不确定它将如何扩展或对它的需求会是什么,我希望能够评估它的使用限制以及能够暂时拒绝当盒子超出容量或者有某种斜杠场景时请求。速率限制REST API用户的最佳做法是什么?

当/需要通过增加更多容量来扩展服务时,我还希望能够暂时关闭服务(同时向客户端提供指示主服务已脱机的结果)。

有没有这种事情的最佳实践?实现是与MySQL的Rails。

回答

17

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

关于速率限制,nginx能够限制,即每个IP 50 req/minute,全部获得503页面,您可以自定义。

关于预期的临时下降,在rails世界中,这是通过特殊的维护页面完成的。当rails应用程序服务器关闭时,会有某种自动化创建或符号链接该文件。我建议不要依赖文件存在,而要依赖应用程序服务器的实际可用性。

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

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

对于比较大的服务,你最终的东西了,如:

  • api.domain解析为round-robinň平衡器
  • 每个平衡器请求代理到M Web服务器为动态静态和P应用服务器内容。哦,你的REST API没有静态文件,是吗?

对于非常小的服务(在2K rps以下),所有的平衡都是在一两个web服务器内完成的。

2

我建议在您的应用程序之外实施速率限制,否则高流量仍然会导致您的应用程序被终止。一个好的解决方案是将它作为你的apache代理的一部分来实现,像mod_evasive

+1

Apache不是高负荷土地吗? frankodwyer肯定需要异步网络来处理大量的并发连接,而​​mpm_event目前还不稳定。当然,Apache可以放在单独的盒子上......有没有指向购买它们只是为了坚持使用Apache? – temoto 2009-03-05 14:49:42

5

已经有很好的答案 - 如果你不想自己实现限制器,还有像3scale(http://www.3scale.net)这样的解决方案,它可以对API进行速率限制,分析等。它使用一个插件(请参阅这里的ruby api plugin),它可以挂接到3级架构。您也可以通过清漆使用它,并将清漆作为限速代理。

相关问题