在很长一段时间的延迟之后,考拉的put_connections()到Facebook图表失败了

我正在使用Rails 3.2.5和Koala 1.3.0(不是最新的,因为最新的拒绝运行来自Heroku的样本Facebook应用程序)。 Web服务器是Unicorn。

当我尝试使用put_connections()POST到时间轴时:

@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" 

在获得exception之前,控制器会停顿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 ,它发现第2行中记录的URL没有错误。

我的Web服务器从Facebook IP记录GET并返回200 OK。 Facebook IP随后会提出更多请求以获取图像,这也是200 OK。

我正在我的应用程序的测试用户FYI上测试这个。

UPDATE

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

基本上只有在我在调试器上测试一次POST后才能成功! 以前有人经历过吗?

弄清楚了。 当然调试器的东西没有意义。 它起作用,因为Facebook然后我的观点在他们的缓存。

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

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

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

我遇到了类似的问题,但是有一个get请求可以管理超过600次调用FB(总时间> 16s)。

明确声明字段似乎有效。

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

有关更多信息,请参阅我在此处的 stackoverflow中的Q / A.