서로 관련되어 있지만 별도의 시스템 두 개를 어떻게 동기화 상태로 유지합니까?

StackOverflow https://stackoverflow.com/questions/13485

문제

현재 개발 프로젝트에는 두 가지 측면이 있습니다.첫째, 외부 사용자가 다양한 목적으로 정보를 제출하고 업데이트할 수 있는 공개 웹사이트가 있습니다.이 정보는 콜로 시설의 로컬 SQL Server에 저장됩니다.

두 번째 측면은 직원이 동일한 기록을 (개념적으로) 관리하고 상태 업데이트, 승인 등을 제공하는 데 사용하는 내부 애플리케이션입니다.이 애플리케이션은 자체 로컬 SQL Server 데이터베이스가 있는 회사 방화벽 내에서 호스팅됩니다.

두 네트워크는 하드웨어 VPN 솔루션으로 연결되어 있는데, 이는 괜찮은 수준이지만 분명히 세계에서 가장 빠른 솔루션은 아닙니다.

두 데이터베이스는 유사하고 동일한 테이블을 많이 공유하지만 100% 동일하지는 않습니다.양쪽에 있는 많은 테이블은 내부 또는 외부 애플리케이션에 매우 구체적입니다.

질문은 다음과 같습니다.사용자가 자신의 정보를 업데이트하거나 공개 웹사이트에 기록을 제출할 때 내부 직원이 관리할 수 있도록 해당 데이터를 내부 애플리케이션의 데이터베이스로 어떻게 전송합니까?그 반대...직원이 업데이트한 내용을 웹사이트에 다시 푸시하려면 어떻게 해야 하나요?

이러한 업데이트가 "실시간"으로 발생할수록 더 좋다는 점은 언급할 가치가 있습니다.즉각적이어야 하는 것은 아니고 합리적으로 빠르기만 하면 됩니다.

지금까지 나는 다음과 같은 접근 방식을 사용해 보았습니다.

  1. 양방향 복제
  2. 변경 내용이 실시간으로 동기화되는 코드가 포함된 양쪽의 웹 서비스 인터페이스입니다.
  3. 변경 사항을 비동기적으로 동기화하는 코드가 포함된 양쪽의 웹 서비스 인터페이스(큐 메커니즘 사용)

어떤 충고?이전에 이 문제를 겪은 사람이 있나요?당신에게 잘 맞는 솔루션을 생각해냈나요?

도움이 되었습니까?

해결책

이것은 매우 일반적인 통합 시나리오라고 생각합니다.개인적으로는 대기열을 사용하는 비동기 메시징 솔루션이 이상적이라고 생각합니다.

복제와 같은 오버헤드나 복잡성 없이 거의 실시간 동기화를 달성할 수 있어야 합니다.

오류 시나리오를 처리하려면 코드가 매우 정교해야 하기 때문에 동기식 웹 서비스는 이상적이지 않습니다.한 시스템이 다시 시작되고 다른 시스템이 계속 변경 사항을 게시하면 어떻게 되나요?전송 시스템에 시간 초과가 발생합니까?그것들은 무엇을 합니까?데이터 손실에 대비하지 않는 한 MSMQ와 같은 일종의 트랜잭션 대기열이 변경 알림을 수신하고 해당 내용이 다른 시스템에 전달되도록 처리하는 것이 좋습니다.두 시스템 중 하나가 다운되면 변경 사항(메시지로 전달됨)이 누적되고 연결이 설정되자마자 다시 시작하는 서버가 대기 중인 모든 메시지를 처리하고 따라잡기 때문에 시스템 무결성을 훨씬 더 쉽게 달성할 수 있습니다.

.NET을 사용하는 경우(특히 MSMQ를 사용하려는 경우) 이를 쉽게 수행할 수 있는 몇 가지 오픈 소스 도구가 있습니다.

  1. nServiceBus 우디 다한(Udi Dahan)
  2. 대중교통 드루 셀러스(Dru Sellers)와 크리스 패터슨(Chris Patterson)

상업용 제품도 있습니다. 상업용 옵션을 고려하고 있다면 다음을 참조하세요. 여기 .NET의 옵션 목록을 보려면물론 WCF는 MSMQ 바인딩을 사용하여 비동기 메시징을 수행할 수 있지만 nServiceBus 또는 MassTransit과 같은 도구는 요구 사항을 매우 간단한 작업으로 만들어 주는 매우 간단한 Send/Receive 또는 Pub/Sub API를 제공합니다.

Java를 사용하는 경우 Mule이나 ActiveMQ와 같이 이러한 종류의 양방향 비동기 메시징을 손쉽게 수행할 수 있는 오픈 소스 서비스 버스 구현이 얼마든지 있습니다.

독서를 고려해 볼 수도 있습니다. 우디 다한'의 블로그에서 그의 팟캐스트를 듣고 있습니다.여기 있습니다 좀 더 좋은 자료 시작하려면.

다른 팁

느린 연결(경우에 따라 전화 접속)을 통해 동기화를 유지해야 하는 여러 사이트가 있다는 점을 제외하면 비슷한 프로젝트를 진행하고 있습니다.

먼저 변경 사항을 추적해야 합니다. SQL 2008을 사용할 수 있다면(2GB 제한이 문제가 되지 않으면 Express 버전으로도 충분합니다) 이렇게 하면 고통이 크게 줄어들 것입니다. 데이터베이스와 각 테이블에서 변경 내용 추적을 켜기만 하면 됩니다.우리는 본사에서 확장된 스키마가 있는 SQL Server 2008을 사용하고 있으며 각 사이트에서는 데이터 하위 집합과 제한된 스키마가 있는 SQL Express 2008을 사용하고 있습니다.

두 번째로 변경 사항을 추적해야 합니다. 동기화 서비스 트릭을 훌륭하게 수행하고 기본 데이터베이스에 WCF 게이트웨이를 사용하는 것을 지원합니다.이 예에서는 다음을 사용해야 합니다. SQL Express 클라이언트를 사용하여 동기화 샘플은 시작점으로 SQL 2005를 기반으로 하므로 2008의 변경 내용 추적 기능을 활용하려면 업데이트해야 합니다.기본적으로 동기화 서비스는 클라이언트에서 SQL CE를 사용하지만 귀하의 경우에는 이것이 충분하지 않다고 확신합니다.웹 서버에서 주기적으로(원하는 경우 10초마다 실행 가능) 동기화() 메서드를 실행하는 서비스가 필요합니다.이렇게 하면 로컬에서 변경된 내용을 기본 데이터베이스에 알리고 서버에 변경된 모든 내용을 서버에 요청합니다.저장 프로시저를 호출하기 위해 SQL 코드 가져오기 및 적용을 설정하고 충돌을 처리하기 위한 이벤트 핸들러를 추가할 수 있습니다(예:클라이언트 업데이트와 서버 업데이트) 각 끝에서 그에 따라 문제를 해결합니다.

우리는 동일한 VPN에 연결된 3개의 매장이 있는 클라이언트로 매장을 보유하고 있습니다.
두 상점에는 해당 상점의 "서버"로 실행되는 컴퓨터가 있고 세 번째 상점에는 "마스터 데이터베이스"가 있습니다.
모든 것을 마스터에 동기화하기 위한 최상의 솔루션은 없지만 작동합니다.두 매장의 모든 테이블에 있는 모든 기록의 타임스탬프를 확인하는 애플리케이션을 실행하는 전용 PC가 있으며, 마지막 동기화 시간과 다를 경우 결과를 복사합니다.
이는 양방향으로 작동합니다.즉.마스터 데이터베이스에서 제품을 업데이트하면 이 변경 사항이 다른 두 상점에 전파됩니다.상점 중 하나에 새로운 주문이 있으면 "마스터"에게 전송됩니다.
일부 최적화를 통해 약 20분 안에 모든 상점을 동기화할 수 있습니다.

최근에는 구현상의 어려움이 거의 없이 기본적으로 안정적이고 지속적인 비동기 메시징을 제공하는 SQL Server Service Broker를 사용하여 많은 성공을 거두었습니다.

  • 설정이 빠르며, 자세히 배우면 고급 기능 중 일부를 사용할 수 있습니다.
  • 대부분에게 알려지지 않았지만 데스크톱 버전의 일부이므로 워크스테이션 메시징 시스템으로 사용할 수 있습니다.
  • 기존 T-SQL 기술이 있는 경우 메시지를 읽고 쓰는 모든 코드가 SQL에서 수행되므로 이를 활용할 수 있습니다.
  • 눈부시게 빠르다

이는 SQL Server에서 크게 과소평가된 부분이며 살펴볼 가치가 있습니다.

pub 데이터베이스 입력 테이블의 데이터를 개인 데이터베이스 보류 테이블에 복사하는 작업이 있다고 말하고 싶습니다.그런 다음 비공개 측의 데이터를 업데이트하면 공개 측에 복제됩니다.공용 측에 복제된 데이터가 업데이트되지 않은 경우 이는 매우 쉬운 트랜잭션 복제 솔루션이어야 합니다.

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