2012-02-20 109 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