2008-08-14 6 views
3

너무 쉽게 이동 :외부 이벤트를 기반으로 워크 플로 인스턴스를 안정적으로 만들려면 어떻게해야합니까? 윈도우 워크 플로우 물건에 약간의 새로운

를 내가 고 가용성을 가진 워크 플로우 호스트 환경 설계 할 - 모두 같은 지속성 또는 추적을 가리키는 별도의 하드웨어에 2 개 WF 런타임 호스트의 최소 SQL 데이터베이스.

내가 비동기 일부 외부 이벤트를 기반으로하는 새로운 워크 플로 인스턴스를 만들 수있게된다 패턴을 찾고 있습니다 (즉, 데이터의 일부 조각이 다른 응용 프로그램에서 DB에 업데이트됩니다). 각 이벤트마다 정확히 하나의 워크 플로 인스턴스를 만들어야하며 인스턴스가 만들어지는 호스트는 중요하지 않습니다. 또한 이벤트와 워크 플로 인스턴스가 실제로 만들어지기까지의 시간에 대한 유연성도 있습니다. 내가 고려하고

하나 개의 솔루션은 WF 호스트에 WCF 인터페이스를 가진 및 부하 분산 장치의 일종 뒤에 그들을 배치입니다. 그런 다음 WCF 호출을 수행하기 위해 "이벤트"를 시작하는 시스템의 모든 부분에 달려 있습니다.

나는이 정말 행복하지 않다 때문에 경우 모두 \ 모든 WF 호스트가 다운 또는 이벤트는 "손실"할 수있다, 그렇지 않으면 사용할 수 없습니다. 또한, 나는 내가 원하는대로 부하를 관리 할 수 ​​없을 것이다. 나는 작은 시간에 많은 사건들이있을 수있는 상황을 생각하지만, 나중에 사건들을 처리하는 것은 완벽하게 받아 들일 수있다.

그래서 나는 어떻게 든 이벤트를 지속하고 이벤트 처리에서 이벤트 생성을 분리 할 필요가 생각한다.

SQL Server의 MSMQ에 이러한 이벤트, 또는 간단한 이벤트 테이블을 넣어 및 WF 호스트 그냥 주기적으로 실행 가능한 솔루션을 큐를 폴링 데? 폴링은 ... 비록 같은 더러운 단어 것 같다

겠습니까 NServiceBus하고 내구성이 메시지는 여기에 도움이 될?

통찰력이 있으면 크게 감사하겠습니다.

부록은

데이터베이스는 공유 파이버 채널 스토리지 클러스터됩니다. 네트워크도 중복 될 것입니다. WF 런타임 인스턴스가 장애 조치를 수행하려면 일반적인 지속성 서비스 (이 경우 SQL 백엔드)를 지정해야합니다. 그것은 높은 가용성,하지 총 가용성 그리고 :)

MSDN article on WF Reliability and High Availabilty

또한, WF 런타임의 각 인스턴스가 정확히 같은 비트를 실행해야합니다, 그래서 업그레이드는 모두 동시에 복용이 필요합니다. 필자는 필요한 경우 전체 시스템을 중단하지 않고도이를 수행 할 수있는 아이디어를 좋아합니다.

답변

0

나는 MSMQ/event 테이블로 갈 것이다. 폴링은 잘못하면 더러워집니다.

염두에 두어야 할 점 중 하나 : 고 가용성을 위해 여러 대의 WF 서버를 사용하려는 경우 이지만 둘 다 동일한 SQL 백엔드을 사용합니까? 고 가용성은 모두 단일 지점에서 오류를 제거하는 경우에만 작동합니다.

1

netMsmqBinding과 함께 WCF 서비스를 사용하면 폴링하지 않고도 대기중인 메시지를 수신 할 수 있습니다. 서비스를 실행하기 위해 실행중인 서비스가없는 경우 메시지는 대기합니다. 메인 큐잉 머신이 다운 될 경우를 대비하여 클러스터 큐를 사용하여 안정성을 확보하는 것이 좋습니다.

또한 업그레이드 할 때 이전 버전의 서비스에서 인스턴스를 소생시킬 수 없음을 알아 두십시오. 따라서 장기간 실행되는 워크 플로를 업그레이드하려면 새 요청을받지 못하게하고 비트를 변경하기 전에 모든 인스턴스가 완료 될 때까지 기다려야합니다. 그렇지 않으면 이전 인스턴스가 영구 저장소에 영구히 고정됩니다.

0

이것은 어떻게 해결 했는가?

저는 NServiceBus를 사용하고 있고 각 메시지 런타임 버스 (MSMQ를 전송으로 사용)를 가리키는 각 WF 런타임 호스트와 함께 사용하고 있습니다. NServiceBus는 메시지 버스에서 트랜잭션 읽기 및 롤백을 지원합니다. 메시지가 버스에서 제거되었지만 메시지가 완전히 처리되기 전에 프로세스가 종료되면 대기열에 남아 있고 다른 런타임 호스트가이를 가져옵니다.

WF 런타임 호스트를 별도의 컴퓨터에서 실행하려면 이전 버전의 MSMQ가 원격 트랜잭션 읽기를 지원하지 않으므로 messagebus \ queue가 Windows 2008 서버 (MSMQ 4.0) 이상에 있어야합니다. 또한 원격 트랜잭션 읽기를 수행하려면 읽기를 수행하는 컴퓨터에도 MSMQ 4.0이 설치되어 있어야합니다 (예 : Windows Server 2008)