【问题标题】:Create a "Building Queue" with rails associated to a user使用与用户关联的导轨创建“构建队列”
【发布时间】:2022-01-05 09:11:34
【问题描述】:

我目前正在学习 Ruby on Rails,为此我正在开发一个网页游戏。

这款游戏与 Travian 属于同一类型,玩家可以建造建筑物等...

我解释说,我在实现我的“构建队列”时有点卡在这个功能上。

一个玩家最多排在 3 个建筑物的队列中。 第一个完成后,我们首先检查他是否有必要的资源进行下一个,依此类推。

目前,我使用 BuildQueue 表管理我的队列。只要之前的构建还没有完成,我们就等待。构建启动后,它会启动一个在构建期间休眠的线程:

build_in_progress = BuildQueue.where(queue_type: 'build', kingdom_id: current_kingdom.id)

# It means that the building queue is empty
if build_in_progress.empty?

  build_time = time(building)
  new_queue = BuildQueue.create(queue_type: 'build', build: building, kingdom_id: current_kingdom.id, build_time: build_time)

  Thread.start do
    sleep build_time

    # [...] Here I update the building concerned
    new_queue.destroy
  end
else
  build_in_progress_id = build_in_progress.last.id
  new_queue = BuildQueue.create(queue_type: 'build', build: building, kingdom_id: current_kingdom.id)

  Thread.start do
    build_in_progress = BuildQueue.find_by_id(build_in_progress_id)
    until build_in_progress.nil?
      sleep 1
      build_in_progress = BuildQueue.find_by_id(build_in_progress_id)
    end

    # We check that the player still has the necessary resources
    cost = cost(building)

    if can_upgrade?(cost)
      build_time = time(building)
      new_queue.build_time = build_time
      new_queue.save

      sleep build_time

      # [...] Here I update the building concerned
      Notification.create(kingdom_id: current_kingdom.id, notif_type: 'build', message: "The construction of #{t("buildings.#{building}")} is finished", icon: 'gavel')
    end

    new_queue.destroy
  end
end

所以这是一个基本的系统,但它可以工作。

我想改进它,但我找不到办法。

我发现 Rails 作业与 ActiveJob 一起使用,但我不知道是否可以:

  • 将作业链接到用户并且每个启动的作业都等到前一个作业完成?
  • 如果作业 2 无法启动,请立即尝试启动作业 3

我还看到了使用 Redis 并将我的工作按应该完成的顺序排列的可能性。但是在这里我有同样的问题

  • 如果因为玩家没有资源而无法启动任务2,您必须立即尝试启动任务3

否则,作为最后的手段,我想到了一个 cron 系统,但我认为它比我现在做的更糟糕

问候

【问题讨论】:

    标签: ruby-on-rails ruby jobs delayed-job job-scheduling


    【解决方案1】:

    考虑使用gem Wisper。它还具有用于异步事件处理的各种适配器。

    【讨论】:

    • 我不确定它是否能解决我的问题,但我仍然必须使用我的 BuildQueue 表,不是吗?所以 gem 只是让我避免使用线程?
    • 没有宝石也可以。据我了解的任务,这里需要使用回调来调用构建下一个建筑物的方法。我们需要创建可以发送和处理这些回调的对象。构建必须异步完成,例如通过 sidekiq
    • 是的,就是这样你有更多的细节给我吗? :D 谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多