2011-11-11 64 views
5

我正在使用XMPP,并且我有一个消息回调函数,它在发送每个消息的事件时都会被激活。我的目标是在回调中将消息到达的数据发送到API,并根据响应使用XMPP客户端发送回来。像Ajax一样用Ruby调用异步方法

  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 

这里我担心的是,由于回调是事件触发和请求API将是一个阻塞调用,这可能成为整个应用的瓶颈。 我更喜欢使用AJAX for Javascript这样会触发请求并在响应可用时发送数据。我怎么能在Ruby中实现?

我看过delayed_job和backgroundrb,它们看起来像是用于火灾和遗忘操作的工具。我需要一些以响应方式异步激活回调的东西。

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

回答

5

您是否看过girl_friday?从它的wiki -

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

为什么不使用任何其他异步解决方案(Resque,dj等)的大量?由于girl_friday比这些解决方案更简单,更高效:girl_friday在Rails进程中运行,并使用actor模式进行安全并发。因为它运行在同一个进程中,所以您不必监视一组单独的进程,部署一个单独的代码库,为这些进程浪费数百MB的RAM空间等。有关更多详细信息,请参阅我在Ruby中的Actor介绍。

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

我想这就是你要找的。

+0

真棒会给这个镜头。也许就是这样。 – Sid

+0

我发现这是在控制台中工作,但不在开发模式下在应用程序中运行时将任务添加到队列中。顺便说一句我正在运行乘客和Apache在开发模式。 – Sid