Как сделать периодический опрос / запрос к базе данных каждые 5 секунд в фоновом режиме в ruby ​​на рельсах - PullRequest
0 голосов
/ 26 мая 2019

У меня есть приложение ruby ​​on rails, которое отправляет push-уведомления на основе новых записей, созданных в базе данных, каждые 5 секунд.Есть ли способ, кроме заданий CRON, выполнять опрос / запрос в БД для проверки новых записей.

Моя текущая реализация кода использует CRON каждую минуту, которая спит в течение 5 секунд, но этот подход требует огромного потребления памяти.

schedule.rb #whenever gem file

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

* ### ниже кода вызывает метод process_notes каждые 5 секунд

    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 ]

1 голос
/ 26 мая 2019

MySQL позволяет вам настроить триггер, который вызывает пользовательскую функцию (написанную на C или C ++), другие базы данных могут иметь аналогичную функциональность.Оттуда вы можете заменить текущий запущенный процесс сценарием bash, в который вы помещаете команды для запуска.Я не могу привести вам пример, так как я никогда не нуждался в этом.Но это может указать вам правильное направление.

Взгляните на следующие страницы:

Применение этого решения изменит ваше решение на основе опроса на решение на основе push.

0 голосов
/ 26 мая 2019

У меня есть приложение ruby ​​on rails, которое отправляет push-уведомления на основе новых записей, созданных в базе данных, каждые 5 секунд.

Итак, у вас есть задание / процесс, который находится в памяти и опрашивает базу данных, а затем что-то делает с новыми записями. Как насчет инверсии рабочего процесса? Какая-то другая часть вашего кода создает эти записи, да? Также заставьте эту часть поставить новое RealtimeNotifier задание в очередь. Вырежьте посредника *, так сказать.


* да, код теперь более связанный, но его также легче рассуждать.

...