2012-06-13 1 views
5

Я использую Rails 3.2.5 и Koala 1.3.0 (не последнее, потому что последний отказывается запускать даже пример приложения Facebook от Heroku). Веб-сервер - Единорог.put_connections() на графике Facebook в Koala терпит неудачу после очень большой задержки

Когда я пытаюсь POST на временной шкале с помощью put_connections():

@fbgraph = Koala::Facebook::API.new(session[:access_token]) 
logger.debug "put_connections(#{url_for @room}), start" 
@fbgraph.put_connections("me", "myapp:view", :room => url_for(@room)) 
logger.debug "put_connections(), end" 

Контроллер стойла для 12s перед тем, как исключение:

Completed 500 Internal Server Error in 12075ms 

Koala::Facebook::APIError (HTTP 500: Response body: {"error":{"type":"Exception","message":"Could not retrieve data from URL.","code":1660002}}): 

я тестировал с инструментом отладки: http://developers.facebook.com/tools/debug и он не обнаружил ошибки для URL-адреса, зарегистрированного в строке 2.

Мой веб-сервер регистрирует GET с IP-адреса Facebook и возвращает 200 OK , Facebook IP затем делает еще несколько запросов на получение изображений, которые также получают 200 OK.

Я тестирую это на тестовых пользователях моего приложения FYI.

UPDATE

Это, как представляется, проблема OpenGraph. Эта проблема воспроизводится для меня: https://developers.facebook.com/bugs/213733412077729

В принципе POST успешна только после того, как я проверил его на отладчике один раз! Кто-нибудь испытал это раньше?

ответ

12

Выяснил это. Конечно, отладочная вещь не имеет смысла. Это сработало, потому что у Facebook тогда есть мой взгляд на их кеш.

Это классическая проблема с повторным подключением (с которой я не могу поверить, что мне приходится иметь дело с Rails!). API POST для Facebook является синхронным и возвращается только после того, как он обращается к моему диспетчеру show. Но так как у меня только одна рабочая нить, никто не обслуживает запрос, таким образом зависает.

Исправление состоит в том, чтобы асинхронно вызывать API в потоке.

Thread.new { 
    @fbgraph.put_connections("me", "myapp:view", :room => url_for(@room)) 
} 
+4

Спасибо, это дало мне ключ мне нужно, чтобы исправить мою проблему тоже. Я считаю, что основной причиной является то, что выполнение синхронных внешних вызовов службы в вашем контроллере является «плохим». «Технически более правильная» архитектура заключается в том, чтобы ваше действие отправляло какое-то фоновое задание (замедленное задание, resque и т. Д.), А не блокировать ваш контроллер. –

1

У меня аналогичная проблема, как вы, но с запросом получить, что управлять более чем 600 вызовов FB (с общим временем> 16s).

Явное объявление полей кажется, что работает.

graph = @FBGraph.get_object("#{user.fb_user_id}?fields=id,name,username,picture,link") 

Для получения дополнительной информации см моего Q/A в StackOverflow HERE