2012-11-04 2 views
2

작동 여부를 확인하고 계획을 검토합니다.이벤트 소싱이없는 cqrs 및 LMAX 스타일 단일 스레드 설계 검토

임 RDBMS를 사용하고 이벤트 소싱없이 CQRS를 사용할 계획입니다. 나는 이벤트 소싱이 약간의 시도로 진행되었다고 생각하며 나는 RDBMS를 사용해야 만한다.

작업 기반 UI는 대부분의 응답이 필요하지 않은 많은 명령으로 구성됩니다.

아키텍처

  /---- RDBMS (EF) 
    IO ops     \ 
      |     \ 
    Single threaded Domains Fascade(DTO) Queries 
      |    /
    Event/Command Dispatcher/
      \   /
       MVC client 

단일 스레드 도메인이 서로 대화하지 않는 기본적으로 그들은 교란 물질 (기본적으로 버퍼 링)을 통해 외부 세계에 이야기.

명령 디스패처는 외부 이벤트와 명령을 디스크에 복사하고 충돌이 발생하면 다시로드합니다. 완료는 IO Ops에 의해 명시 적으로 표시됩니다.

명령은 기본적으로 (명령의 트랜잭션 범위로) 지속되며 IO Ops 계층은 모든 이벤트를 가져 와서 처리하고 1 트랜잭션에서 명령 완료를 표시합니다. (명령은 도메인이 아닌 저널 서비스를 통해 지속되지만 명령에 대한 작업과 일치하는 IO opps와 대화 함). 명령이 실패하고 표시가 지속되면 (모두가 아닐 수도 있음) 명령을 다시 실행할 수 있습니다. 명령이 있고 DoTransation 메시지를 받았을 때만 명령을 지속합니다.

명령 발송자는 방해 요소를 통해 도메인에 연결합니다.

질문

  1. 내가 메모리에 전체 도메인을로드해야 하는가? - DB를 업데이트 한 후 (약 300 500 멕)과 그 실행 분명히 도메인에만 업데이트 할 것입니다.

  2. 외부 이벤트를 명령 디스패처에 다시 섞어도 상관 없으므로 (따라서 단일 스레드에서 처리하여 처리됩니다). 예를 들어 이벤트가 명령이됩니다.

  3. 최소한 작업중인 프로토 타입에서 도메인과 사용자 코드를 코딩하는 것이 간단 해 보이며 멋진 리치 도메인을 얻습니다. 그렇지? 도메인이 IO 작업을 수행 할 때

  4. 는 그들은 교란에 메시지를 보내고 하나

    • 명령 GUID를 지정하고 명령을
    • 완료 가정 (촬영을하고기도)를 거래와 일치됩니다
    • 은 명령 디스패처로 전달 된 콜백 명령을 제공 한 다음 도메인에 다시 나타납니다. IO 메시지가 생성 된 후 시스템은 현재 명령을 에서 계속하거나 완료하여 다음 명령을 수신 할 수 있습니다.
      충분합니까?
  5. 시스템은 하나의 프로세스와 공유 메모리에서 실행되지만 도메인 리소스는 자체적으로 액세스 할 수 있고 스레드는 하나만 액세스 할 수 있습니다. 이거 괜찮아?

실험용 메쉬 메쉬입니다. 이견있는 사람?

답변

3

우선이 아키텍처는 매우 복잡합니다. 프로젝트의 예상 수명이 아키텍처에 대한 모든 초기 투자 가치가 있는지 다시 확인하십시오. 최종선 :이 프로젝트는 5 년 또는 10 년 후에도 여전히 비용을 지불합니까? 고객이 비즈니스 가치를 제공하지 않고 몇 개월 동안 아키텍처에 투자 할 수 있습니까?

문제

당신은 당신의 명령 디스패처를 호스팅 무엇인지 언급하지 않았다. 이 부분이 무엇이든 응용 프로그램의 병목 현상이 될 가능성이 큽니다. 매우 높은 성능의 대기열 (예 : ZeroMQ)에서 메시지를 가져 오는 경우가 아니면 반지 버퍼가 필요하지 않다고 생각합니다. 대기열은 대부분의 시나리오에서 정상적으로 작동하며 훨씬 간단합니다. 내가 IO 관리팀 있으리라 믿고있어

질문

이벤트/이벤트 핸들러를 의미한다. 아마 잡을 수없는 다른 뉘앙스가있을 것입니다.

  1. 나는 이것이 웹 애플리케이션에 실제로 의미가 있는지 의심 스럽다. 데이터베이스가 성능 병목 현상이 될 경우 메모리에 도메인을로드하는 것이 좋습니다. 응용 프로그램의 성능 프로필에 따라 다를 수 있으며 이러한 모든 스레드를 관리하기위한 노력은 개발자의 시간 낭비 일 수 있습니다. (주로 응용 프로그램이 종료 될 때 스레드를 중지 시키거나 응용 프로그램을 종료하지 않도록해야하기 때문입니다.) DB를 업데이트 한 후 도메인을 업데이트하는 것에 대한 부분은 나에게 적합하지 않습니다. 시작할 때 도메인 만로드하려고합니다. 도메인의 상태 변경 사항 저장은 다음 시작시 다시로드 될 수 있습니다. 도메인 상태를 유지하기 전에 도메인 상태를 변경해야한다고 생각합니다. 또한 DB가 병목 현상이 많은 경우 상태를 비동기 적으로 저장합니다.

  2. 여기에 몇 가지 단계가 빠져 있다고 생각합니다. 이벤트를 가져 와서 명령으로 전송하려는 곳은 프로세스 관리자 (또는 사가 (Saga)가 선호하는 곳)와 같은 곳입니다. 비즈니스 프로세스는 이벤트를 명령으로 변환하는 것처럼 간단하지 않습니다. 예 : 후속 명령을 완료 할 수 없으면 어떻게됩니까? 또는 명령을 실행하기 전에 둘 이상의 이벤트가 발생해야하는 경우. (예 : ShipOrder가 전송되기 전에 OrderPlaced 및 PaymentReceived가 발생해야 함)

  3. 도메인의 어려운 부분은 일반적으로 모델을 작성하는 가장 적합한 방법을 찾는 것입니다. 도메인 모델이 실제 도메인에 맞지 않으면 코드가 더 어색하고 복잡해집니다. 그 외에도, 그것은 귀하의 도메인에 따라 다릅니다. 당신의 계산법 솔버를 프로그래밍한다면, 아마 그것을위한 것입니다. 그러나 종종 이해되는 비즈니스 로직은 합리적으로 체계적으로 성문화 될 수 있습니다.

  4. 정말 트랜잭션 비트로 무엇을하려고하는지 잘 모르겠습니다. 여러 명령을 하나의 트랜잭션으로 묶으려고합니까? 아마도 도메인을 더 잘 모델링 할 수 있거나 일괄 처리를 수행하는 위치를 나타냅니다. 많은 명령이 일괄 적으로 처리되는 것이 아니기 때문에 항상 하나를 사용하는 것은 낭비입니다. 모든 작업이 일괄 처리되고 일괄 작업의 각 작업이 개별 필드 만 설정하면 DDD 및 작업 기반 UI 사용의 요점을 놓치고 있습니다.

  5. # 1도 참조하십시오. 이 수준의 성능이 필요하다면 괜찮을 것입니다. 도메인은 명령을받는 MVC 응용 프로그램에서 싱글 톤으로 메모리에 호스팅 될 가능성이 큽니다. 공유 메모리에 액세스 할 때 적절한 잠금 기술을 사용하고 있다고 가정합니다. this site은 이러한 주제에 대한 훌륭한 참고 자료입니다. 특히 volatile 키워드로 속지 마세요!

그냥 모든 것이 절충적임을 기억하십시오. 앱에 실제로 도움이되지 않는 아키텍처를 개발하는 데 많은 시간을 낭비하지 마십시오.