2012-02-20 65 views
1

我有一个使用自定义域名托管在Heroku上的Rails应用程序。该应用程序显示每个页面顶部的单个用户的最新推文。为了避免碰到Twitter速率限制(150个请求p/h),我让应用程序将搜索结果缓存在memcache(Dalli)中,并且过期5分钟。这很好地工作,确保应用程序每小时只有12个请求。如果它被高度贩卖,这个解决方案可能会有问题,但因为它是我认为它很好。在Heroku上托管的网站的Twitter费率限制

尽管事实上我远低于速率限制,但我的网站定期停机并查看我的服务器日志,这是因为我已经超过了Twitter的速率限制。

这与Heroku有关吗?还有什么可能导致它?这与共享IP地址有关吗?

日志:

2012-02-20T22:09:52+00:00 app[web.1]: Rendered pages/home.html.erb within layouts/application (0.8ms) 
2012-02-20T22:09:52+00:00 app[web.1]: Rendered layouts/_header.html.erb (336.2ms) 
2012-02-20T22:09:52+00:00 app[web.1]: Completed 500 Internal Server Error in 339ms 
2012-02-20T22:09:52+00:00 app[web.1]: ActionView::Template::Error (Rate limit exceeded. Clients may not make more than 150 requests per hour.): 
2012-02-20T22:09:52+00:00 app[web.1]:  5:    <p class="latest-tweet"> 
2012-02-20T22:09:52+00:00 app[web.1]: 
2012-02-20T22:09:52+00:00 app[web.1]:  7:     <% if !latest_tweet%> 
2012-02-20T22:09:52+00:00 app[web.1]:  8:      <% latest_tweet = Twitter.user_timeline("sometwitterusername").first.text %> 
2012-02-20T22:09:52+00:00 app[web.1]:  6:     <% latest_tweet = Rails.cache.read "latest_tweet" %> 
2012-02-20T22:09:52+00:00 app[web.1]:  9:      <% Rails.cache.write("latest_tweet", latest_tweet, :expires_in => 5.minutes) %> 
2012-02-20T22:09:52+00:00 app[web.1]:  10:     <% end %> 
2012-02-20T22:09:52+00:00 app[web.1]:  11:     <%= latest_tweet %> 
2012-02-20T22:09:52+00:00 app[web.1]: app/views/layouts/_header.html.erb:8:in `_app_views_layouts__header_html_erb___4472938277532005844_37037700' 
2012-02-20T22:09:52+00:00 app[web.1]: app/views/layouts/application.html.erb:14:in `_app_views_layouts_application_html_erb__4101970984987800094_41561940' 
+0

使用自定义域或something.heroku.com?也许限制是基于* .heroku.com? – typeoneerror 2012-02-20 22:56:38

+0

请发布您的日志的相关部分。目前我们没有什么可以离开的。我怀疑这是Heroku(尽管我认为这是可能的),但我们需要更多的信息来说明它可能是什么。另外,您是否检查过您的Twitter开发设置以确保它不处于某种演示模式?你是否也绝对相信,你每小时只能击中Twitter 12次(也许每5分钟实际上有多个请求,你没有意识到)? – jefflunt 2012-02-20 22:58:09

+0

@normalocity当然。增加了日志的一部分。我在Tweet之前将我的费率限制写入屏幕(让您的费率限制状态不计入您的API请求),并且我可以看到它没有比预期的更快地下降。 – Undistraction 2012-02-20 23:01:43

回答

6

很简单。如果您与多个其他开发者共享知识产权,您也会分享费率限制。

我建议使用身份验证将其提高到每小时350个请求,并删除基于IP的限制。无论您与IP分享的开发人员如何,这只会给您 350个请求。

https://dev.twitter.com/docs/rate-limiting

+0

谢谢。如果是这种情况,那么即使增加限制也不是万无一失的。所有这一切都需要3个其他应用程序接近相同IP的限制。这对我来说似乎很疯狂。因此,任何托管在Heroku上的网站都会面临Twitter API的风险? – Undistraction 2012-02-20 23:12:20

+0

我不确定你是否与所有的Heroku共享IP,只是在该框上的其他dynos – 2012-02-20 23:12:35

+0

Fwiw,如果你认证你只是摆脱基于IP的限制。 – 2012-02-20 23:30:05

1

有你看着使用Apigee附加?

https://addons.heroku.com/apigee

这给你增加速率限制,加上其他一些花俏。

+0

谢谢。不,我没有见过。看起来Oauth与Apigee结合应该可以做到。 – Undistraction 2012-02-21 00:01:07

+0

@ Neil“没有找到匹配'apigee'的匹配结果”这是在heroku上显示的apegee插件的消息 – RAJ 2013-04-28 08:58:45

+0

Apigee不再作为插件提供 – 2013-04-29 12:42:33