1

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

它可以工作,但是第一次从队列中选择作业很慢,因为 resque 工作人员使用 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 实例不推荐使用的方法。

4

1 回答 1

2

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

我很确定您可以为此使用 MemCached,但可能还有其他选择。任何必须以特定间隔提取排队命令的解决方案都可能无法为协作编辑提供可接受的性能,除非可以每 100 毫秒或更频繁地轮询一次。

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

无论如何..祝你好运,听起来像一个不平凡的问题要解决。

于 2011-01-14T01:16:59.440 回答