2012-06-13 15 views
5

Sto usando Rails 3.2.5 e Koala 1.3.0 (non l'ultimo, perché l'ultimo si rifiuta di eseguire anche l'app di Facebook di esempio da Heroku). Il server Web è Unicorno.put_connections() al grafico di Facebook in Koala fallisce dopo un lungo ritardo

Quando provo nella quale inserire l'Timeline usando 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" 

le bancarelle del controller per 12s prima di ottenere un'eccezione:

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

ho provato con lo strumento di debug: http://developers.facebook.com/tools/debug e non ha riscontrato errori per l'URL registrato nella riga 2.

Il mio server Web registra un GET dall'IP di Facebook e restituisce 200 OK . L'IP di Facebook fa ancora qualche richiesta per recuperare le immagini, che riceve anche 200 OK.

Lo sto testando sugli utenti di test della mia app FYI.

UPDATE

questo sembra essere un problema OpenGraph. Questo problema si riproduce per me: https://developers.facebook.com/bugs/213733412077729

Fondamentalmente il POST ha successo solo dopo averlo verificato sul debugger una volta! Qualcuno ha provato questo prima?

risposta

12

Capito. Ovviamente la cosa del debugger non ha senso. Ha funzionato perché Facebook ha il mio punto di vista sul loro cache.

Questo è un classico problema di rientro (che non riesco a credere di avere a che fare con Rails! Ma dal momento che ho solo 1 thread di lavoro, non c'è nessuno che gestisce la richiesta, quindi il blocco.

La correzione consiste nel richiamare l'API in modo asincrono in un thread.

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

Grazie, questo mi ha dato l'indizio di cui avevo bisogno per risolvere il mio problema troppo. Penso che la causa principale sia che le chiamate di servizio esterne sincrone nel controller sono "cattive". L'architettura "tecnicamente più corretta" prevede che l'azione invii una sorta di lavoro in background (lavoro ritardato, resque, ecc.) E non blocchi il controller. –

1

Ho un problema simile, come voi, ma con una richiesta GET che gestisce più di 600 chiamate al FB (con tempo totale> 16 anni).

Dichiarare esplicitamente che i campi sembrano funzionare.

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

Per maggiori informazioni visita il mio Q/A in StackOverflow HERE

Problemi correlati