Могу ли я присвоить свой собственный рандомизированный идентификатор работы Sidekiq? - PullRequest
0 голосов
/ 15 сентября 2018

Я использую Sidekiq для планирования некоторых задач на основе расписания, которое предоставляет пользователь. Однако, если пользователь меняет расписание, я хочу иметь возможность просто обновить старое расписание новым.

Предложение одно

Я увидел предложение просто найти старую работу с помощью Sidekiq::ScheduledSet.new.find_job(job_id), но я стараюсь не создавать новую модель просто для того, чтобы просто сохранить идентификатор работы и задачу.

Предложение два

Другое предложение, которое я видел, состояло в том, чтобы просто проверить работника, совпадает ли время задачи с текущим временем, но это не сработает, потому что, если сервер находится в автономном режиме, он не будет обрабатывать задания, когда он возвращается в оперативный режим, потому что время этих отложенных заданий не будет соответствовать текущему времени.

Если бы я мог назначить свой собственный идентификатор задания, например, шестнадцатеричную версию имени задания или дополненную версию идентификатора задания, я мог бы легко избежать создания новой модели для хранения идентификаторов задания. Поэтому, когда пользователь перенесет задачу, это будет намного проще.

Другие мысли

Возможно, если бы я мог проверить атрибут at задания и сопоставить его с задачей, это может сработать, но я не уверен, как получить доступ к этому атрибуту изнутри работника, не зная идентификатора задания.

Редактировать

Я только что попытался получить атрибут at текущего задания, но похоже, что после запуска задания оно больше не существует в Sidekiq::ScheduledSet, поэтому нет соответствующего времени этого задания со временем Задачи от того, на что это похоже.

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

У меня был случай, когда мне пришлось перепланировать задания на основе обновлений от Пользователя. Это на самом деле довольно медленно и сложно.

Проще не перепланировать, а вместо этого отключить старые задачи из очереди (без операций), а затем поставить новые задачи в очередь.

Это в основном определяется логикой в ​​задаче. Вы должны знать, что пользователь каким-то образом обновил свое расписание и проверил это в старых заданиях и, основываясь на некоторой проверке if, не выполнял задание.

0 голосов
/ 15 сентября 2018

Я использую Sidekiq для планирования некоторых задач на основе расписания, которое предоставляет пользователь ...

Для этого есть расширение. Sidekiq-Scheduler предоставляет вам файл конфигурации расписания, похожий на cron.Затем вы можете изменить расписание по своему усмотрению.Это кажется лучшим вариантом, так как не требует написания собственного интерфейса планировщика.

Могу ли я назначить свой собственный случайный идентификатор задания для Sidekiq?

Да, хотя это без документов.Вы можете присвоить атрибуту Sidekiq::Client.push jid.

Sidekiq::Client.push('class' => MyWorker, 'args' => [1, 2, 3], 'jid' => ... )

Это плохой способ решения вашей проблемы.Это полагается на недокументированную особенность.И это вызывает коллизии с обычными идентификаторами Sidekiq.

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

Это звучит очень подвержено ошибкам.Вам все равно придется хранить метку времени в модели.Во-первых, лучше хранить идентификатор задания.

Я стараюсь не создавать новую модель, просто сохраняя идентификатор задания и задачу.

Хранение вещей в моделях - это то, что Rails делает очень хорошо .Казалось бы, это путь.Это займет тривиальное количество кода, хранения базы данных и обработки.В любом случае, у вас должны быть модель, представление и контроллер для запланированных заданий, как вы будете создавать запланированные задания и просматривать расписание?

Тем не менее, Sidekiq docs отмечает , что find_job« медленная, неэффективная операция. Не используйте в нормальных условиях. Sidekiq Pro содержит более быструю версию. » Это потому, что он должен выполнять итерации по всем заданиям.

...