防抖动(Debouncing)是一种常见的方法,可以推迟一个函数或作业的执行,直到一定的时间过去。
应用场景:在多个用户活跃聊天的对话中,他们不应该为每条消息收到一封电子邮件通知。但很可能在几分钟的沉默之后,如果这些消息没有被读取,用户应该看到一个通知。
Delayed_Job
目前没有解决方案,但有相关问题:https://github.com/collectiveidea/delayed_job/issues/72
Sidekiq
防抖动(Debouncing)是一种常见的方法,可以推迟一个函数或作业的执行,直到一定的时间过去。
应用场景:在多个用户活跃聊天的对话中,他们不应该为每条消息收到一封电子邮件通知。但很可能在几分钟的沉默之后,如果这些消息没有被读取,用户应该看到一个通知。
Delayed_Job
目前没有解决方案,但有相关问题:https://github.com/collectiveidea/delayed_job/issues/72
Sidekiq
class AdminJob
def self.debounce(job, args={})
handler = YAML.dump(job)
count = Delayed::Job.where(handler: handler).where('locked_at IS NULL').delete_all
Rails.logger.info("deleted: #{count} jobs")
Delayed::Job.enqueue(job, args)
end
end
Delayed::Job.enqueue(YourJobName.new(account_id), {run_at: 10.minutes.from_now})
AdminJob.debounce(YourJobName.new(account_id), {run_at: 10.minutes.from_now})
Delayed job将您的作业参数序列化为YAML
,然后将其保存到数据库中作为handler
。因此,如果您连续10次调用AdminJob.debounce(...)
,它将在每个调用之前删除。
确保给自己足够的时间(5分钟等)让用户继续采取行动。如果您在1秒后运行作业,他们很可能会继续采取行动并再次触发。
是的,我在3年后回答自己的问题...