Ruby on rails Rails和XMPP(Jabber)bot:关于(异步?)队列的建议

Ruby on rails Rails和XMPP(Jabber)bot:关于(异步?)队列的建议,ruby-on-rails,xmpp,message-queue,background-process,Ruby On Rails,Xmpp,Message Queue,Background Process,因此,我正在使用Rails构建一个小应用程序。我需要使用xmppproto来通知用户,并使用一些命令来更改用户状态 以前的版本是一个使用普通Python(相当丑陋的应用程序)的应用程序,它将普通SQL请求放入数据库。有一个表“jabber_queue”,所以在单独的脚本中,bot每秒检查任何行,处理它(发送消息),删除。这很简单也很愚蠢,但还行 现在我明白了,我需要将这个bot功能集成到Rails中(至少要与RSpec一起工作) 这是我的几个版本的方法: 使用分离异步队列解决方案。例如,Resq

因此,我正在使用Rails构建一个小应用程序。我需要使用xmppproto来通知用户,并使用一些命令来更改用户状态

以前的版本是一个使用普通Python(相当丑陋的应用程序)的应用程序,它将普通SQL请求放入数据库。有一个表“jabber_queue”,所以在单独的脚本中,bot每秒检查任何行,处理它(发送消息),删除。这很简单也很愚蠢,但还行

现在我明白了,我需要将这个bot功能集成到Rails中(至少要与RSpec一起工作)

这是我的几个版本的方法:

  • 使用分离异步队列解决方案。例如,Resque。使用分离的Ruby脚本并将事件推送到应用程序中的Resque、pop事件中(不依赖于DB,因此很容易与RSpec测试和测试DB配合)。但它使我的应用程序有点臃肿——我需要使用第二个DB,需要大量的内存和CPU额外的需求——这将是我的问题的开销。另外,我不想为这个应用程序支持额外的“东西”,我知道,可以用更简单的方法来完成

  • 使用延迟的_作业(使用当前AR DB的队列解决方案)。但我不知道如何在单独的脚本中获得Rails应用程序的当前AR DB。不管怎样,这是一种肮脏而丑陋的方式

  • 在Rails应用程序中以后台工作者的身份启动XMPP bot。因此,工人将获得“当前”AR(在测试的情况下,测试DB)。但我就是不知道怎么做。我已经找到了一个,但是我需要在Rails的某个地方开始一个字符串,比如“Navvy::Job.enqueue(Cow,:speak)”,我不知道在哪里做这个最好,从RSpec测试和“Rails服务器”开始。此外,还有一个背景,但这个项目类似于Navvy,也不活跃。使用stackoverflow上的搜索,我发现了和我类似的问题,但解决方案让我找到了,它可以是后台的任何东西,但我仍然不知道如何在单独的脚本中获得当前的AR DB访问


  • 我很抱歉在我的问题中有这么多的话,这只是一个头脑风暴。我看到了一些解决方案,但我真的需要经验丰富的开发人员的建议和建议。

    所以,这是用“是的,第三种方法”解决的

  • 我创建了一个用于处理bot命令和AR模型的类-
    awesomo.rb
    。没什么特别的,真的。我把它放在Rails项目的
    /lib/
    中。第二,

  • 创建配置文件,方便设置密码和JID-
    config/awesomo.yml

  • 我已经为我的bot创建了一个守护程序-
    awesomo\u daemon.rb
    。同样,在
    /lib/
    中。它包含以下内容:

  • 已创建守护程序脚本启动程序-
    脚本/awesomo

  • 只需使用命令
    script/awesomo start
    运行它

  • 我可以在
    awesomo.rb
    中使用我的任何模型!另外,对于队列,我使用了小模型-XMPPJob,其中包含字段jtype(例如,“xmpp_message”)、body(“hey!”)和to(”john@jabber.com"). 在具有
    限制(5)的bot类的
    awesomo.rb
    idle
    函数中获取它。每个do | job | case jtype…

    要为我的“awesomo”发布任何新工作,我使用函数
    send\u message


    除了XMPP库(
    xmpp4r simple
    )本身之外,一切都运行得很好,但我很快就会用
    xmpp4r

    重写它。从一些google结果中,我发现了一个使用forked delayed_job的想法:用我的工作设置一个类(XMPP bot的生命周期,我的理解是正确的),但还有另一个问题——我需要在生命周期任务中处理其他任务(例如:send_xmpp_msg)。所以我需要检查另一个任务中的任务队列。所以我需要创建另一个队列。天啊,看来我需要另一个解决办法。有什么想法吗?
    +1
    分享您的解决方案和详细答案:)
    development:
      xmpp_jid: ...
      xmpp_password: ...
    
    #preload rails environment
    require File.expand_path(File.join(File.dirname(__FILE__),
         '..', 'config', 'environment'))
    
    #load xmpp bot class
    require 'awesomo_daemon'
    
    #load xmpp bot configuration file for current environment
    AWESOMO_CONFIG = YAML.load_file(File.join(File.dirname(__FILE__),
        '..', 'config', 'awesomo.yml'))[Rails.env]
    
    #apply configuration before singleton will be initiated
    Awesomo.setup AWESOMO_CONFIG['xmpp_jid'], AWESOMO_CONFIG['xmpp_password']
    
    loop {
      Awesomo.instance.idle
      sleep 1
    }
    
    #!/usr/bin/env ruby
    require 'rubygems'
    require 'daemons'
    Daemons.run "lib/awesomo_daemon.rb", dir_mode: :normal,
        dir: File.join(File.dirname(__FILE__), '..', 'tmp', 'pids')
    
    def self.send_message to, body
      xmppjob = XmppJob.new :jtype => "xmpp_message", :body => body, :to => to
      xmppjob.save
    end