【问题标题】:Twitter Rate Limits for Site hosted on HerokuHeroku 上托管的网站的 Twitter 速率限制
【发布时间】: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


【解决方案1】:

很简单。如果您与多个其他开发者共享一个 IP,您也将共享速率限制。

我建议使用身份验证将其提高到每小时 350 个请求,从而消除基于 IP 的限制。这只会给 350 个请求,无论你与哪个开发者共享 IP。

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

【讨论】:

  • 谢谢。如果是这样,那么即使提高限制也不是万无一失的。只需要 3 个其他应用程序接近同一 IP 的限制。这对我来说似乎很疯狂。那么任何托管在 Heroku 上的网站访问 Twitter API 都会有这种风险?
  • 我不确定你是否与所有 Heroku 共享 IP,只是那个盒子上的其他测功机
  • Fwiw,如果您进行身份验证,您只需摆脱基于 IP 的限制。
  • 当您对 API 进行身份验证时,基于 IP 的限制不适用。如果您在请求中发送 OAuth 令牌,则其他应用程序是否从您的源 IP 发出请求并不重要,因为它只会将使用您的凭据发出的请求计入您的限制(假设其他应用程序没有发出不适当数量的请求)导致 IP 被列入黑名单。)
  • @Dan 谢谢。是的,现在一切都说得通了。
【解决方案2】:

您是否考虑过使用 Apigee 插件?

https://addons.heroku.com/apigee

这为您提供了更高的速率限制,以及其他一些花里胡哨。

【讨论】:

  • 谢谢。不,我没有看到。看起来 Oauth 与 Apigee 结合起来应该可以解决问题。
  • @Neil "No match found for 'apigee'" 这是 Heroku 上显示的 apegee 插件的消息
  • Apigee 不再作为插件提供
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
  • 1970-01-01
  • 2012-12-26
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
相关资源
最近更新 更多