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

edw*_*nbs 5 facebook ruby-on-rails facebook-graph-api koala

我正在使用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"
Run Code Online (Sandbox Code Playgroud)

在获得异常之前,控制器会停顿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}}):
Run Code Online (Sandbox Code Playgroud)

我使用调试工具进行了测试: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才会成功!以前有人经历过吗?

edw*_*nbs 12

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

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

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

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

  • 谢谢,这给了我解决问题所需的线索.我认为根本原因是在控制器中进行同步外部服务调用是"坏事"."技术上更正确"的架构是让您的操作提交某种后台作业(延迟作业,资源转换等),而不是阻止您的控制器. (4认同)