2012-06-13 31 views
5

我使用Rails 3.2.5和考拉1.3.0(不是最新的,因为最新拒绝运行,甚至从Heroku的示例Facebook应用程序)。 Web服务器是Unicorn。put_connections()到考拉的Facebook图失败后很长的延迟

当我尝试发布使用put_connections(),以时间线:

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

我与调试工具测试:

@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得到一个异常之前http://developers.facebook.com/tools/debug 和它发现第2行记录的URL没有错误。

我的web服务器从Facebook IP记录GET并返回200 OK 。 Facebook IP会提出一些更多的请求来获取图像,这也得到了200 OK。

我正在测试此应用程序的测试用户供参考。

UPDATE

这似乎是一个OpenGraph问题。这个问题重现了我:https://developers.facebook.com/bugs/213733412077729

基本上,POST是成功的,只有我在调试器上测试一次后!任何人都经历过这个?

回答

12

想通了。调试器当然没有意义。它的工作原理是因为Facebook对我的缓存有我的看法。

这是一个经典的重入问题(我不敢相信我必须在Rails中处理!) - Facebook的POST API是同步的,并且只在它回调到我的show controller后才会返回。但是因为我只有一个工作线程,所以没有人服务请求,因此挂起。

修正是在线程中异步调用API。

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

谢谢,这给了我,我需要太多解决我的问题的线索。我认为根本原因是在你的控制器中进行同步外部服务调用是'不好的'。 “技术上更加正确”的架构是让你的行为提交某种背景工作(延迟工作,重新署名等),而不是阻止你的控制器。 –

1

我和你有类似的问题,但有一个获取请求管理超过600个调用FB(总时间> 16s)。

显式声明这些字段似乎有效。

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

欲了解更多信息请参阅我的Q/A在计算器HERE