Отправить сердцебиение в длительном процессе зависания - PullRequest
3 голосов
/ 17 апреля 2020

Можно ли отправить сердцебиение в Hangfire (Redis Storage), чтобы сообщить системе, что процесс еще жив? В данный момент я установил InvisibilityTimeout на TimeSpan.MaxValue, чтобы предотвратить возобновление работы при зависании от огня. Но в случае сбоя процесса или перезапуска сервера задание никогда не будет удалено из списка запущенных заданий. Поэтому моя идея состояла в том, чтобы убрать большой тайм-аут и вместо этого послать своеобразное биение. Это возможно?

1 Ответ

1 голос
/ 30 апреля 2020

Я нашел https://discuss.hangfire.io/t/hangfire-long-job-stop-and-restart-several-time/4282/2, в котором рассказывается, как сохранить долгосрочную работу в Hangfire. Пользователь zLanger говорит, что задания считаются мертвыми и перезапускаются, как только вы ...

[...] достигли уровня invisibilityTimeout Hangfire. У вас есть два варианта.

  • увеличить время ожидания до большего, чем когда-либо будет выполняться заданием
  • сделать так, чтобы задание отправило сердцебиение, чтобы Hangfire знал, что оно все еще живо.

Это не ново для вас. Но интересно, что последующий вопрос есть:

Как реализовать сердцебиение на работе?

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

Я никогда не занимался долгосрочными заданиями в Hangfire, но я знаю проблему из других систем очередей, таких как бывший SunGrid Engine , и именно поэтому я заинтересовался вашим вопросом.

В те времена у меня была именно ваша проблема с SunGrid, и компьютерный гуру отдела сказал мне, что следует любой ценой избегать длительных заданий в соответствии с некоторой математической теорией очередей (я постараюсь связаться с ним и найти ссылку на книгу, которую он цитировал). Его идея, возможно, стоит поделиться с вами:

Если у вас есть работа, которая занимает больше времени, чем допустимое максимальное время работы системы массового обслуживания, не отправляйте саму работу, а скорее несколько вызовов Скрипт-обертка, который может (1) запустить, (2) остановить-остановить, (3) разморозить-продолжить текущую задачу.

Эта остановка-продолжение действительно может быть приостановкой (CTRL+Z соответственно fg в Linux) на уровне операционной системы, см., например, unix .stackexchange.com по этому вопросу .

На практике у меня был бинарный файл myMonteCarloExperiment.x и скрипт-обертка myMCjobStarter.sh. Максимальное время вычислений у меня было один день. Я бы заполнил очередь сотнями вызовов скрипта-оболочки с граничным условием, что только один из них должен быть запущен. Сценарий проверит, запущен ли уже процесс myMonteCarloExperiment.x где-либо в вычислительном кластере, если нет, он запустит экземпляр. В случае если процесс был приостановлен, скрипт-обёртка переадресует его и позволит запустить его в течение 23 часов 55 минут, а затем приостановит процесс. В любом другом случае скрипт-оболочка выдаст сообщение об ошибке.

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

Дополнительные ссылки

...