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

时间:2012-06-13 02:51:22

标签: ruby-on-rails facebook 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"

控制器在获得异常之前会停顿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没有错误。

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

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

更新

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

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

2 个答案:

答案 0 :(得分:12)

想出来。当然调试器的东西没有意义。它之所以有效,是因为Facebook随后对缓存进行了观察。

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

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

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

答案 1 :(得分:1)

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

明确声明字段似乎有效。

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

有关详细信息,请参阅stackoverflow HERE

中的问答