문제

기본 아키텍처 : n 물리적 상자 각각 동일한 WCF 서비스를 호스팅하는 Sitting은로드 밸런서를 시행합니다. 각 상자는 단일 데이터베이스 인프라에 도달합니다 하지 않습니다 지원 거래 - 묻지 마십시오 :(

따라서 앱의 데이터 액세스 계층에는 분산 트랜잭션 방법이 필요합니다. 내 옵션은 무엇입니까?

내 시스템의 클라이언트는 기본 웹 서비스 (Basichttpbinding)와 반짝이는 새로운 WCF 클라이언트 (NETTCPBINDING 또는 NETNAMEDPIPEBINDING)를 사용하여 통신하는 레거시 앱입니다.


편집 1

예를 들어 물리적 상자 1의 WCF 레이어에 대한 단일 호출이있을 것입니다. 이 호출은 2를 데이터베이스에 트리거합니다. 첫 번째 쓰기 후 다른 클라이언트는 두 번째 물리적 상자에서 내 WCF 서비스의 두 번째 인스턴스에서 동일한 엔티티에 대해 편집자 (...)를 호출합니다. 두 번째 상자 에서이 특정 엔티티의 거래가 이미 진행되고 있음을 어떻게 알 수 있습니까?

감사.

도움이 되었습니까?

해결책

계속할 수있는 충분한 정보를 확신하지 못하지만, 내가 올바르게 읽고 있다면 WCF 서비스를 통해 거래를 지원할 수 있는지 확인하려고합니까? DB가 트랜잭션을 지원하지 않지만 WCF 엔드 포인트는로드 밸런서 뒤에 있습니다. 이게 맞습니까? 그렇다면....

DB에는 거래 지원이 없으므로 WCF 계층으로 이동합니다. 이것은 WCF 서비스에 대한 단일 호출이 거래를 충분히 포함 할 수 있도록 방법에서 거친 수준의 세분성을 나타냅니다. 여러 WCF 통화에 따라 거래를 퍼뜨리지 마십시오. 문제를 요구합니다.


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

이 두 호출을 하나의 방법, 즉 editentityComplete ()로 통합합니다.

둘이 아닌 하나의 방법을 만들 수없는 이유가 있습니까?


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

이 기준으로 함수의 반환 데이터가 필요하지 않다고 가정하면 WCF 엔드 포인트에서 요청을 기록 할 수있는 비동기 큐를 고려하십시오. 그런 다음 단일 배경 프로세스에서 큐를 처리하십시오.


최종 개정 :

데이터 저장소를 변경하지 않는 요구 사항을 재고하십시오.

여러 클라이언트에 대한 요구 사항이 주어지면 데이터 저장소의 규모,로드 밸런싱 및 트랜잭션 지원이 필요합니다. 최종 제안서 - 데이터베이스 변경을 강요합니다. 이것을 이해하는 것은 정적 요구 사항이지만, 간단한 데이터베이스 플랫폼이 많이 제공 될 때 트랜잭션 지원을 구현하려는 많은 노력을 기울일 것입니다. 이 기능을 다시 만들려고 노력하면 상승이 거의 없지만 많은 단점이 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top