异步方法使用Ruby调用Ajax

Sid*_*Sid 5 ruby io asynchronous xmpp blocking

我正在使用XMPP,我有一个消息回调,它会在发送每条消息时被激活.我的目标是将消息到达的数据发送到回调中的API,并根据响应使用XMPP客户端发回一些内容.

  1. 用户类型消息(浏览器聊天客户端)
  2. 消息通过XMPP到达服务器
  3. 消息将发送到API
  4. 收到回复
  5. 响应被发送回聊天客户端.

我的代码如下

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
Run Code Online (Sandbox Code Playgroud)

我担心的是,由于回调是偶然的,并且对API的请求将是阻塞调用,这可能成为整个应用程序的瓶颈.我更喜欢使用像AJAX这样的Javascript来激活请求,当响应可用时发送数据.我怎么能在Ruby中实现它?

我查看了delayed_job和backgroundrb,它们看起来像火灾和忘记操作的工具.我需要一些能够以异步方式使用响应激活回调的东西.

我真的很感激如何实现我想要的异步行为的一些帮助.我也熟悉像RabbitMQ这样的消息队列,我觉得这会增加很多复杂性.

Chi*_*tan 5

你看看girl_friday吗?从它的维基 -

girl_friday是一个用于执行异步任务的Ruby库.通常,您不希望通过执行某项任务来阻止Web响应,例如发送电子邮件,因此您可以使用此gem在后台执行它.它适用于任何Ruby应用程序,包括Rails 3应用程序.

为什么不使用其他数以万计的其他异步解决方案(Resque,dj等)?因为girl_friday比那些解决方案更容易,更有效:girl_friday在你的Rails进程中运行,并使用actor模式实现安全并发​​.因为它在同一个进程中运行,所以您不必监视一组单独的进程,部署单独的代码库,在RAM中为这些进程浪费数百个额外的MB等.有关更多详细信息,请参阅我在Ruby中的Actors简介.

您确实需要编写线程安全的代码.这并不难:actor模式意味着您收到消息并处理该消息.没有需要锁定的共享数据,可能导致应用程序代码死锁.因为girl_friday确实使用了Threads,所以你需要确保你的Ruby环境可以有效地执行Threads.对于大多数应用程序,JRuby,Rubinius 1.2和Ruby 1.9.2应该足够了.我不支持Ruby 1.8,因为它的线程支持很差.

我想这就是你要找的东西.