2011-03-28 4 views
2

Windows 서비스에서 Entity Framework를 사용하여 최상의 솔루션 아키텍처를 만드는 방법에 대한 질문이 있습니다.장기 실행 Windows 서비스 용 Entity Framework 아키텍처

나는 지금까지 내가 윈도우 서비스를 사용하고 등 사용자가이를 취소 가능성 장기 실행 작업을 실행하는 작업의 진행 상황을 볼 수있는 온라인 (웹 -) 서비스, 그래서

를 제공 할

실제로 WCF 끝점을 노출하는 작업을 실행하여 새로운 작업을 대기시키고 기존 작업을 관리합니다.

모든 작업의 ​​기록을 저장하기 위해 Entity Framework를 사용하고 있습니다. 그러나 작업을 실행하는 백그라운드 프로세스 (현재 진행 정보)와이 상태를 노출하는 wcf 서비스 간의 상호 작용을 어떻게 모델링해야하는지 완전히 모르겠습니다.

백그라운드 프로세스가 주기적으로 데이터베이스에 현재 상태를 쓰게하고 WCF 서비스가 거기에서 정보를 폴링하도록 두 부분을 완전히 분리해야합니까?

또는 WCF 서비스가 정적 멤버 또는 이와 유사한 멤버에 액세스하는 백그라운드 프로세스에서 정보를 직접 가져 오는 것이 합리적입니까? 그들은 DataContext를 공유해야합니까?

정보를 갖고 싶습니다. 백그라운드 처리와 WCF 서비스를 동일한 프로세스에서 실행하는 것이 이상하게 보입니다. 그러나 데이터베이스를 통해 통신하지만 다른 한편으로는 더 멋진 아키텍처 ...

고마워요!

답변

0

두 부분을 분리하는 것이 좋습니다. 또한 상태를 데이터베이스에 저장하면 나중에 아키텍처를 여러 시스템으로 쉽게 확장 할 수 있습니다. 데이터베이스 및 웹 클라이언트 액세스는 한 서버에 머 무르며 장기간 실행되는 작업은 여러 서버에 유지 될 수 있습니다.

충돌이 발생해도 다른 것은 영향을받지 않습니다. 정보를 올바르게 기록 할 수 있습니다. 상태를 데이터베이스에 정확하게 저장하면 정보를 검토하고 실행 시간 및 예측에 대한 보고서를 준비 할 수 있습니다.

+0

의미가 있습니다. 이 경우 백그라운드 프로세스에서 DataContext를 사용하는 것이 어떻습니까? 서비스가 실행되는 동안 (주기적으로 플러시) 전체 시간을 열어 놓는 것은 나쁜 생각처럼 보입니다. 그래서 대신 다른 스레드를 사용하여 주기적으로 DataContext를 만들고 데이터베이스를 업데이트할까요? SQLite를 데이터베이스 btw로 사용하여 서비스를 쉽게 배포합니다. 잠시 동안 데이터 볼륨이 너무 높아서는 안됩니다. 그러나 SQL Server로 전환 할 수있는 옵션이 있습니다. – aKzenT

+0

datacontext 메모리 크기가 크지 않으면 오랫동안 컨텍스트를 열어두고 컨텍스트는 서버에 대한 연결을 유지하지 않고 변경 내용을로드하거나 저장할 때만 풀에서 새 연결을 가져와 작업을 수행합니다. 문맥을 오랫동안 열어두면 더 자주 변경하고 거의 플러시하지 않을 것입니다. –

0

좋은 해결책은 웹 인터페이스와 작업자 사이의 메시지 대기열 (MSMQ, 테이블 등)을 포함하는 것입니다.

웹 인터페이스는 메시지를 큐에 넣고 필요에 따라 상태를 폴링합니다. 작업자 (둘 이상)가 메시지를 처리하여 상태를 업데이트합니다.

작업자가 충돌하면 메시지가 대기열로 돌아와야합니다.

관련 문제