2009-10-04 2 views
2

우리는 시스템 A가 시스템 B로 데이터를 보내는 두 개의 시스템을 가지고 있습니다. 각 시스템이 다른 시스템과 독립적으로 실행될 수 있고 다른 시스템이 다운되면 둘 다 폭발 할 수없는 요구 사항이 있습니다. 문제는 디커플링 요구 사항을 충족하면서 시스템 A가 시스템 B와 통신하는 가장 좋은 방법입니다.데이터베이스가 좋은 시스템 디커플링 포인트?

시스템 B에는 현재 db 테이블의 데이터를 폴링하고 삽입 된 새 행을 처리하는 프로세스가 있습니다.

하나의 제안 된 설계는 시스템 A가 시스템 b의 db 테이블에 데이터를 삽입하고 시스템 B가 기존 프로세스로 새 행을 처리하게하는 것입니다. 문제는이 솔루션이 두 시스템의 분리 요구 사항을 충족시키는 것입니까? 데이터베이스가 사용 불가능하게되어 시스템 A를 폭발시키는 시스템 B의 일부로 간주됩니까?

또 다른 솔루션은 시스템 A가 데이터를 MQ 대기열에 넣고 MQ에서 읽은 다음 시스템 B의 데이터베이스에 삽입하는 프로세스입니다. 하지만 이것은 그냥 여분의 오버 헤드입니까? 궁극적으로 MQ 대기열이 db 테이블보다 내결함성이 있습니까?

답변

5

일반적으로 데이터베이스 공유는 밀접한 관련이 있으며 속도면을 제외하고는 선호되지 않습니다. 가용성 목적뿐 아니라 시스템 A와 B가 앞으로 몇 가지 지점에서 변경되고 업그레이드 될 것이기 때문에 최소한의 의존성이 있어야합니다. 메시지 전달은 명백한 종속성이지만 공유 데이터베이스는 당신의 상속인들)이 가장 적었을 때 후부에 있습니다. 데이터베이스 공유 경로를 사용하는 경우 최소한 공유 인터페이스를 전용 테이블이나 뷰로 명시하십시오.

통합의 네 가지 일반적인 수준이 있습니다

  1. 데이터베이스 공유
  2. 파일 공유
  3. 원격 프로 시저 호출
  4. 메시지 전달 다양한 적용과 결합 될 수

상황에 따라 가용성과 유지 관리가 다릅니다. enterprise integration patterns site에 대한 개요가 훌륭합니다.

중앙 통합 인프라와 마찬가지로 MQ는 가용성이 뛰어난 환경에서 전체 장애 조치 & c로 호스트되어야합니다. 큐 조정을 배포 할 수있는 다른 큐 솔루션이 있습니다.

3

통신을 위해 대기열을 사용하십시오. 데이터베이스를 통해 시스템 A에서 시스템 B로 데이터를 "전달"하지 마십시오. 데이터베이스를 거대하고 값 비싸고 복잡한 메시지 대기열로 사용하고 있습니다.

메시지 큐를 메시지 큐로 사용하십시오.

"추가"오버 헤드가 아닙니다. 이것은 시스템을 분리하는 가장 좋은 방법입니다. 서비스 지향 아키텍처 (SOA)라고하며 메시지를 사용하는 것이 디자인의 핵심입니다.

MQ 대기열은 DB 테이블보다 훨씬 간단합니다.

"내결함성"을 비교하지 마십시오. RDBMS가 거래가 제대로 완료되었다는 합리적인 수준의 보증을 얻기 위해 거대한 (거의 상상할 수없는) 오버 헤드를 사용하기 때문에 비교하지 마십시오. 잠금. 버퍼링. 쓰기 대기열. 스토리지 관리. 등등

신뢰할 수있는 메시지 큐 구현은 큐의 상태를 유지하기 위해 일부 백업 저장소를 사용합니다. 오버 헤드는 RDBMS보다 훨씬 적습니다. 성능이 훨씬 좋습니다. 그리고 상호 작용하는 것이 훨씬 더 간단합니다.

0

SQL Server에서이 작업은 SSIS 패키지 또는 작업 (레코드 수와 내가 이동 한 작업의 복잡성에 따라 다름)을 통해 수행합니다. 다른 데이터베이스에도 ETL 솔루션이 있습니다. 나는 무엇이 변경되었고 어떤 오류가 처리되었는지에 대한 로그를 유지할 수 있기 때문에 ETL 솔루션을 좋아하기 때문에 어떤 이유로 든 다른 시스템으로 이동하지 않을 수 있습니다 (데이터 구조는 두 데이터베이스간에 거의 동일하지 않습니다). 테이블의 나머지 부분을 죽이지 않고. 데이터베이스 차이 (예 : 조회 테이블 값, db1의 완료 상태가 5이고 db2가 7이라고 말하거나 db2에 db1이 필요하지 않은 필수 필드가 있다고 말한 경우)에 맞게 조정할 때 데이터를 변경할 수 있습니다. 필드가 null 인 경우 기본값을 필드에 추가해야합니다. SSIS 패키지 실행 중 하나 또는 다른 서비스가 중단되면 SSIS 패키지가 실패하고 시스템이 영향을받지 않으므로 트리거를 사용하거나 복제를 사용하지 않을 때 데이터베이스가 분리됩니다.

관련 문제