2012-06-19 3 views
7

명확한 도메인 모델을 사용하는 비교적 새로운 웹 기반 응용 프로그램을 CQRS 스타일 시스템으로 변환하려고합니다. 필자의 새로운 응용 프로그램은 본질적으로 구형의 기존 시스템을보다 효과적으로 대체 한 것입니다.레거시 시스템이있는 CQRS

내 조직의 기존 시스템은 회사 전체의 사일로에 존재하는 무수한 응용 프로그램 (카오스 방식을 통해 개발 됨)에 의해 업데이트되는 공통 데이터베이스 세트를 공유합니다. (회사에있는 어떤 사람도 그들 모두를 식별 할 수는 없다고 생각합니다.)

내 질문은 내 애플리케이션의 읽기 모델에 관한 것입니다. 다양한 상태 변경, 일반 사용자 데이터 등이 내 제어 외부의 다른 응용 프로그램에 의해 업데이트되므로 외부 업데이트를 처리 할 수있는 방식으로 읽은 모델을 작성하는 가장 좋은 방법은 무엇입니까? 나는 지금까지 다음과 같은 고려했습니다

:

  1. 하는 모든 테이블, 기존 및 새로운
  2. 추가 읽기 읽기 모델에 대한 데이터베이스에서보기 만들기 새로운 읽기 모델 테이블을 갱신하는 기존 테이블에 트리거
  3. 희망
에게 포기 읽기 모델
  • 에 대한 외부 데이터 저장소를 업데이트하기 위해 데이터베이스 (CLR 저장 프로 시저/등 [SQL 서버])에 일부 코드를 추가

    이 접근 방법에 대한 일반적인 합의는 무엇입니까? 처음부터 모든 것을 완전히 다시 쓰지 않고 기존 시스템에 명령을 내릴 수 있다고 생각하는 것은 어리 석 다?

  • 답변

    1

    나는 성공과 함께 옵션 # 1을 사용했습니다. 쓰기 모델의 복잡성에 따라 읽기 모델을 만들기 위해 데이터를 낭패하게 만드는보기를 만드는 것이 실용적인 옵션입니다. 대부분의 개발자가 이해할 수있는 비교적 단순한 조인이라면, 그것이 가능한지를 면밀히 관찰 할 것입니다. 나는이 견해들에 너무 많은 복잡성을 갖는 것에 조심할 것이다.

    기존의보고 데이터베이스와 유사한 빌드 및 업데이트를위한 주기적 폴링을 고려해야합니다. 알림과 비교하여 최적은 아니지만 읽는 모델이 얼마나 오래 상태인지에 따라 볼 수도 있습니다.

    한번 비슷한 상황이었다
    1

    , 다음 단계는 내가 그것을 어떻게했다 :

    은 기존 시스템을 개선하고 청소기 코드베이스를 달성하기 위해, 키는 쓰기 책임을 걸릴 것입니다. 그러나 이것이 최종 배포를 위험하게 만드는 인터페이스/계약 변경을 초래할 수 있기 때문에 너무 야심적이지 않아야합니다.

    1. 모든 쓰기가 직접 SQL 업데이트를 제외한 모든 작업을 통해 수행되는 경우 가능한 한 하위 호환성을 유지하십시오. 새로 개발 된 명령 처리기의 어댑터/클라이언트로 가져 가십시오.

    2. 일부 쓰기는 직접적인 SQL 업데이트이지만 사용자의 제어 범위를 벗어납니다.
      새 인터페이스/계약서로 변경할 수 있는지 담당 팀에 문의하십시오.
      아니요 인 경우 3 단계를 참조하십시오.

    3. 최종 일관성을 허용 할 수 있으며 SQL 업데이트를 데이터베이스 프로 시저로 대체 할 용의가 있는지 물어보십시오.
      예인 경우 모든 SQL 업데이트를 프로 시저에 넣고 배포 일정을 세우고 4 단계를 참조하십시오.
      아니요, 아마도 리팩터링에 포함해야합니다.

    4. 절차를 수정하고 SQL 업데이트를 이벤트를 삽입하여 바꿉니다. 그리고 이벤트를 롤백하고 게시하는 백엔드 작업을 개발하십시오. 새 응용 프로그램이이 이벤트를 구독하도록하여 명령 처리기에 명령을 실행하십시오.

    5. 명령 핸들러에서 이벤트를 내보내고 다른 응용 프로그램이 사용했던 테이블을 업데이트하는 데 사용합니다.

    6. 레거시 시스템의 다음 부분으로 이동하십시오.