2012-06-13 19 views
5

Tôi đang sử dụng Rails 3.2.5 và Koala 1.3.0 (không phải mới nhất, vì mới nhất từ ​​chối chạy ngay cả ứng dụng Facebook mẫu từ Heroku). Máy chủ web là Unicorn.put_connections() vào biểu đồ Facebook ở Koala không thành công sau một thời gian trễ rất dài

Khi tôi cố gắng POST để Timeline sử dụng 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" 

Các quầy hàng điều khiển cho 12s trước khi nhận được một ngoại lệ:

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

Tôi đã thử nghiệm với công cụ gỡ lỗi: http://developers.facebook.com/tools/debug và không tìm thấy lỗi nào cho URL đăng nhập vào dòng 2.

Máy chủ web của tôi ghi nhật ký GET từ Facebook IP và trả về 200 OK . Facebook IP sau đó làm cho một số yêu cầu nhiều hơn để lấy hình ảnh, mà cũng được 200 OK.

Tôi đang thử nghiệm điều này trên người dùng thử nghiệm của ứng dụng của tôi FYI.

CẬP NHẬT

Điều này dường như là một vấn đề OpenGraph. Sự cố này tái tạo cho tôi: https://developers.facebook.com/bugs/213733412077729

Về cơ bản POST chỉ thành công sau khi tôi kiểm tra nó trên trình gỡ rối một lần! Bất cứ ai có kinh nghiệm này trước?

Trả lời

12

Đã tìm ra. Tất nhiên điều debugger không có ý nghĩa. Nó làm việc vì Facebook sau đó đã xem của tôi trên bộ nhớ cache của họ.

Đây là một vấn đề reentrancy cổ điển (mà tôi không thể tin rằng tôi phải đối phó trong Rails!) - POST API của Facebook là đồng bộ và nó chỉ trả về sau khi nó gọi lại cho bộ điều khiển hiển thị của tôi. Nhưng kể từ khi tôi chỉ có 1 sợi công nhân, không có ai phục vụ yêu cầu, do đó treo.

Khắc phục là gọi API không đồng bộ trong một chuỗi.

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

Thanks, điều này đã cho tôi đầu mối Tôi cần thiết để khắc phục vấn đề của tôi quá. Tôi nghĩ nguyên nhân gốc là việc thực hiện các cuộc gọi dịch vụ bên ngoài đồng bộ trong bộ điều khiển của bạn là 'xấu'. Kiến trúc 'kỹ thuật chính xác hơn' là có hành động của bạn gửi một số loại công việc nền (công việc trì hoãn, định lại, vv) và không chặn bộ điều khiển của bạn. –

1

Tôi gặp vấn đề tương tự như bạn, nhưng với yêu cầu nhận được quản lý hơn 600 cuộc gọi tới FB (với tổng thời gian> 16 giây).

Khai báo rõ ràng các trường dường như hoạt động.

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

Để biết thêm thông thấy Q của tôi/A trong stackoverflow HERE

Các vấn đề liên quan