Как обеспечить однократное планирование заданий Hangfire в веб-ферме - PullRequest
1 голос
/ 25 мая 2020

Каждый раз, когда я развертываю свое приложение, я удаляю все повторяющиеся задания и снова добавляю их, как показано ниже:

JobStorage.Current.GetConnection().GetRecurringJobs().ForEach(x => RecurringJob.RemoveIfExists(x.Id));
....
MyJobs.ForEach(x => RecurringJob.AddOrUpdate<....

Мне нужно сделать это, чтобы обойти проблемы с активацией, когда я меняю номер версии своего сборки с каждым развертыванием и после развертывания «MyAssembly, 2.0.0.0» исходные записи с «MyAssembly, 1.0.0.0» больше не активируются правильно, поэтому после каждого выпуска (фактически при каждом перезапуске пула приложений) я удаляю повторяющиеся задания и меняю расписание их. Все хорошо и хорошо.

Я хочу начать выполнять свои задания на веб-ферме, и мне бы хотелось, чтобы этот код, который удаляет задания и повторно добавляет их, выполнялся один раз для каждой «среды», а не один раз на сервер Hangfire, чтобы несколько серверов не конкурировали и добавляли одни и те же задания снова и снова.

Я, вероятно, мог бы обозначить один экземпляр как «лидер» через настройку web.config, и только лидер будет выполнять планирование рабочих мест, но что, если мой «лидер» не подключится к сети после развертывания. Я также хотел бы, чтобы все мои файлы конфигурации были идентичны, и чтобы мне не приходилось настраивать один как «лидер» в моем CD pipiline.

Как лучше всего справиться с этим сценарием? Hangfire?

1 Ответ

0 голосов
/ 30 мая 2020

Пожалуйста, посмотрите Hangfire.RecurringJobCleanUpManager . Это могло бы дать вам пример того, как справиться с изменением расписания повторяющихся заданий.

Под капотом нет magi c. Он в основном извлекает все текущие повторяющиеся задания, удаляет те, которые больше не присутствуют в коде, как «запланированные» (здесь, в библиотеке: принудительно), а затем добавляет те, которые находятся в коде, но не появляются при извлечении текущих повторяющихся заданий.

Это, как вы можете видеть, близко к тому, что вы сделали, просто красиво упаковано в несколько классов. Нет другого способа, кроме этого, если вы не хотите вручную изменять метаданные Hangfire для обновления имен сборок, версии et c.

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

...