【问题标题】:How to do periodic polling/query to database in every 5 sec in background in ruby on rails如何在 ruby​​ on rails 的后台每 5 秒定期轮询/查询数据库
【发布时间】:2019-10-12 05:10:31
【问题描述】:

我有一个 ruby​​ on rails 应用程序,它每 5 秒根据数据库中创建的新记录发送推送通知。除了 CRON 作业之外,还有什么方法可以在数据库中进行轮询/查询以检查新记录。

我当前的代码实现是每分钟运行一次 CRON,它会休眠 5 秒,但这种方法会消耗大量内存。

schedule.rb #whenever gem file

 every 1.minute do
  runner "DailyNotificationChecker.send_notifications"
end

* ### 下面的代码每 5 秒调用一次方法 process_notes

    def self.send_notifications
        expiry_time = Time.now + 57
        while (Time.now < expiry_time)
            if RUN_SCHEDULER == "true" || RUN_SCHEDULER == true
              process_notes  #calls method mentioned below
            end
          sleep 5 #seconds
        end
      end


 ### below code check for new records and sends notification


    def self.process_notes
      notes = nil
      time = Benchmark.measure do
        Note.uncached do
          notes = Note.where("(created_at > DATE_SUB(now(), INTERVAL 2 minute)) AND `notes`.`processed` = 0")
          if notes.present?
            note_ids = notes.collect{|x| x.id}
            RealtimeNotifier.new.delay.perform(note_ids,NOTE_CREATED,TEMP_USER_NOTE)
          end
        end
      end
    end

此代码 sn-p 有效,但不是优化的解决方案。有没有更好的方法来实现这一点。

【问题讨论】:

  • 或者github.com/Ebbe/arask 可能会更好。在 Arask 配置中添加这一行:arask.create script: 'DailyNotificationChecker.send_notifications', interval: 5.seconds。这应该让 Rails 每 5 秒自动运行一次任务。

标签: ruby-on-rails ruby ruby-on-rails-4 cron


【解决方案1】:

MySQL 允许您设置一个触发器来调用用户定义的函数(用 C 或 C++ 编写),其他数据库可能具有类似的功能。从那里,您可以用 bash 脚本替换当前正在运行的进程,您可以在其中放置要运行的命令。我不能给你一个例子,因为我从来不需要这个。但这可能会为您指明正确的方向。

查看以下页面:

应用此解决方案会将基于投票的解决方案更改为基于推送的解决方案。

【讨论】:

  • 谢谢伙计,我会试试这个并在这里发布我的发现。
【解决方案2】:

我有一个 ruby​​ on rails 应用程序,它根据数据库中每 5 秒创建的新记录发送推送通知。

因此,您当前有一个位于内存中并轮询数据库的作业/进程,然后对新记录执行一些操作。颠倒工作流程怎么样?您的代码的其他部分会创建这些记录,是吗?还要使该部分在队列中放置一个新的RealtimeNotifier 作业。可以说,去掉中间人*


* 是的,代码现在更加耦合,而且更容易推理。

【讨论】:

  • 感谢您抽出时间@sergio,我理解您的解释,但情况是数据从后门进入数据库。它不是从 Rails 应用程序创建的,这就是为什么我不能在那里使用回调或耦合代码。
  • @Prem:我明白了。好吧,希望这个答案能帮助其他访客。
猜你喜欢
  • 2016-04-25
  • 2023-03-29
  • 2017-06-01
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-10
相关资源
最近更新 更多