如何在Rails的背景中每5秒钟在后台对数据库进行定期轮询/查询

时间:2019-05-26 09:28:50

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

我有一个ruby on rails应用程序,该应用程序每5秒基于数据库中创建的新记录发送一次推送通知。除了CRON作业之外,是否还有其他方法可以在数据库中进行轮询/查询以检查新记录。

我当前的代码实现正在运行CRON evey分钟,该睡眠时间为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

此代码段有效,但不是最佳解决方案。有没有更好的方法来实现这一目标。

2 个答案:

答案 0 :(得分:1)

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

看看以下页面:

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

答案 1 :(得分:0)

  

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

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


*是的,代码现在更加耦合,但也更易于推理。