다음을 통해 공유


호스팅 Windows 워크플로 파운데이션 소개

 

무스타파 칼릴 아메드
프로그램 관리자
Microsoft Corporation

2006년 8월

적용 대상:
   Windows Workflow Foundation
   Microsoft .NET Framework 2.0
   Microsoft .NET Framework 3.0

요약: WF(Windows Workflow Foundation)를 호스팅하는 애플리케이션이 실행 중인 워크플로를 관리하고 모니터링하는 방법에 대한 개요를 제공하고 런타임 서비스 및 기본 구현에 대한 개요를 제공합니다. 독자는 Microsoft .NET Framework, C#및 WF 프로그래밍 모델을 잘 알고 있어야 합니다. (16페이지 인쇄)

콘텐츠

소개
워크플로 인스턴스 수명 주기 관리
관리 효율성 및 모니터링
안정성 및 고가용성
기본 런타임 서비스
결론
참조 항목

소개

이 문서는 WF(Windows Workflow Foundation)를 사용하여 애플리케이션이 실행 중인 워크플로 인스턴스를 관리하고 모니터링할 수 있도록 하는 데 사용할 수 있는 다양한 옵션을 이해하는 데 도움이 되는 개발자를 위한 것입니다. 이 문서에서는 독자가 Microsoft .NET Framework, C#및 WF에 대한 기본적인 이해를 가지고 있다고 가정합니다.

WF는 활동 라이브러리와 프레임워크, 런타임 엔진 및 호스트 애플리케이션 프로세스 내에서 실행되어야 하는 런타임 서비스 구성 요소로 구성됩니다. 워크플로는 런타임 엔진에서 실행되는 작업 집합으로 생성됩니다. 런타임 엔진은 호스트 애플리케이션 프로세스 내에서 실행되어야 합니다. 다음 그림에서는 워크플로, 활동 및 워크플로 런타임 엔진이 모두 호스트 응용 프로그램을 사용하여 프로세스에서 호스팅되는 방식을 보여 줍니다.

Aa663362.hostingwwf01(en-us,MSDN.10).jpg

그림 1. Windows Workflow Foundation 호스트 프로세스

WF는 워크플로 실행 및 상태 관리를 담당하는 런타임 엔진을 제공합니다. WF 런타임은 ASP.NET, Windows 서비스, 콘솔 애플리케이션 및 Windows Forms 애플리케이션을 비롯한 모든 .NET 프로세스에서 호스트될 수 있습니다. 개발자는 워크플로 지원 애플리케이션을 빌드할 때 이 호스트 프로세스를 작성할 책임이 있습니다. 런타임 서비스는 호스트 프로세스에서 작동하여 워크플로 실행을 관리할 때 런타임 엔진에 추가 기능을 제공합니다.

WF용 호스트 애플리케이션을 구현할 때 고려해야 할 많은 문제가 있습니다. 이 문서에서는 호스트 애플리케이션이 워크플로를 관리하고 모니터링하는 방법에 대한 개요와 기본 런타임 서비스 및 기본 구현에 대한 요약을 제공합니다.

워크플로 인스턴스 수명 주기 관리

WF는 WorkflowInstance 클래스에서 기본 작업 및 제어 작업 메서드를 제공하여 워크플로 상태 및 수명 주기를 관리합니다. 워크플로 인스턴스 수명 주기 관리 섹션에서는 다양한 워크플로 instance 특정 런타임 이벤트 및 해당 이벤트와 워크플로 상태와의 관계 간의 전환에 대해 설명합니다.

지속성 포인트

워크플로는 사용자 또는 다른 시스템의 입력이 계속되기를 기다리며 자주 장기 실행되고 효과적으로 유휴 상태입니다. 유휴 워크플로를 메모리에 보관하는 것은 불가능하기 때문에 워크플로가 대기 중인 이벤트를 받을 때까지 워크플로 instance 상태를 스토리지 매체에 유지하는 것이 좋습니다. 또한 워크플로 instance 상태를 저장하면 프로세스의 뒷부분에서 오류가 발생하는 경우 해당 시점부터 워크플로를 다시 시작하는 데 도움이 됩니다.

그림 2에서는 지속성 지점을 사용하여 워크플로 인스턴스 실행을 다시 시작하는 방법을 설명합니다.

Aa663362.hostingwwf02(en-us,MSDN.10).jpg

그림 2. 지속성 지점을 사용하여 워크플로 인스턴스 실행 다시 시작

워크플로 instance 상태가 지점 B에서 유지되고 C 지점에서 오류가 발생하는 경우 애플리케이션은 지점 A와 B 간에 수행된 작업을 잃지 않고 지점 B에서 워크플로 instance 다시 시작할 수 있습니다. 그러나 지속성 서비스를 사용할 수 없거나 워크플로 instance 상태가 유지되지 않으면 A 지점에서 B 지점으로 수행된 작업이 손실됩니다.

WorkflowPersistenceService가 있는 경우(즉, WorkflowRuntime instance 추가됨) 워크플로 런타임 엔진은 이 서비스를 사용하여 워크플로 instance 상태를 스토리지 매체에 유지합니다. 이 문제는 다음 지점에서 발생할 수 있습니다.

  • PersistOnCloseAttribute로 표시된 작업 완료 시(예: 트랜잭션 scope 활동)
  • 워크플로 instance 완료 전
  • 워크플로 instance 종료 전
  • 워크플로가 유휴 상태가 되는 경우
  • WorkflowInstance.Unload 또는 WorkflowInstance.TryUnload가 호출되는 경우

WF 런타임 엔진은 WorkflowPersistenceService에서 SaveWorkflowInstanceState() 메서드를 호출하여 워크플로 instance 상태를 저장합니다. LoadWorkflowInstanceState() 메서드를 호출하여 필요할 때 워크플로 instance 지속형 상태를 검색합니다. 워크플로 런타임은 지속성을 수행할 시기와 관련된 모든 의미 체계를 처리하며 지속성 서비스는 워크플로 instance 실제 저장 및 로드를 담당합니다. 활동 상태 및 워크플로 instance ID는 직렬화되어 지속성 저장소에 저장됩니다. 또한 워크플로 instance 실행을 다시 시작하는 데 필요한 다른 모든 정보(예: 큐)는 직렬화된 저장된 상태에 포함됩니다.

워크플로 인스턴스 이벤트

워크플로 instance 생성됨, 실행 중, 일시 중단됨, 완료됨 및 종료됨의 5가지 상태 중 하나일 수 있습니다. 워크플로에는 워크플로 instance 수명 동안 발생하는 13개의 이벤트가 있습니다. 이러한 이벤트는 다른 상태로의 전환을 나타낼 수 있습니다. 예를 들어 WorkflowCompleted 이벤트는 instance 실행 중에서 완료됨으로 전환되었음을 나타냅니다. 일부 이벤트는 instance 다른 상태로 전환되었음을 나타내지 않습니다. 예를 들어 WorkflowPersisted 이벤트는 instance 지속되지만 여전히 실행 중 상태임을 나타냅니다. 이러한 13개 이벤트 중 11개는 런타임 이벤트 및 추적 워크플로 이벤트를 통해 호스트 애플리케이션에 전달됩니다. 변경됨 및 예외의 두 이벤트는 추적 워크플로 이벤트를 통해서만 호스트 애플리케이션에 전달됩니다.

WF는 호스트 애플리케이션이 워크플로 수명 주기를 관리할 수 있도록 WorkflowInstance 클래스에서 제어 작업 메서드를 제공합니다. 또한 애플리케이션은 워크플로 수명 주기를 관리하는 정책을 설정할 수 있습니다. 예를 들어 애플리케이션에는 워크플로 instance 언로드하도록 WF 엔진에 지시하는 언로드 정책이 있을 수 있습니다. WF는 워크플로 instance 통계에 영향을 줄 수 있는 기본 제공 활동을 제공합니다. 예를 들어 SuspendActivityTerminateActivity 활동을 사용하여 워크플로 instance 각각 일시 중단 및 종료할 수 있습니다. 다음 섹션에서는 워크플로 런타임에서 워크플로 instance 이벤트 및 워크플로 instance 통계 전환을 전달하기 위해 발생하는 다양한 워크플로 instance 특정 이벤트에 대해 설명합니다.

WorkflowAborted

워크플로 instance 워크플로 런타임 엔진이 메모리 내 instance 버릴 때 중단된 것으로 간주됩니다. 호스트 애플리케이션은 WorkflowInstance.Abort()를 호출하여 워크플로 instance 중단할 수 있습니다. 중단된 워크플로 인스턴스는 WorkflowInstance.Resume()을 호출하여 마지막 지속성 지점에서 다시 시작할 수 있습니다. 워크플로 instance 중단은 애플리케이션이 마지막 지속성 지점에서 워크플로Instance.Abort()가 호출될 때까지 수행된 모든 작업을 취소하기로 결정하는 극단적인 상황에서 사용됩니다.

WorkflowCompleted

instance 실행이 완료되면 워크플로 instance 완료됩니다. 이때 호스트 애플리케이션은 워크플로 instance 사용하지 않은 메시지 및 기타 이벤트에 대한 큐를 검사할 수 있습니다.

워크플로만들기

워크플로는 instance 완전히 생성되지만 작업이 실행되기 전에 만들어집니다. 워크플로 instance 여러 WorkflowRuntime.CreateWorkflow() 오버로드된 메서드를 호출하여 만듭니다.

WorkflowIdled

워크플로 instance 외부 이벤트(타이머, 메시지 또는 기타 사용자 지정 이벤트)가 계속 실행되기를 기다리는 동안 유휴 상태입니다. 시스템 리소스를 저장하기 위해 애플리케이션은 유휴 상태일 때 메모리에서 워크플로 instance 언로드하도록 언로드 정책을 설정할 수 있습니다. 호스트 애플리케이션이 기본 SqlWorkflowPersistenceService를 사용하는 경우 애플리케이션 구성 파일에서 UnloadOnIdle 플래그를 설정하여 instance 유휴 상태일 때 워크플로 상태를 유지하도록 WF 런타임 엔진에 지시할 수 있습니다.

WorkflowLoaded

WorkflowLoaded 이벤트는 instance 상태가 지속성 저장소에서 메모리에 로드될 때 발생합니다.

WorkflowPersisted

기본 제공 SqlWorkflowPersistenceService 또는 사용자 지정 지속성 서비스가 WorkflowRuntime instance 추가된 경우 워크플로 instance 상태가 지속성 저장소에 저장될 때 워크플로 instance 유지됩니다.

WorkflowResumed

워크플로 instance 일시 중단되거나 중단된 워크플로 instance WorkflowInstance.Resume()이 호출될 때 다시 시작됩니다.

WorkflowStarted

WorkflowStarted 이벤트는 WorkflowInstance.Start()가 호출될 때 발생합니다. 워크플로 시작 이벤트는 워크플로 런타임 엔진이 워크플로 작업 실행을 시작하기 전에 발생합니다.

WorkflowSuspended

워크플로 instance 일시 중단은 WorkflowInstance.Suspend() 호출을 통해 또는 SuspendActivity 작업이 실행되면 수행됩니다. 결과적으로 워크플로 instance 일시 중단된 상태입니다.

WorkflowTerminated

워크플로 instance 종료는 WorkflowInstance.Terminate() 호출, TerminateActivity 작업이 실행되거나 실행 중인 워크플로 instance 처리되지 않은 예외가 발생할 때 수행됩니다. 이 이벤트가 발생한 후 워크플로 instance 종료된 상태입니다.

WorkflowUnloaded

WorkflowUnloaded 이벤트는 워크플로 instance 메모리에서 지속성 저장소로 언로드될 때 발생합니다. 이 작업은 지속성 정책에 따라 또는 WorkflowInstance.Unload() 또는 WorkflowInstance.TryUnload()에 대한 호출을 통해 수행됩니다.

워크플로 인스턴스 이벤트 전환

워크플로 instance 이벤트는 워크플로 런타임 이벤트 및 추적 워크플로 이벤트를 통해 호스트에 전달됩니다. 호스트 애플리케이션은 런타임 이벤트를 구독하거나 추적 서비스를 사용하여 알림을 받을 수 있습니다. 예외 및 변경된 이벤트는 추적 서비스를 통해서만 호스트 애플리케이션에 전달됩니다. Exception 이벤트는 워크플로 instance 실행하는 동안 예외가 발생했음을 나타냅니다. Changed 이벤트는 실행하는 동안 워크플로 instance 동적으로 업데이트되었음을 나타냅니다.

그림 3에서는 다양한 워크플로 이벤트와 워크플로 상태 간의 전환을 보여 줍니다.

더 큰 이미지를 보려면 여기.

그림 3. 워크플로 이벤트와 상태 간 전환(이미지를 클릭하여 확대)

지속성 서비스를 사용하도록 설정하면 그림 3과 같이 지속성 지점이 발생합니다. 해당 호스트 애플리케이션에는 해당되는 경우 WorkflowPersisted, WorkflowUnloadedWorkflowLoaded 이벤트가 표시되어야 합니다. 워크플로 instance 메모리에 없는 지속성 서비스를 사용하는 경우 instance 유효한 작업(다시 시작, 중단, 종료 등)으로 인해 워크플로 instance 먼저 로드된 다음 요청을 계속 수행합니다. 예를 들어 일시 중단되었지만 언로드된 워크플로가 instance 경우 Resume을 호출하면 먼저 로드된 다음 다이어그램에 표시된 대로 Resumed 이벤트를 계속 발생합니다.

워크플로 인스턴스 작업

앞에서 설명한 대로 WorkflowInstance 클래스에는 워크플로 instance 수명 주기를 제어하는 메서드가 있습니다. 이 섹션에서는 이러한 메서드에 대해 설명합니다.

WorkflowInstance.Start()

만든 워크플로 instance 실행을 시작합니다. WorkflowInstance.Start()는 워크플로 런타임이 WorkflowStarted 이벤트를 발생시키고 워크플로 instance 실행 중 상태입니다. 이미 시작된 워크플로 instance Start()가 호출되면 InvalidOperationException이 throw됩니다.

WorkflowInstance.Abort()

워크플로 인스턴스를 중단합니다. 중단이 성공하면 워크플로 런타임이 WorkflowAborted 이벤트를 발생합니다.

WorkflowInstance.Load()

지속성 저장소에서 메모리로 언로드된 워크플로 instance 로드합니다. 그런 다음 instance 언로드되기 전의 상태에서 실행이 예약됩니다. 로드에 성공하면 워크플로 런타임이 WorkflowLoaded 이벤트를 발생합니다.

WorkflowInstance.Resume()

일시 중단되거나 중단된 워크플로 instance 다시 시작(계속 실행)합니다. 워크플로 런타임은 워크플로 instance 실행이 다시 시작되기 직전에 WorkflowResumed 이벤트를 발생합니다.

WorkflowInstance.Suspend()

워크플로 instance 실행을 일시 중단합니다. WorkflowInstance.Suspend()에 대한 호출이 성공하면 워크플로 런타임은 WorkflowSuspended 이벤트를 발생합니다.

WorkflowInstance.Terminate()

워크플로 instance 종료하고 메모리 내 워크플로 instance 지웁니다. 워크플로 런타임은 등록된 지속성 서비스에 워크플로 instance 메모리에서 지워졌는지 알 수 있습니다. SqlWorkflowPersistenceService의 경우 이는 해당 워크플로 instance 대한 모든 상태 정보가 종료 시 데이터베이스에서 삭제됨을 의미합니다. 이전에 저장된 지속성 지점에서 워크플로 instance 다시 로드할 수 없습니다. WorkflowInstance.Terminate()가 성공하면 워크플로 런타임은 WorkflowTerminated 이벤트를 발생합니다.

WorkflowInstance.Unload()

메모리의 워크플로 인스턴스를 지속성 저장소로 언로드합니다. WorkflowInstance.Unload() 는 동기적입니다. 언로드를 성공적으로 수행하기 위해 현재 예약된 작업이 완료되거나 트랜잭션 scope 종료될 때까지 차단됩니다. WorkflowInstance.Unload()가 성공하면 워크플로 런타임은 WorkflowUnloaded 이벤트를 발생합니다. 등록된 지속성 서비스가 없을 때 Unload()가 호출되면 InvalidOperationException이 throw됩니다.

WorkflowInstance.TryUnload()

WorkflowInstance.Unload()와 달리 WorkflowInstance.TryUnload()는 워크플로를 언로드할 수 있을 때까지 차단되지 않습니다. WorkflowInstance.TryUnload()는 메모리에서 지속성 저장소로 워크플로 instance 언로드하고 instance 일시 중단되거나 유휴 상태일 때 true를 반환합니다. 그렇지 않으면 호출이 false를 반환 합니다. 등록된 지속성 서비스가 없을 때 TryUnload()가 호출되면 InvalidOperationException이 throw됩니다.

WorkflowInstance의 다양한 제어 메서드에 대한 자세한 내용은 Windows Foundation SDK를 참조하세요.

관리 효율성 및 모니터링

워크플로를 호스트하는 애플리케이션은 호스트하고 실행하는 워크플로를 관리하고 모니터링합니다. WF는 다양한 관리 효율성 및 모니터링 도구를 지원합니다. 예를 들어 WF는 낮은 수준의 디버깅에 사용할 수 있는 엔드 투 엔드 추적을 제공하고 워크플로 데이터 추출 및 모니터링을 위한 인프라를 추적합니다.

이 섹션에서는 현재 위치의 관리 효율성 및 모니터링 인프라와 호스트 애플리케이션에서 인프라를 사용하는 방법에 대해 설명합니다.

추적

WF는 워크플로 인스턴스가 실행되는 동안 워크플로, 활동 및 사용자 이벤트 및 데이터를 캡처하기 위한 추적 인프라를 제공합니다. 모든 워크플로 런타임 instance 등록된 추적 서비스가 여러 개 있거나 없을 수 있습니다. 추적 정보는 등록된 추적 서비스로 전송됩니다. 추적 서비스는 호스트 애플리케이션의 요구 사항에 따라 이 정보를 저장하고 처리해야 합니다. WF는 호스트 애플리케이션에서 사용할 수 있는 기본 SQL 기반 추적 서비스(SqlTrackingService)를 제공합니다. 또한 호스트 애플리케이션 개발자는 자체 사용자 지정 추적 서비스를 작성하고 호스트 애플리케이션에 사용할 수 있습니다.

추적을 사용하여 워크플로 instance 실행 기록을 검사하고 시스템에서 실행되는 워크플로 인스턴스의 현재 상태를 확인할 수 있습니다. 또한 추적은 워크플로 정의와 함께 사용하여 시스템에서 실행되는 워크플로 인스턴스의 향후 예상 실행 경로를 예측할 수 있는 정보를 제공할 수 있습니다. WF는 기본 제공 SqlTrackingService 및 워크플로 디자이너 컨트롤을 사용하여 완료되고 현재 실행 중인 워크플로에 대한 워크플로 및 활동 상태 정보를 표시하는 애플리케이션 샘플인 워크플로 모니터 샘플을 제공합니다.

추적을 사용하여 워크플로를 모니터링하는 방법에 대한 자세한 내용은 애플리케이션 샘플/ 워크플로 모니터 샘플의 워크플로 모니터 SDK 도구를 참조하세요. 사용자 지정 추적 서비스를 빌드하는 방법을 보여 주는 예제는 기술 샘플/추적의 ConsoleTrackingService 샘플및 파일 추적 서비스 및 쿼리 샘플을 참조하세요. 기본 제공 SqlTrackingService를 사용하는 방법을 보여 주는 예제는 기술 샘플/Trackingout-of-box의 SQLTrackingService 샘플을 사용하여단순 추적 샘플 및 쿼리를 참조하세요.

추적 및 엔드 투 엔드 추적

추적을 사용하여 애플리케이션의 상태를 모니터링하고 실행 중인 시스템을 방해하지 않고 문제를 격리하고 해결할 수 있습니다. WF는 System.Diagnostics API를 사용하여 규칙 집합 평가 정보를 포함하여 워크플로 런타임 및 워크플로 instance 실행에 대한 정보를 추적합니다. 기본적으로 추적은 꺼져 있지만 원하는 경우 켤 수 있습니다.

또한 WF는 엔드 투 엔드 추적에 참여합니다. 엔드 투 엔드 추적 기능을 사용하면 추적 뷰어에서 다양한 구성 요소의 연속 추적 정보와 해당 구성 요소 간의 전환을 볼 수 있습니다. 이렇게 하면 엔드 투 엔드 디버깅이 용이합니다.

애플리케이션 구성 파일을 사용하는 경우 다음을 추가하여 여러 WF 네임스페이스에 대한 로깅 추적을 사용하도록 설정해야 합니다.

<system.diagnostics>
    <switches>
        <add name="System.Workflow LogToTraceListeners" value="1" />
        <add name="System.Workflow.Runtime" value="All" />
        <add name="System.Workflow.Runtime.Hosting" value="All" />
        <add name="System.Workflow.Runtime.Tracking" value="All" />
        <add name="System.Workflow.Activities" value="All" />
        <add name="System.Workflow.Activities.Rules" value="All" />
    </switches>
</system.diagnostics> 

LogToTraceListeners를 사용하는 경우 WF는 호스트 애플리케이션 내에서 만든 각 TraceListener를 열거하고 모든 로깅 정보를 보냅니다. 예제의 나머지 줄을 사용하면 로깅 정보를 캡처할 네임스페이스와 추적되는 정보의 양을 지정할 수 있습니다. 값 특성에 사용할 수 있는 값에는 All, Off, Critical, Error, Warning, Information 및 Verbose가 포함됩니다. 값 특성 사용에 대한 자세한 내용은 WF SDK를 참조하세요.

워크플로 런타임 이벤트

런타임 이벤트는 워크플로 런타임에 의해 발생하며 호스트 애플리케이션에 워크플로 런타임 및 워크플로 인스턴스의 수명 주기를 관리하는 수단을 제공합니다. 이벤트 처리기는 WorkflowRuntime 클래스에 정의되며 호스트 애플리케이션은 해당 이벤트를 구독하여 사용해야 합니다.

런타임 이벤트는 호스트 애플리케이션이 쿼리를 위해 해당 이벤트 및 관련 데이터를 저장하지 않고 특정 이벤트에 대해 작동해야 하는 경우 간단한 알림 시스템 역할을 합니다. 후자의 경우 추적 인프라를 사용하는 것이 좋습니다.

WorkflowRuntime의 instance 여러 워크플로 인스턴스를 실행하고 있을 수 있습니다. 각 워크플로 instance 고유한 수명 주기가 있습니다. 따라서 워크플로 instance 이벤트에 대한 이벤트 인수에는 워크플로 instance ID 및 기타 정보가 포함됩니다. 이 정보는 워크플로 런타임이 이 이벤트를 발생시키는 워크플로 instance 이벤트를 상호 연결하는 데 사용할 수 있습니다.

다음 섹션에서는 사용 가능한 워크플로 런타임 이벤트에 대해 설명합니다.

WorkflowRuntime.ServiceExceptionNotHandled

이 이벤트는 서비스 소유 스레드가 예외를 throw할 때 발생합니다. WorkflowRuntimeService 클래스에서 파생된 서비스는 RaiseServicesExceptionNotHandledEvent() 메서드를 호출하여 구독자에게 실행 중에 예외가 발생했으며 이 예외를 처리할 수 없음을 ServicesExceptionNotHandled 이벤트에 알릴 수 있습니다. 기본 제공 서비스는 이러한 조건에서 이 이벤트를 발생합니다. 호스트 애플리케이션은 이 이벤트를 구독하여 복구 메커니즘을 구현할 수 있습니다. 이 이벤트와 연결된 이벤트 인수는 ServicesExceptionNotHandledEventArgs입니다.

WorkflowRuntime.Started

이 이벤트는 WorkflowRuntime의 지정된 instance 시작될 때 발생합니다. 이 이벤트와 연결된 이벤트 인수는 WorkflowRuntimeEventArgs입니다.

WorkflowRuntime.Stopped

이 이벤트는 WorkflowRuntime의 지정된 instance 중지될 때 발생합니다. 이 이벤트와 연결된 이벤트 인수는 WorkflowRuntimeEventArgs입니다.

표 1. WorkflowInstanceEvents

이벤트 Description 이벤트 인수
WorkflowAborted 워크플로 instance 중단될 때 발생합니다. WorkflowEventArgs
WorkflowCompleted 워크플로 instance 완료될 때 발생합니다. WorkflowCompletedEventArgs
워크플로만들기 워크플로 instance 완전히 생성되었지만 작업이 처리되기 전에 발생합니다. 즉, 워크플로가 실행되기 전에 발생합니다. WorkflowEventArgs
WorkflowIdled 워크플로 instance 유휴 상태가 되면 발생합니다. 즉, 워크플로 instance 외부 이벤트(예: 타이머, 메시지 등)가 실행을 계속하기를 기다리고 있습니다. WorkflowEventArgs
WorkflowLoaded 워크플로 instance 일반적으로 지속성 저장소에서 메모리에 로드될 때 발생합니다. WorkflowEventArgs
WorkflowPersisted 워크플로 instance 유지될 때 발생합니다. WorkflowEventArgs
WorkflowResumed 워크플로 instance 다시 시작될 때 발생합니다(일반적으로 일시 중단됨 또는 중단된 상태에서 발생). WorkflowEventArgs
WorkflowStarted 워크플로 instance 실행이 시작될 때 발생합니다. WorkflowEventArgs
WorkflowSuspended 워크플로 instance 일시 중단될 때 발생합니다. WorkflowSuspendedEventArgs
WorkflowTerminated 워크플로 instance 종료될 때 발생합니다. WorkflowTerminatedEventArgs
WorkflowUnloaded 워크플로 instance 메모리에서 지속성 저장소로 언로드될 때 발생합니다. WorkflowEventArgs

다양한 이벤트 및 워크플로가 다양한 상태로 들어가는 방법에 대한 자세한 내용은 이 문서의 앞부분에 있는 "워크플로 수명 주기 관리" 섹션을 참조하세요.

다양한 워크플로 런타임 이벤트를 사용하는 방법에 대한 자세한 내용은 Windows Workflow Foundation SDK 샘플을 참조하세요.

성능 카운터

Windows 성능 도구를 사용하여 워크플로 성능을 모니터링할 수 있습니다. 시스템 모니터와 성능 로그 및 경고의 두 부분으로 구성됩니다. 성능 로그 및 경고를 통해 성능 데이터를 기록하도록 성능 카운터를 구성하고 지정된 카운터의 값이 정의된 임계값보다 높거나 낮을 때 알리도록 시스템 경고를 설정할 수 있습니다.

WF는 워크플로의 성능을 추적하는 데 사용할 수 있는 WF 성능 개체와 함께 성능 카운터 집합을 제공합니다. 성능 카운터의 전체 목록은 WF SDK의 워크플로 성능 카운터 섹션을 참조하세요.

성능 도구에 성능 카운터를 추가하는 방법에 대한 자세한 내용은 Microsoft TechNet 웹 사이트를 참조하세요.

정책 언로드

시스템에는 지정된 시간에 수천 개의 워크플로가 동시에 실행되고 있을 수 있습니다. 모든 메모리에 남아 있도록 하는 것은 비실용적일 수 있습니다. 시스템의 리소스를 더 잘 관리하려면 워크플로 상태를 유지하도록 언로드 정책을 설정하고 메모리에서 언로드할 수 있습니다.

WF는 기본 제공 지속성 서비스를 사용하는 경우 유휴 정책에 대한 언로드를 제공합니다. SqlWorkflowPersistenceService 클래스에서 UnloadOnIdle 속성을 설정하여 런타임 엔진이 유휴 상태일 때 워크플로를 언로드하도록 지시할 때 정책이 활성화됩니다. 호스트 애플리케이션이 구성 파일을 통해 SqlWorkflowPersistenceService 를 사용하도록 설정하는 경우 UnloadOnIdle 플래그를 true로 설정하여 이 작업을 수행할 수 있습니다. SqlWorkflowPersistenceService가 코드를 통해 생성되고 사용하도록 설정된 경우 호스트 애플리케이션은 SqlWorkflowPersistenceService(String, Boolean, TimeSpan, TimeSpan) 생성자를 사용하여 구성해야 합니다. 호스트 애플리케이션은 다른 복잡한 언로드 정책을 구현할 수 있습니다.

또한 WorkflowInstance.Unload() 메서드를 호출하여 메모리에서 이 특정 워크플로 instance 언로드하고 상태를 유지하도록 요청할 수 있습니다. 호스트 애플리케이션은 나중에 인스턴스에서 Load() 메서드를 호출하여 마지막 지속성 지점에서 계속 실행할 수 있습니다. 워크플로 인스턴스가 언로드되면 런타임 이벤트인 WorkflowUnloaded 이벤트가 발생합니다.

안정성 및 고가용성

WF는 다음과 같은 지원을 제공하여 안정적이고 고가용성으로 선택하는 호스트를 지원합니다.

SQL 클러스터링

기본 제공 SQL 기반 서비스는 클러스터링 설치를 지원합니다. WF 기본 제공 SQL 기반 서비스는 SQL Server 위해 일괄 처리를 커밋할 때 재시도를 제공합니다. 따라서 장애 조치(failover) 시나리오 또는 일시적으로 액세스할 수 없는 SQL 서버를 지원합니다. 재시도 논리는 다음 서비스의 조합으로 설정할 수 있습니다.

  • DefaultWorkflowCommitWorkBatchService
  • SharedConnectionWorkflowCommitWorkBatchService
  • SqlTrackingService
  • SqlWorkflowPersistenceService

기본적으로 재시도 논리는 OFF입니다. 호스트 애플리케이션은 기능을 사용하려면 다시 시도 논리를 명시적으로 켜야 합니다. 애플리케이션은 서비스당 또는 이전에 언급한 모든 서비스에서 재시도를 사용하도록 선택할 수 있습니다. 서비스 클래스에서 EnableRetries 속성을 설정하거나 구성 파일을 통해 이 작업을 수행할 수 있습니다. 구성 파일을 사용하면 호스트 애플리케이션에서 공유 플래그 EnableRetries를 사용하여 영향을 받는 모든 서비스에서 다시 시도 사용을 ON 또는 OFF로 설정할 수 있습니다. EnableRetries 속성이 서비스에 설정된 경우 해당 값은 EnableRetries 공유 플래그 값을 덮어씁니다. WF 기본 제공 SQL 기반 서비스는 일정한 횟수만큼 다시 시도합니다. 재시도 횟수는 구성할 수 없습니다. 그러나 애플리케이션은 서비스의 연결 문자열에서 연결 시간 초과를 조정하여 재시도 사이의 시간을 부분적으로 조정할 수 있습니다.

다시 시도 설정

다음 예제에서는 일반 매개 변수 EnableRetries를 추가하고 해당 값을 True로 설정하여 모든 기본 제공 서비스에 대해 EnableRetries를 설정하는 방법을 보여 줍니다. 이 서비스에 대해 EnableRetries 플래그를 추가하고 False로 설정하여 SqlWorkflowPersistenceService에 대해 EnableRetries를 사용하지 않도록 설정하는 방법을 보여 줍니다.

<WorkflowRuntime Name="SampleApplication" UnloadOnIdle="false">
    <CommonParameters>
        <add name="ConnectionString" value="Initial Catalog=WorkflowStore;Data Source=localhost;Integrated Security=SSPI;" />
        <add name="EnableRetries" value="True" />
    </CommonParameters>
    <Services>
        <add type="System.Workflow.Runtime.Hosting.SqlWorkflowPersistenceService, 
System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, 
PublicKeyToken=31bf3856ad364e35" EnableRetries="False"  />
    </Services>
</WorkflowRuntime>

일반적으로 모든 서비스에 대한 재시도를 ON 또는 OFF로 설정하는 것이 좋습니다.

WorkflowCommitWorkBatchService 클래스는 모든 비 TransactionScopeActivity 작업의 관련 일괄 처리 커밋(지속성 지점)을 다시 시도해야 합니다. WorkflowCommitBatchService 클래스는 TransactionScopeActivity 활동에 대한 작업 일괄 처리 커밋의 재시도를 수행할 수 없습니다. 이 경우 트랜잭션을 시작하지 않았기 때문에 트랜잭션을 소유하지 않기 때문입니다. TransactionScopeActivity 활동에 대한 작업 일괄 처리 커밋의 재시도는 워크플로로 모델링되어야 합니다. 일반적으로 TransactionScopeActivity 외부의 while 루프 및 예외 처리기 형식으로 수행됩니다.

트랜잭션이 아닌 모드에서 실행되고 기본 제공 SqlWorkflowPersistenceService가 작업 일괄 처리 커밋과 관련이 없는 SQL 관련 작업을 제어하는 경우 기본 제공 SqlTrackingService에서 다시 시도합니다. 여기에는 만료된 타이머 확인 및 워크플로 인스턴스 로드가 포함됩니다.

부하 분산 및 Front-End 크기 조정

WF를 호스팅하는 애플리케이션은 부하 분산 시나리오 및 프런트 엔드 크기 조정 시나리오를 관리합니다. WF는 엔진 및 기본 제공 SQL 기반 서비스를 지원하여 다른 호스트 애플리케이션 인스턴스가 동일한 지속성 또는 추적 SQL 데이터베이스를 가리킬 수 있도록 합니다.

여러 호스트 애플리케이션이 동일한 지속성 저장소에 연결된 경우 데이터베이스에서 워크플로 instance 형식을 로드할 수 있습니다. WF 기본 제공 SqlWorkflowPersistenceService 는 동일한 지속성 저장소를 공유할 때 특정 호스트에 로드할 워크플로 유형 또는 인스턴스 할당을 지원하지 않습니다. 이 동작이 호스트 애플리케이션 요구 사항을 충족하지 않는 경우 사용자 지정 지속성 서비스를 구현해야 합니다.

WF 런타임 엔진은 여러 호스트 애플리케이션이 동일한 지속성 저장소를 사용하는 경우 프런트 엔드 크기 조정 시나리오를 지원하는 잠금 의미 체계를 제공합니다. 잠금 의미 체계를 사용하면 애플리케이션이 다른 애플리케이션에서 이미 로드한 워크플로 instance 로드할 수 없게 됩니다. WorkflowPersistenceService 클래스를 사용하면 워크플로 instance 상태 정보를 데이터 저장소에서 잠금 해제할지 여부를 지정하는 SaveWorkflowInstanceState() 메서드에 매개 변수를 제공하고 이전에 잠긴 워크플로 상태 정보의 잠금을 해제하는 UnlockWorkflowInstanceState() 메서드를 제공하여 이 워크플로 런타임 엔진 기능을 지원할 수 있습니다. 잠금을 구현하는 지속성 서비스에서 LoadWorkflowInstanceState() 메서드를 호출하면 워크플로 instance 대한 상태 정보를 잠급니다.

워크플로 instance 잠금 의미 체계에 대한 자세한 내용은 WF 프로그래밍 가이드의 Windows 워크플로 지속성 서비스사용자 지정 지속성 서비스 만들기 섹션을 참조하세요.

기본 런타임 서비스

WF 런타임 엔진은 런타임 서비스를 사용하여 워크플로를 실행합니다. 런타임 서비스 모델은 호스트 애플리케이션에 WF 런타임 엔진에 다양한 서비스를 제공할 수 있는 유연성을 제공합니다. 이 섹션에서는 WF에서 제공하는 런타임 서비스와 해당 서비스의 기본 구현에 대해 설명합니다.

런타임 서비스 구현에 대한 자세한 내용은 WF 프로그래밍 가이드의 Windows Workflow Foundation Services 및 Windows Workflow Foundation Services 개발 섹션을 참조하세요.

WF 런타임은 4개의 서비스를 제공합니다. 이러한 서비스에는 기본 구현이 있거나 호스트 애플리케이션이 자체 서비스를 구현하고 워크플로 런타임에 제공할 수 있습니다.

워크플로 트랜잭션 서비스

Windows 워크플로 트랜잭션 서비스(WorkflowCommitWorkBatchService)의 목적은 작업 일괄 처리의 약정( 지속성 지점이라고도 함)에 대한 사용자 지정 논리를 사용하도록 설정하는 것입니다. 작업 일괄 처리가 커밋되면 런타임은 현재 트랜잭션 서비스를 호출하고 호출할 대리자를 전달하여 작업 일괄 처리의 실제 커밋을 수행합니다. 런타임에서 여전히 커밋을 수행해야 하지만 서비스가 프로세스에 스스로 삽입되도록 두면 커밋 프로세스를 중심으로 사용자 지정을 수행할 수 있습니다.

WF 프레임워크는 외부에서 워크플로 instance 자체 트랜잭션을 가져오는 기능을 지원하지 않습니다. WorkflowCommitWorkBatchService에서 지원하는 유일한 유형의 앰비언트 트랜잭션은 워크플로 instance 시작된 트랜잭션입니다. 워크플로 런타임을 실행하는 호스트 애플리케이션에서 시작된 앰비언트 트랜잭션은 부작용을 줄이기 위해 현재 스레드에서 일시적으로 제거됩니다. 워크플로가 유휴 상태이면 에 포함된 호스트 애플리케이션 원래 앰비언트 트랜잭션이 스레드에 다시 배치됩니다.

WF는 트랜잭션 서비스에 대한 두 가지 기본 구현인 DefaultWorkflowCommitWorkBatchServiceSharedConnectionWorkflowCommitWorkBatchService를 제공합니다.

WF 런타임 엔진에는 워크플로 트랜잭션 서비스가 필요합니다. 기본적으로 DefaultWorkflowCommitWorkBatchService를 사용합니다. 호스트 애플리케이션은 DefaultWorkflowSchedulerServiceSharedConnectionDefaultWorkflowCommitWorkBatchService 또는 사용자 지정 서비스로 바꾸도록 선택할 수 있습니다.

DefaultWorkflowCommitWorkBatchService

워크플로 런타임 엔진이 시작되면 다른 트랜잭션 서비스가 추가되지 않으면 DefaultWorkflowCommitWorkBatchService의 instance 만들어지고 WorkflowRuntime에 추가됩니다. 이 서비스는 각 데이터베이스 연결에 대한 .NET Framework 트랜잭션을 만듭니다. 예를 들어 SQL 추적 서비스와 SQL 지속성 서비스 간의 연결은 공유되지 않습니다. 워크플로에서 이 서비스를 사용하여 데이터 무결성에 필요한 트랜잭션을 지원할 수 있습니다.

SharedConnectionWorkflowCommitWorkBatchService

이 서비스는 서로 다른 개체 간에 공유 연결을 사용하는 데이터베이스 트랜잭션에 사용됩니다. 호스트 애플리케이션이 이 서비스를 사용하려는 경우 AddService 메서드를 사용하거나 구성 파일을 통해 WorkflowRuntime에 추가해야 합니다.

워크플로 스케줄러 서비스

워크플로 스케줄러 서비스는 워크플로 런타임 엔진이 워크플로 인스턴스를 비동기 또는 수동 동기 모드로 처리하는지 여부에 관계없이 워크플로 인스턴스를 예약하는 방법을 관리합니다. WF는 WorkflowSchedulerService에 대한 두 가지 기본 구현인 DefaultWorkflowSchedulerServiceManualWorkflowSchedulerService를 제공합니다.

WF 런타임 엔진은 워크플로를 실행하기 위해 워크플로 스케줄러 서비스가 필요합니다. 기본적으로 DefaultWorkflowSchedulerService를 사용합니다. 호스트 애플리케이션은 DefaultWorkflowSchedulerServiceManualWorkflowSchedulerService 또는 사용자 지정 서비스로 바꾸도록 선택할 수 있습니다.

DefaultWorkflowSchedulerService

DefaultWorkflowSchedulerService 는 워크플로 런타임 엔진에서 비동기 방식으로 워크플로 인스턴스를 실행하는 스레드를 만들고 관리하며 런타임 스레드 풀에 여러 워크플로 인스턴스를 큐에 대기시키는 기본 지원을 포함합니다. 다른 워크플로 스케줄러 서비스 instance WorkflowRuntime에 추가되지 않은 경우 기본적으로 DefaultWorkflowSchedulerService를 사용합니다.

ManualWorkflowSchedulerService

ManualWorkflowSchedulerService 는 워크플로 인스턴스의 동기 실행에 사용됩니다. 이 서비스를 사용하는 경우 워크플로 인스턴스는 호스트 애플리케이션의 호출 스레드에서 실행되므로 워크플로 instance 유휴 상태가 될 때까지 호스트 애플리케이션의 실행을 차단합니다.

워크플로 지속성 서비스

지속성 서비스는 워크플로 instance 상태를 저장하고 검색(로드 및 언로드)합니다. WF는 지속성 서비스의 기본 SQL 기반 구현인 SqlWorkflowPersistenceService를 제공합니다.

SqlWorkflowPersistenceService

이 기본 구현은 상태 및 타이머 정보를 SQL Server/MSDE에 저장합니다. SqlWorkflowPersistenceService는 워크플로 트랜잭션에 참여하고 잠금 액세스를 구현합니다. 또한 SqlWorkflowPersistenceService는 SQL 서버를 사용할 수 없을 때 다시 시도하도록 설정하는 기능을 제공합니다. 서비스에서 EnableRetries 속성을 설정하여 제어할 수 있습니다. SqlWorkflowPersistenceService에 대한 자세한 내용은 WF 프로그래밍 가이드를 참조하세요.

워크플로 추적 서비스

추적 서비스는 추적 프로필 및 추적 정보의 스토리지를 관리합니다. WF는 SqlTrackingService 클래스에 구현된 추적 서비스의 기본 SQL 기반 구현을 제공합니다.

SqlTrackingService

이 구현은 추적 프로필 및 데이터를 SQL Server/MSDE에 저장합니다. 서비스는 다음을 지원합니다.

  • 기본적으로 워크플로 트랜잭션에 참여합니다. 동작은 SqlTrackingService.IsTransactional 속성에 의해 제어됩니다.

  • 모든 형식에 기본 추적 프로필을 사용하거나 워크플로 유형 또는 워크플로 인스턴스당 연결 추적 프로필을 사용하는 메커니즘을 제공합니다.

  • 라이브 및 주문형 분할 기능을 제공하여 데이터 유지 관리를 지원합니다.

    데이터 유지 관리에 대한 자세한 내용은 WF 프로그래밍 가이드의 SqlTrackingService를 사용한 데이터 유지 관리 섹션에 제공됩니다.

또한 WF는 SqlTrackingService 에 저장된 추적 데이터를 쿼리하는 데 사용할 수 있는 SqlTrackingQuery API를 제공합니다. SqlTrackingService에 대한 자세한 내용은 WF 프로그래밍 가이드를 참조하세요.

결론

WF는 워크플로를 실행하고 상태를 관리하는 런타임 엔진 및 서비스를 제공합니다. 호스트 애플리케이션 또는 프로세스를 호스트 WF 워크플로에 기록해야 합니다. 이 호스트 애플리케이션은 워크플로 런타임 엔진에 다양한 런타임 서비스를 제공합니다. WF 기본 제공 런타임 서비스는 일반적인 시나리오를 해결하기 위한 것입니다. 그러나 기본 제공 서비스가 호스트 애플리케이션의 요구 사항을 충족하지 않는 경우 호스트 애플리케이션은 사용자 지정 서비스를 구현하고 워크플로 런타임에 제공해야 합니다.

또한 WF는 실행 중인 워크플로 인스턴스를 관리 및 모니터링하고 안정적이고 고가용성으로 선택하는 호스트 애플리케이션을 지원하는 인프라를 제공합니다. 호스트 애플리케이션은 호스팅 관련 시나리오에 따라 다양한 옵션을 사용하는 방법을 결정해야 합니다.

참조 항목

이 문서는 다음 리소스와 함께 워크플로 기술을 접하는 개발자가 기술에 대해 알아보고 이를 사용하여 신속하게 생산성을 높일 수 있도록 도와줍니다.

 

작성자 정보

무스타파 칼릴 아메드는 워싱턴 주 레드먼드에 있는 Microsoft Corp.의 WF 팀과 함께 프로그램 관리자입니다. 2000년 Microsoft에 입사한 이후 다양한 서버 구성 요소 개발에 참여했으며 Microsoft BizTalk Server 포함한 4개의 서버 제품을 배송하는 데 도움을 주었습니다. Microsoft에서 근무하기 전에는 이집트 카이로의 ITWorx에서 소프트웨어 엔지니어, 비즈니스 분석가 및 계정 관리자로 일했습니다.