>

asp.net mvc-5 웹 응용 프로그램을 작업 중이며 Hangfire 도구를 사용하여 오래 실행되는 백그라운드 작업을 실행하는 데 문제가 있습니다.문제는 작업 실행이 30 분을 초과하면 hangfire가 자동으로 다른 작업을 시작하므로 두 개의 유사한 작업이 동시에 실행된다는 것입니다.

이제 다음이 있습니다 :-

<올>
  • Asp.net MVC-5
  • IIS-8
  • Hangfire 1.4.6
  • Windows Server 2012
  • 는 지금은 매일 17:00 실행할 hangfire 반복 작업을 정의했습니다. 백그라운드 작업은 주로 네트워크에서 서버 및 VM을 검색하고 DB를 업데이트하며 반복 작업은 실행이 완료된 후 이메일을 보냅니다. 되풀이 작업은 실행이 30 분 미만 때 잘 작동하는 데 사용됩니다. 그러나 오늘날 시스템이 성장함에 따라 되풀이 작업은 예전처럼 22-25 분 대신 40 분 후에 완료되었습니다. 나는 하나의 이메일로이 이메일 대신받은 (와 이메일 사이의 시간은 약 30 분이었다). 지금은 수동으로 작업을 다시 실행하고 나는 문제는 다음과 같다 있다는 것을주의했다 : -

    와이즈 비즈

    이제 되풀이 작업이 30 분 (예 : 29 분) 미만이면 아무 문제가 없지만 되풀이 작업 실행이 30 분을 초과하면 이유 또는 다른 중단으로 새 작업이 시작됩니다. 내가 작업의 실행 중에 hangfire 대시 보드에 액세스 할 때 있지만, 나는 우리의 DB를 모니터링 할 때이 DB에 접근이 작업이하는 SQL 프로파일 러에서 볼 수있는 단 하나의 활성 작업이 있음을 확인할 수 있습니다. 이 작업은 되풀이 작업이 시작된 후 30 분 후에 발생합니다 (이 경우 17:30). 왜 2 개의 되풀이 작업이 백그라운드에서 1 개 대신 백그라운드에서 실행되고 있음을 의미하는 2 개의 이메일을 받았습니다.

    현재 반복 작업 실행이 30 분을 초과하는 경우 hangfire에서 새 되풀이 작업을 자동으로 시작하지 않도록하려면 어떻게해야합니까? 감사합니다

    "when the recurring job reaches 30 minutes of continuous execution, a new instance of the recurring job will start, so I will have two instances instead of one running at the same time, so that why I received 2 emails."


    • 답변 # 1

      InvisibilityTimeout 를 보았습니까?  Hangfire 문서에서 설정 하시겠습니까?

      와이즈 비즈

      Default SQL Server job storage implementation uses a regular table as a job queue. To be sure that a job will not be lost in case of unexpected process termination, it is deleted only from a queue only upon a successful completion.

      To make it invisible from other workers, the UPDATE statement with OUTPUT clause is used to fetch a queued job and update the FetchedAt value (that signals for other workers that it was fetched) in an atomic way. Other workers see the fetched timestamp and ignore a job. But to handle the process termination, they will ignore a job only during a specified amount of time (defaults to 30 minutes).

      Although this mechanism ensures that every job will be processed, sometimes it may cause either long retry latency or lead to multiple job execution. Consider the following scenario:

        Worker A fetched a job (runs for a hour) and started it at 12:00.

        Worker B fetched the same job at 12:30, because the default invisibility timeout was expired.

        Worker C (did not fetch) the same job at 13:00, because (it will be deleted after successful performance.)

      If you are using cancellation tokens, it will be set for Worker A at 12:30, and at 13:00 for Worker B. This may lead to the fact that your long-running job will never be executed. If you aren’t using cancellation tokens, it will be concurrently executed by WorkerA and Worker B (since 12:30), but Worker C will not fetch it, because it will be deleted after successful performance.

      So, if you have long-running jobs, it is better to configure the invisibility timeout interval:

      는 Hangfire 1.5으로이 옵션 var options = new SqlServerStorageOptions { InvisibilityTimeout = TimeSpan.FromMinutes(30) // default value }; GlobalConfiguration.Configuration.UseSqlServerStorage("<name or connection string>", options); 지금 . , 작업중인 잡스는 다른 노동자들에게 보이지 않습니다.

      와이즈 비즈

    • 답변 # 2

      나는 PostgreSQL 데이터베이스 제대로이 작업을 수행하는 방법에 대한 문서를 찾는 데 문제가 있었다, 내가 볼이 SQLSERVER를 사용하는 한 모든 예를 들어, 내가 PostgreSqlStorageOptions 객체 내부의 투명 타임 아웃이 속성 얼마나 발견, 여기이 발견 : HTTPS : //github.com/frankhommers/Hangfire.PostgreSql/blob/master/src/Hangfire.PostgreSql/PostgreSqlStorageOptions.cs#L36. 운 좋게도 시행 착오를 통해 UsePostgreSqlStorage 에이 객체를 허용하는 과부하가 있음을 알 수있었습니다. .Net Core 2.0의 경우 시작 클래스의 ConfigureServices 메소드에서 hangfire postgresql DB를 설정할 때 이것을 추가하십시오 (기본 시간 제한은 30 분으로 설정 됨).

      Obsolete
      
      

    • 답변 # 3

      Hangfire.MemoryStorage를 스토리지 공급자로 사용할 때이 문제가 발생했습니다. 메모리 스토리지를 사용하면

      Say goodbye to confusing invisibility timeout with unexpected background job retries after 30 minutes (by default) when using SQL Server. New Hangfire.SqlServer implementation uses plain old transactions to fetch background jobs and hide them from other workers.

      Even after ungraceful shutdown, the job will be available for other workers instantly, without any delays.

      를 설정해야합니다.   services.AddHangfire(config => config.UsePostgreSqlStorage(Configuration.GetConnectionString("Hangfire1ConnectionString"), new PostgreSqlStorageOptions { InvisibilityTimeout = TimeSpan.FromMinutes(720) })); 에서 그렇지 않으면 기본적으로 작업 30 분 후에 시간 초과하고 새 작업이 실행됩니다.

      FetchNextJobTimeout
      
      
      MemoryStorageOptions

  • 이전 PHP로 SFTP하는 방법?
  • 다음 Apache Beam에서 JSON 배열을 BigQuery 테이블로 스트리밍하는 방법