【发布时间】:2012-03-11 07:05:51
【问题描述】:
我有一个使用自定义域托管在 Heroku 上的 rails 应用程序。该应用程序在每个页面的顶部显示单个用户的最新推文。为了避免达到 Twitter 速率限制(150 个请求/小时),我让应用程序将搜索结果缓存在 memcache (Dalli) 中,有效期为 5 分钟。这很好用,确保应用程序每小时只发出 12 个请求。如果它被大量交易,这个解决方案可能会有问题,但我认为它很好。
尽管我远低于速率限制,但我的网站会定期出现故障并查看我的服务器日志,这是因为我超出了 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'
【问题讨论】:
-
使用自定义域或 something.heroku.com?也许限制基于 *.heroku.com?
-
请张贴您日志的相关部分。目前这里没有什么可以让我们离开的。我怀疑它是 Heroku(尽管我认为它是可能的),但我们需要更多信息来说明它可能是什么。另外,你检查过你的 Twitter 开发设置以确保它没有处于某种演示模式吗?您是否也绝对确定您每小时只访问 Twitter 12 次(也许每 5 分钟实际上有多个请求,而您没有意识到这一点)?
-
@normalocity 当然。添加了部分日志。我在 Tweet 之前将我的速率限制写到屏幕上(获取您的速率限制状态不计入您的 API 请求),我可以看到它的下降速度没有比预期快。
-
@typeoneerror 使用自定义域
标签: ruby-on-rails ruby-on-rails-3 twitter heroku memcached