У меня есть приложение rails, которое получает много писем из нескольких учетных записей IMAP.
- Я использую sidekiq для обработки заданий.
- Я использую sidetiq для планирования заданий.
- Я использую redis-semaphore, чтобы повторяющиеся задания для одного и того же пользователя не натыкались друг на друга.
2 проблемы, хотя:
- 1: Когда задание попадает в «if s.lock», redis-semaphore приостанавливает его выполнение до завершения всех предыдущих заданий. Мне нужно, чтобы задание было отменено, а не поставлено в очередь.
- 2: Если во время выполнения задания возникнет исключение, что приведет к сбою, sidekiq вернет задание в очередь для повторной попытки. Мне нужно, чтобы задание было отменено, а не поставлено в очередь. Включение «sidekiq_options :retry => false» в код, похоже, не имеет значения.
Мой код:
class FetchMailsJobs
include Sidekiq::Worker
include Sidetiq::Schedulable
tiq { hourly.minute_of_hour(0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55) }
def perform(last_occurrence, current_occurrence)
users = User.all
users.each do |user|
if user.imap_accounts.exists?
ImapJob.perform_async(user._id.to_s)
end
end
end
end
class ImapJob
include Sidekiq::Worker
def perform(user_id)
s = Redis::Semaphore.new("fetch_imap_mails_for_#{user_id}".to_sym, connection: "localhost")
if s.lock
user = User.where(_id: user_id).first
emails = ImapMails.receive_mails(user)
s.unlock
end
end
end