put_connections () для графа Facebook в Коале не удается после очень большой задержки

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

Когда я пытаюсь 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"

Контроллер останавливается на 12 секунд, прежде чем получить исключение:

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.

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

UPDATE

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

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

Ответы на вопрос(2)

как и у вас, но с запросом на получение, который управляет более чем 600 вызовами в FB (с общим временем & gt; 16 с).

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

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

Для получения дополнительной информации см. Мой Q / A в stackoverflowВОТ

Решение Вопроса

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

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

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

Thread.new {
    @fbgraph.put_connections("me", "myapp:view", :room => url_for(@room))
}
 10 июл. 2012 г., 02:46
Спасибо, это дало мне ключ к разгадке моей проблемы. Я думаю, что основная причина заключается в том, что синхронные вызовы внешних служб на вашем контроллере «плохие». «Технически более корректный»; архитектура заключается в том, чтобы ваше действие отправляло какое-то фоновое задание (отложенное задание, перезапуск и т. д.), а не блокировало ваш контроллер.

Ваш ответ на вопрос