programing

IIS에서 스레드를 사용하여 장시간 실행 작업을 수행할 수 있습니까?

linuxpc 2023. 6. 30. 22:08
반응형

IIS에서 스레드를 사용하여 장시간 실행 작업을 수행할 수 있습니까?

ASP.Net 응용 프로그램에서 사용자는 웹 페이지의 단추를 클릭한 다음 이벤트 처리기를 통해 서버의 개체를 인스턴스화하고 개체에 대한 메서드를 호출합니다.이 방법은 작업을 수행하기 위해 외부 시스템으로 이동하며 시간이 걸릴 수 있습니다.따라서 다른 스레드에서 메서드 호출을 실행하여 "당신의 요청이 제출되었습니다"로 사용자에게 제어 권한을 반환할 수 있습니다.사용자가 계속해서 개체 상태를 폴링할 수 있다면 훨씬 더 좋겠지만, 저는 이것을 화재 및 망각으로 처리할 수 있어 매우 기쁩니다.

사용자 세션이 만료되더라도 IIS에서 스레드를 계속 실행할 수 있는지 여부를 알 수 없습니다.예를 들어, 사용자가 이벤트를 실행하고 서버에서 개체를 인스턴스화한 후 새 스레드에서 메서드를 실행합니다.사용자는 "요청이 제출되었습니다" 메시지에 만족하고 브라우저를 닫습니다.최종적으로 이 사용자 세션이 IIS에서 시간 초과되지만 스레드는 여전히 실행 중이고 작업 중일 수 있습니다.IIS는 스레드가 계속 실행되도록 허용합니까? 아니면 사용자 세션이 만료되면 스레드를 종료하고 개체를 폐기합니까?

편집: 답변과 의견을 통해, 이를 위한 가장 좋은 방법은 장기간 실행되는 처리를 IIS 외부로 이동하는 것이라는 것을 이해합니다.다른 모든 것을 제외하고, 이것은 앱 도메인 재활용 문제를 다룹니다.실제로 버전 1을 제한된 시간 내에 시작해야 하고 기존 프레임워크 내에서 작업해야 하므로 서비스 계층을 피하고 IIS 내부의 스레드를 실행하고 싶습니다.실제로 여기서 "긴 실행"하는 것은 몇 분 밖에 걸리지 않을 것이고 웹사이트의 동시성이 낮으므로 괜찮을 것은 괜찮을 것입니다.그러나 다음 버전에서는 반드시 별도의 서비스 계층으로 분할해야 합니다.

여러분은 여러분이 원하는 것을 이룰 수 있지만, 그것은 일반적으로 나쁜 생각입니다.여러 ASP.NET 블로그 및 CMS 엔진은 공유 호스팅 시스템에 설치할 수 있고 설치해야 하는 윈도우즈 서비스에 종속되지 않기를 원하기 때문에 이 방법을 사용합니다.일반적으로 앱이 시작되면 Global.asax에서 실행 중인 긴 스레드를 시작하고 해당 스레드 프로세스가 작업을 대기열에 넣습니다.

IIS/ASP.NET에서 요청을 처리하는 데 사용할 수 있는 리소스를 줄이는 것 외에도 AppDomain이 재활용될 때 스레드가 삭제되는 문제가 있으며, 작업이 진행 중인 동안 지속성을 처리하고 AppDomain이 다시 실행되면 작업 백업을 시작해야 합니다.

대부분의 경우 AppDomain은 기본 간격으로 자동으로 재활용되며 web.config 등을 업데이트할 때도 마찬가지입니다.

언제든지 스레드가 중단되는 지속성 및 트랜잭션 측면을 처리할 수 있다면 사이트에서 요청을 하는 외부 프로세스를 통해 AppDomain 재활용을 피할 수 있습니다. 따라서 사이트가 재활용되면 X분 이내에 자동으로 다시 백업되도록 보장할 수 있습니다.

다시 말하지만, 이것은 일반적으로 좋지 않은 생각입니다.

편집: 다음은 이 기술의 몇 가지 예입니다.

커뮤니티 서버:윈도우즈 서비스 사용 및예약된 간격으로 코드를 실행할 백그라운드 스레드 웹 사이트가 처음 시작될 때 백그라운드 스레드 만들기

EDIT (먼 미래에서 온) - 요즘 나는 행파이어를 사용합니다.

저는 수락된 답변에 동의하지 않습니다.

스레드 백라운또스드드레태사시(으)로 함), 다로으음으로 시작함Task.Factory.StartNewNET ASP를 합니다.NET에서 사용할 수 있습니다.모든 호스팅 환경과 마찬가지로 종료를 관리하는 시설을 이해하고 협력해야 할 수도 있습니다.

ASP.에서 ASP를 시할 수 .NET에서 다음을 사용하여 종료 시 정상적으로 중지해야 하는 작업을 등록할 수 있습니다.HostingEnvironment.RegisterObject방법.자세한 내용은 이 기사와 댓글을 참조하십시오.

(제라드가 그의 논평에서 지적했듯이, 현재 또한 있습니다.HostingEnvironment.QueueBackgroundWorkItem에 해당하는 것은RegisterObject작업할 백그라운드 항목의 스케줄러를 등록합니다.전반적으로 새로운 방법은 작업 기반이기 때문에 더 좋습니다.)

자주 듣는 일반적인 주제에 대해서는 Windows 서비스(또는 다른 종류의 추가 프로세스 응용 프로그램)를 배포하는 대안을 고려하십시오.

  • 웹 배포를 통해 더 이상 사소한 배포가 필요 없음
  • Azure 웹 사이트에서만 배포할 수 없음
  • 백그라운드 작업의 특성에 따라 프로세스가 통신해야 할 가능성이 높습니다.이는 IPC의 어떤 형태로든 서비스가 공통 데이터베이스에 액세스해야 한다는 것을 의미합니다.

또한 일부 고급 시나리오에서는 백그라운드 스레드가 요청과 동일한 주소 공간에서 실행되어야 할 수도 있습니다.ASP.NET은 .NET을 통해 가능해진 큰 장점이라고 생각합니다.

IIS 스레드 풀의 스레드는 이후 요청을 처리할 수 없으므로 해당 스레드를 이 작업에 사용하지 않을 수 있습니다.ASP.NET 2.0에서 비동기 페이지를 조사할 수 있지만, 그것도 정답은 아닙니다.대신 Microsoft Message Queuing(Microsoft 메시지 큐)에 대해 알아봅니다.기본적으로 작업 세부 정보를 대기열에 추가하면 다른 백그라운드 프로세스(Windows 서비스일 수 있음)가 해당 작업을 수행합니다.하지만 중요한 것은 백그라운드 프로세스가 IIS와 완전히 격리되어 있다는 것입니다.

이러한 요구 사항에 대해 HangFire를 사용할 것을 제안합니다.이 제품은 백그라운드에서 작동하고 다양한 아키텍처를 지원하며 지속성 스토리지를 기반으로 하기 때문에 안정적입니다.

여기에 좋은 스레드와 샘플 코드가 있습니다. http://forums.asp.net/t/1534903.aspx?PageIndex=2

저는 앱 풀을 활성화하는 데 도움이 되도록 스레드에서 웹 사이트의 활성화 유지 페이지를 호출하는 아이디어도 가지고 있었습니다.이 방법을 사용하는 경우 응용 프로그램이 언제든지 재활용될 수 있기 때문에 복구 처리를 정말 잘 해야 합니다.많은 사람들이 언급했듯이, 다른 서비스 옵션에 액세스할 수 있는 경우에는 이 방법이 적합하지 않지만 공유 호스팅의 경우에는 이 방법이 유일한 옵션 중 하나일 수 있습니다.

스레드가 처리되는 동안 자신의 사이트에 요청하여 앱 풀을 계속 유지할 수 있습니다.이렇게 하면 프로세스가 오래 실행되는 경우 앱 풀을 계속 유지하는 데 도움이 될 수 있습니다.

string tempStr = GetUrlPageSource("http://www.mysite.com/keepalive.aspx");


    public static string GetUrlPageSource(string url)
    {
        string returnString = "";

        try
        {
            Uri uri = new Uri(url);
            if (uri.Scheme == Uri.UriSchemeHttp)
            {
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri);
                CookieContainer cookieJar = new CookieContainer();

                req.CookieContainer = cookieJar;

                //set the request timeout to 60 seconds
                req.Timeout = 60000;
                req.UserAgent = "MyAgent";

                //we do not want to request a persistent connection
                req.KeepAlive = false;

                HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
                Stream stream = resp.GetResponseStream();
                StreamReader sr = new StreamReader(stream);

                returnString = sr.ReadToEnd();

                sr.Close();
                stream.Close();
                resp.Close();
            }
        }
        catch
        {
            returnString = "";
        }

        return returnString;
    }

우리는 이 길을 따라가기 시작했고, 우리의 앱이 한 서버에 있을 때는 실제로 잘 작동했습니다.여러 대의 컴퓨터로 확장(또는 웹 갤러리에서 여러 대의 w3wp를 사용)하고자 할 때, 작업 대기열, 오류 처리, 재시도 및 한 대의 서버만이 다음 항목을 선택할 수 있도록 올바르게 잠금하는 까다로운 문제를 재평가하고 검토해야 했습니다.

우리는 백그라운드 처리 엔진을 작성하는 사업이 아니라는 것을 깨닫고 기존 솔루션을 찾아 멋진 OSS 프로젝트 행파이어를 사용하여 착륙했습니다.

Sergey Odinokov는 시작하기 정말 쉬운 진짜 보석을 만들었습니다. 그리고 당신이 어떻게 일이 지속되고 대기열에 있는지 백엔드를 바꿀 수 있게 해줍니다.행파이어는 백그라운드 스레드를 사용하지만 작업을 유지하고 재시도를 처리하며 작업 대기열에 대한 가시성을 제공합니다.따라서 행파이어 작업은 강력하며 재활용되는 앱 도메인 등의 다양한 영역에서 살아남습니다.

기본 설정에서는 sql 서버를 스토리지로 사용하지만 스케일업 시간이 되면 Redis 또는 MSMQ로 교체할 수 있습니다.또한 모든 작업과 상태를 시각화하고 작업을 다시 대기열에 넣을 수 있는 우수한 UI를 갖추고 있습니다.

제 요점은 백그라운드 스레드에서 원하는 작업을 수행하는 것이 전적으로 가능하지만 확장 가능하고 견고하게 만들기 위해서는 많은 작업이 필요하다는 것입니다.단순한 워크로드에는 문제가 없지만, 상황이 복잡해질 때는 이러한 작업을 수행하는 것보다 목적에 맞게 구축된 라이브러리를 사용하는 것이 훨씬 더 좋습니다.

사용 가능한 옵션에 대한 더 많은 관점은 asp.net 에서 백그라운드 작업을 처리하기 위한 몇 가지 옵션을 다루는 Scott Hanselman의 블로그를 확인하십시오. (그는 hangfire에 열렬한 리뷰를 제공했습니다.)

또한 John에 의해 언급된 것처럼 접근 방식이 왜 문제가 되는지, 그리고 appdomain이 언로드되었을 때 스레드에서 작업을 우아하게 중단하는 방법에 대한 Phil Hack의 블로그를 읽을 가치가 있습니다.

이 작업을 수행할 윈도우즈 서비스를 생성할 수 있습니까?그런 다음 웹 서버에서 .NET 원격을 사용하여 Windows 서비스를 호출하여 작업을 수행하시겠습니까?만약 그런 경우라면 저는 그렇게 할 것입니다.

이렇게 하면 IIS에서 릴레이할 필요가 없어지고 일부 처리 능력이 제한됩니다.

그렇지 않다면 프로세스가 완료되는 동안 사용자를 강제로 앉힙니다.이렇게 하면 IIS에 의해 삭제되지 않고 완료될 수 있습니다.

IIS에서 장시간 실행되는 작업을 호스팅하는 지원되는 한 가지 방법이 있는 것 같습니다.Workflow Services는 특히 Windows Server AppFabric과 함께 이를 위해 설계된 것으로 보입니다.이 설계를 통해 장기간 실행되는 작업의 자동 지속성 및 재개를 지원함으로써 애플리케이션 풀 재활용이 가능합니다.

백그라운드에서 태스크를 실행할 수 있으며 요청이 종료된 후에도 태스크가 완료됩니다.발견되지 않은 예외가 발생하지 않도록 하십시오.일반적으로 항상 예외를 적용합니다.새 스레드에 예외가 발생하면 사용자가 더 이상 요청의 컨텍스트에 없기 때문에 IIS 작업자 프로세스 w3wp.exe가 충돌합니다.그러면 실행 중인 다른 백그라운드 작업뿐만 아니라 메모리 백업 세션을 사용하는 경우 실행 중인 다른 백그라운드 작업도 모두 삭제됩니다.이것은 진단하기 어려울 것이고, 이것이 그 관행이 낙담하는 이유입니다.

비동기 작업을 실행하기 위해 대리 프로세스를 생성하면 됩니다. Windows 서비스일 필요는 없습니다(대부분의 경우 이 방법이 더 최적의 방법이지만). MSMQ는 너무 많습니다.

언급URL : https://stackoverflow.com/questions/536681/can-i-use-threads-to-carry-out-long-running-jobs-on-iis

반응형