使用resque实现命令模式

时间:2011-01-13 20:34:53

标签: ruby-on-rails ruby design-patterns command resque

我正在开发一个多用户树编辑应用。它使用resque gem作为后台进程。为了避免运行时多用户冲突,我想使用命令模式并在resque队列中存储用户操作,因此如果有人正在删除分支,则其他用户无法编辑该分支的子级。

它可以正常工作,但是从队列中第一次选择作业非常慢,因为resque worker使用5秒间隔检查作业。它显着减慢了编辑界面的速度。可以做这样的事情:

    cmd = MyCommand.create!(:attr1 => 'foo', :attr2 => 'bar')
    Resque.enqueue(MyCommand, cmd.id)
    workers = Resque.workers.select {|w| w.queues.include?('my_queue') }
    raise "Should be only one queue for commands!" if workers.size != 1
    not_done = true
    while not_done
      not_done = workers[0].process
    end

它做了我需要的,但我想知道是否有更优雅的方式来做到这一点。另外,:process是Worker实例的弃用方法。

1 个答案:

答案 0 :(得分:2)

我认为您的设计方法听起来有些合理,但Redis / Resque可能不合适。你想要的是一个超级快速的内存中队列,类似于Resque,但没有轮询延迟。

我很确定你可以使用MemCached,但也有其他选择。任何必须以特定间隔拉出排队命令的解决方案可能无法为协作编辑提供可接受的性能,除非可以每隔100毫秒甚至更频繁地进行轮询。

最后,如果您将每个操作放在一个只能串行处理命令的队列中(一次一个),那么您不可避免地会遇到队列可能会备份的情况,因为有太多命令进来,他们处理速度不快。这就是为什么更具可扩展性的解决方案可能使用版本控制,其中树的每个元素都是版本化的,并且在更新/更改时,所有子元素也都使用新版本进行更新。这样,就会拒绝对旧版本号进行编辑。

无论如何..祝你好运,听起来像是一个非常重要的问题需要解决。