2012-12-11 21 views
3

我已經看到一些有趣的行爲與Instagram寶石和實時API,我想創建一個基本的應用程序來創建訂閱和處理Instagrams的迴應。以下是創建訂閱並將標記名保存到我的數據庫的代碼。Ruby On Rails:Instagram的寶石,無法達到回調url

def create 
    @subscription = Subscription.new params[:subscription] 
    options = {:object_id => params[:subscription][:tag_name]} 

    if @subscription.save 
     Instagram.create_subscription('tag', "http://myapp.herokuapp.com/subscriptions/process_subscription/", aspect = 'media', options) 
     redirect_to "/subscriptions/tag/#{@subscription.tag_name}" 
    end 

通知回調網址是Heroku的是可到達的,有趣的是,當我去subscriptions/new在Heroku的域Instagram的API給了我一個「錯誤的請求,無法達到回調URL」。當我使用相同的回調url創建curl上的訂閱時,一切都按預期工作,當我在本地主機上使用subscriptions/new(具有相同的回調URL集)時,它也可以按預期工作。下面是process_subscription行動:

def process_subscription 
    if params["hub.challenge"] 
    render :text => params["hub.challenge"] 
    else  
    PrivatePub.publish_to("/subscriptions/tag/#{params[:object_id]}", payload: params[:_json]) 
    end 
end 

第一個if語句會照顧pubsubhubub挑戰。一旦實際創建訂閱,我就不會遇到接收和處理有效負載的問題。所以現在唯一我能想到的是,當我在heroku域名時,服務器進程在某種程度上忙於Instagram發佈回來時,我不明白這是如何可能的,所以任何建議將不勝感激。

這是服務器日誌訂閱成功和失敗時的鏈接。請注意,我在這些日誌中註銷了後參數。 https://gist.github.com/4256108

回答

5

經過多次反覆試驗,問題越來越突出,當Instagram將其hub.challenge發送迴應用程序導致「錯誤請求,無法到達回調URL」錯誤時,rails進程變得越來越繁忙。

對我而言,使用另一個線程來創建Instagram訂閱,這樣Instagram可以幾乎瞬間成功打我的應用程序,並達到我的回調網址。這個解決方案是最快和最輕量級的,或許在Heroku上購買一個或幾個工人並通過Sidekiq或其他方式將其轉化爲後臺進程會是有益的,但這對於應對中心挑戰似乎有點矯枉過正。

def instagram_photos 
    Thread.new do |t| 
     options = {:object_id => params[:tag_name]} 
     Instagram.create_subscription('tag', "http://myapp.herokuapp.com/subscriptions/process_subscription", aspect = 'media', options) 
     t.exit 
    end 
    redirect_to root_path 
    end 
+0

除了這個Thread方法,更好的解決方案是使用像Unicorn這樣的服務器來處理默認的併發進程。 – jonlunsford