我可以更优化这个代码吗?我的后台工作人员出了什么问题

时间:2016-07-14 05:39:06

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

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

这是每当gem调度程序

    class DailyNotificationChecker

     def self.send_notifications
            puts "Triggered send_notifications"
            expiry_time = Time.now + 57
            while (Time.now < expiry_time)
                if RUN_SCHEDULER == "true" || RUN_SCHEDULER == true
                  process_notes
                end
              sleep 4 #seconds
            end
          end

          def self.process_notes
            notes = nil
            time = Benchmark.measure do
              Note.uncached do
                notes = Note.within_2_mins.unprocessed
                if notes.present?
                  note_ids = notes.pluck(:id)
                  note_hash = {}
                  note_hash[:note_ids] = note_ids.to_json
                  url = URI.parse(PROCESS_NOTE_API_URL)
                  resp, data = Net::HTTP.post_form(url, note_hash)
                  notes.each do |note|
                     puts "note_id = #{note.id}"
                     puts "processed #{note.processed}"
                    RealtimeNotificationChecker.perform_async(note.user_id,"note_created","TempUserNote",note.id)
                  end
                end
              end
            end
              puts "time #{time}"
          end
end

我的目的是尝试运行实时通知。如果用户在应用程序中创建了一个笔记,那么我会在4秒内向他发送推送通知。

所以我每1分钟运行一次cron作业,然后点击send_notifications课程中的方法DailyNotificationChecker。现在这应该每4秒运行一次方法process_notes。创建的每个新音符都设置为processed = 0 flag。并且我检索每个不超过2分钟的未处理标志并对其执行操作。

note_ids = notes.pluck(:id)
 note_hash = {}
 note_hash[:note_ids] = note_ids.to_json
 url = URI.parse(PROCESS_NOTE_API_URL)
 resp, data = Net::HTTP.post_form(url, note_hash)

获取所有未处理的note_ids并将它们发送到主服务器以标记它们处理= 1,以便在接下来的4秒内点击这些注释不再来到处理列表。

然后我循环每个音符并在后台发送它们以发送推送通知

    notes.each do |note|
      RealtimeNotificationChecker.perform_async(note.user_id,"note_created","TempUserNote",note.id)
    end

但我想这里有些不对劲。当我有2个以上的笔记要处理时,它不会向所有用户发送通知。

有人可以提出错误并要求

注意: 我可能会在4秒内处理超过10-15个音符。 我正在使用sucker punch gem进行后台工作。

0 个答案:

没有答案