2009-03-13 4 views
2

기본 아키텍처 : 각각 동일한 WCF 서비스를 호스팅하는 n 개의 물리적 상자.로드 균형 조정기에 앉아 있습니다. 하지 지원 트랜잭션을 수행하는 하나의 데이터베이스 인프라를 치는 각 상자 - 내 응용 프로그램의 데이터 액세스 레이어에서 I는 분산 트랜잭션의 몇 가지 방법이 필요합니다, 그래서 :(WCF를 사용하는 분산 트랜잭션

을 요구하지 않는 내 옵션은 무엇입니까

.? 내 시스템에 클라이언트가 유산 될 것

참고 기본 웹 서비스 (은 BasicHttpBinding)과 빛나는 새로운 WCF 클라이언트 (NetTcpBinding 또는 NetNamedPipeBinding)를 사용하여 통신 애플 리케이션.


편집 한

예. 물리적 박스 1상의 WCF 계층으로의 단일 호출이있을 것이다. EditEntity (...). 이 호출은 데이터베이스에 2 개의 쓰기를 트리거합니다. 첫 번째 쓰기 후에 다른 클라이언트는 두 번째 실제 상자에서 내 WCF 서비스의 두 번째 인스턴스에서 동일한 엔터티에 대해 EditEntity (...)를 호출합니다. 두 번째 상자에서이 특정 엔티티에 대한 트랜잭션이 이미 실행 중임을 어떻게 알 수 있습니까?

감사합니다.

답변

2

우리에게 계속해서 충분히 알려주지는 못했지만 제대로 읽는다면 WCF 서비스를 통해 트랜잭션을 지원할 수 있는지 확인하려고 시도하고 있습니까? DB가 트랜잭션을 지원하지 않고 WCF 엔드 포인트가로드 밸런서 뒤에 앉아 있습니까? 이게 맞습니까? 그렇다면 ...

DB에는 트랜잭션 지원이 없으므로 해당 인스턴스가 WCF 계층으로 이동합니다. 이는 WCF 서비스에 대한 단일 호출이 사용자의 트랜잭션을 충분히 포함 할 수 있도록 메소드에서 거친 세분화 수준을 제시합니다. 여러 WCF 통화에 트랜잭션을 분산시키지 마십시오. 문제가 생길 수 있습니다.


업데이트 : 연결 간 지속성을 보장하는로드 밸런서와 함께 사용할 수있는 전략이 있지만 여기서는 도움이되지 않습니다. EditEntity()를 연속적으로 호출하면 첫 번째 항목이 트랜잭션을 시작하고 두 번째 항목은 트랜잭션을 완료하는 것입니다. 그러면 서비스가 충분히 세밀하지 않습니다.

두 개의 호출을 하나의 메소드 즉 EditEntityComplete()로 통합합니다.

두 가지가 아니라 한 가지 방법을 만들 수없는 이유가 있습니까?


UPDATE # 2 : 문제를 수정하면 하나의 메소드가 트랜잭션을 지원하지 않는 데이터베이스 내에서 항목을 수행합니다. 문제의 방법은 순서대로 완료해야하는 일련의 단계를 실행합니다. WCF 메서드는 동시성 경합이 적절한 순서로 단계 완료를 위반하는 기회를 나타냅니다.

해당 기초에서 함수의 반환 데이터가 필요 없다고 가정하면 WCF 끝점에서 요청을 기록 할 수있는 비동기 대기열을 고려하십시오. 그런 다음 단일 백그라운드 프로세스에서 큐를 처리합니다.


최종 수정 :

데이터 저장소를 변경하지의 요구 사항을 다시 확인한다.

여러 클라이언트에 대한 요구 사항을 감안할 때 데이터 저장소에서 규모,로드 균형 조정 및 트랜잭션 지원이 필요합니다. 마지막 제안은 데이터베이스 변경입니다. 이를 이해하는 것은 정적 인 요구 사항이지만, 많은 데이터베이스 플랫폼이 트랜잭션을 지원할 때 트랜잭션 지원을 구현하기 위해 많은 노력을해야합니다. 이 기능을 다시 만들려고하면 약간의 단점이 있지만 많은 단점이 있습니다.

+0

감사합니다. 요약이 정확합니다. 문제는 WCF 티어가 여러 개의 상자에 걸쳐 분산됩니다 (즉, 수평 확장 됨). 내 질문을 업데이트했습니다. – ng5000

+0

방법은 하나뿐입니다. 그러나 두 개의 서로 다른 클라이언트가 호출하고 각 요청은 다른 실제 상자에서 처리합니다. – ng5000

+0

좋아, 나는 지금 더 나은 이해가 있다고 생각한다. EditEntity()에 대한 두 번 연속적인 호출이 트랜잭션을 완료하는 데 필요한 것처럼 들렸다. – jro