2011-11-11 26 views
5

Tôi đang làm việc với XMPP và tôi có một cuộc gọi lại tin nhắn được kích hoạt trong trường hợp mọi tin nhắn được gửi đi. Mục tiêu của tôi là gửi dữ liệu đến bằng tin nhắn đến một API trong cuộc gọi lại và dựa trên phản hồi gửi một cái gì đó trở lại bằng cách sử dụng máy khách XMPP.Các phương thức không đồng bộ gọi với Ruby giống như với Ajax

  1. Loại người dùng nhắn (Browser Trò chuyện Client)
  2. tin nhắn đến máy chủ thông qua XMPP
  3. tin nhắn được gửi đến API
  4. đáp ứng được nhận
  5. đáp ứng được gửi lại cho khách hàng trò chuyện .

Mã của tôi cho điều này là như sau

admin_muc_client.activate_message_callbacks do |m|    
    sender = m.from.resource 
    room_slug = m.from.node 
    message = m.body     

    r = HTTParty.get('http://example.com/api/v1/query?msg=message') 
    Rails.logger.debug(r.inspect) 
    admin_muc_client.send_message("Message #{r.body}") if m.from.resource != 'admin' 
end 

mối quan tâm của tôi ở đây là kể từ khi gọi lại là evented và yêu cầu đến API sẽ là một cuộc gọi chặn điều này có thể trở thành một nút cổ chai cho toàn bộ ứng dụng . Tôi muốn sử dụng một cái gì đó như AJAX cho Javascript sẽ kích hoạt yêu cầu và khi phản hồi có sẵn gửi dữ liệu. Làm thế nào tôi có thể thực hiện điều đó trong Ruby?

Tôi đã xem slow_job và backgroundrb trông giống như các công cụ cho hoạt động cháy và quên. Tôi sẽ cần một cái gì đó mà kích hoạt một cuộc gọi lại một cách không đồng bộ với phản ứng.

Tôi thực sự sẽ đánh giá cao một số trợ giúp về cách đạt được hành vi không đồng bộ mà tôi muốn. Tôi cũng quen thuộc với hàng đợi tin nhắn như RabbitMQ mà tôi cảm thấy sẽ bổ sung sự phức tạp đáng kể.

Trả lời

5

Bạn có xem girl_friday không? Từ wiki của nó -

girl_friday là thư viện Ruby để thực hiện các tác vụ không đồng bộ. Thông thường, bạn không muốn chặn phản hồi web bằng cách thực hiện một số tác vụ, như gửi email, vì vậy bạn chỉ có thể sử dụng đá quý này để thực hiện nó trong nền. Nó hoạt động với bất kỳ ứng dụng Ruby nào, bao gồm cả các ứng dụng Rails 3.

Tại sao không sử dụng bất kỳ trong số hàng chục giải pháp không đồng bộ khác (Resque, dj, v.v ...)? Bởi vì girl_friday dễ dàng hơn và hiệu quả hơn các giải pháp đó: girl_friday chạy trong tiến trình Rails của bạn và sử dụng mẫu tác nhân để đồng thời an toàn. Bởi vì nó chạy trong cùng một quá trình, bạn không phải theo dõi một bộ quy trình riêng biệt, triển khai một codebase riêng biệt, lãng phí hàng trăm MB trong RAM cho các quy trình đó, v.v. Xem phần giới thiệu của tôi cho các diễn viên trong Ruby để biết thêm chi tiết.

Bạn cần phải viết mã an toàn chỉ. Đây không phải là khó làm: mô hình diễn viên có nghĩa là bạn nhận được một tin nhắn và xử lý tin nhắn đó. Không có dữ liệu được chia sẻ yêu cầu khóa và có thể dẫn đến bế tắc trong mã ứng dụng của bạn. Bởi vì girl_friday sử dụng các Threads trong phần cover, bạn cần đảm bảo rằng môi trường Ruby của bạn có thể thực hiện các Threads một cách hiệu quả. JRuby, Rubinius 1.2 và Ruby 1.9.2 là đủ cho hầu hết các ứng dụng. Tôi không hỗ trợ Ruby 1.8 vì hỗ trợ luồng kém của nó.

Tôi nghĩ rằng đây là những gì bạn đang tìm kiếm.

+0

Tuyệt vời sẽ cho ảnh này. Có lẽ đây là nó. – Sid

+0

Những gì tôi thấy là công trình này trong giao diện điều khiển nhưng không thêm nhiệm vụ vào hàng đợi khi chạy trong ứng dụng trong chế độ phát triển. BTW Tôi đang chạy hành khách và apache trong chế độ dev. – Sid

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