2012-06-13 9 views
5

Estoy usando Rails 3.2.5 y Koala 1.3.0 (no el último, porque el último se niega a ejecutar incluso la aplicación de Facebook de muestra de Heroku). El servidor web es Unicornio.put_connections() al gráfico de Facebook en Koala falla después de un retraso muy largo

Cuando intento para publicar en línea de tiempo mediante 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" 

los puestos de controlador para 12s antes de conseguir una excepción:

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}}): 

Probé con la herramienta de depuración: http://developers.facebook.com/tools/debug y no encontró ningún error para la URL registrada en la línea 2.

Mi servidor web registra un GET desde Facebook IP y devuelve 200 OK . Facebook IP luego hace algunas solicitudes más para recuperar imágenes, que también obtiene 200 OK.

Estoy probando esto en los usuarios de la prueba de mi aplicación, para su información.

ACTUALIZACIÓN

Esto parece ser un problema OpenGraph. Este problema se reproduce para mí: https://developers.facebook.com/bugs/213733412077729

Básicamente, el POST solo tiene éxito después de que lo haya probado en el depurador una vez. Alguien experimentado esto antes?

Respuesta

12

Lo descubrí. Por supuesto, el depurador no tiene sentido. Funcionó porque Facebook tiene mi punto de vista en su caché.

Este es un problema clásico de reentrada (que no puedo creer que tenga que tratar en Rails!) - La API POST de Facebook es sincrónica y solo regresa después de que devuelve la llamada a mi controlador de programa. Pero dado que solo tengo 1 hilo de trabajo, no hay nadie atendiendo la solicitud, por lo tanto el cuelgue.

La solución consiste en invocar la API de forma asincrónica en un hilo.

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

Gracias, esto me dio la pista que necesitaba para arreglar mi problema también. Creo que la causa principal es que hacer llamadas de servicio externo síncronas en tu controlador es 'malo'. La arquitectura 'técnicamente más correcta' es hacer que su acción envíe algún tipo de trabajo en segundo plano (trabajo retrasado, resque, etc.) y no bloquear su controlador. –

1

Tengo un problema similar, pero con una petición GET que gestionan más de 600 llamadas a FB (con tiempo total> 16s).

Declarar explícitamente que los campos parecen funcionar.

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

Para más información ver mi Q/A en stackoverflow HERE

Cuestiones relacionadas