2012-04-27 3 views
3

데이터베이스에서 읽기 및 쓰기 작업을 수행하고 알림을 받기 위해 WCF 서비스에 연결하는 클라이언트 시스템을 디자인해야합니다.WCF + CQRS + 푸시 알림

나는 CQRS 패턴을 사용한다고 들었다. 예를 위해서

는, 클라이언트는 제품 및 업데이트 제품가져 오기 목록 등의 작업을 수행 할 수 있도록 서비스에 연결됩니다. 또한 과 같은 조치를 취할 수 있습니다.배송 거부 (먼저 수행하는 클라이언트간에 경쟁을 유발할 수 있습니다). 한 명의 고객 만이 선적을 '수락'하거나 '선적'할 수 있습니다.

그래서 CQRS에 대해 조금 읽었으며 읽기와 쓰기 (명령 사용)가 분리되어 있음을 알았습니다. 그러나, 나는 내가 CQRS 사용하는 경우 몇 가지 주요 문제에 대한 확실하지 않다 : 나는 WCF 서비스에 CQRS 패턴을 사용하는 경우

  1. 을 - 나는 데이터베이스에 기적을 수행되는 것을 믿을 수 있습니까? 조금 혼란 스럽습니다. 서비스가 단일 스레드 (미래의 확장 성 지원)가되는 것을 원치 않지만, 다른 한편으로는 - 서비스에 대한 쓰기 작업이 올바른 순서로 수행되도록하려면 어떻게해야합니까? 또는 심지어 읽기 작업? CQRS 패턴이 주문 처리를 보장합니까? (누군가가 here에게 CQRS 패턴이 오프라인 처리 요청을 업데이트하기 위해 '업데이트'대기열을 사용한다고 말했습니다.)

  2. CQRS를 사용하면 동시성 문제가 제거됩니까?

  3. 데이터베이스와 상호 작용하는 모든 명령 처리기에서 'TransactionScope'를 사용해야합니까?

  4. 나는 행운과 함께 클라이언트를위한 알림 서비스를 구현하는 방법을 이해하는 데 일주일 이상을 보냈다. design http://s16.postimage.org/aqakx6j9f/asdf.png

'제품 서비스'는 CQRS 서비스가 될 것입니다,하지만 난 알림 서비스에 문제가 :이 design가 있습니다. 클라이언트는 카테고리 X의 제품에 대한 알림을 받기 위해 제품 서비스에 명령을 보낼 수 있습니다.이 명령은 데이터베이스의 요청을 업데이트합니다. 지금까지 알림 서비스가 15 분마다 데이터베이스를 폴링하고 어떤 사용자가 어떤 카테고리에서 폴링하기를 원하는지 확인한 다음 해당 제품 카테고리에 대한 알림을 요청한 사용자에게 새 제품을 보냅니다. 사용자가 제품 범주를 변경하고 20 명의 다른 사용자가 이미이 제품을 알림 창에 표시하면 어떻게됩니까? 제품이 더 이상 해당 카테고리에 속하지 않음을 감지하고 과 같은 알림을 '보기에서 해당 제품 제거'해야합니다. 알림과 너무 흡사합니다. '데이터베이스 테이블에 대한 지속적인 뷰를 요청하십시오. 모든 변경 사항이 클라이언트의 화면'에 반영되어야합니다.. 이 종류의 알림 서비스를 어떻게 수행합니까 ??

답변

2

이 질문은 귀하의 특정 질문에 대한 답변이 아닐 수도 있지만, yor 신청의 여부, 왜, 그리고 어떤 부분에서 CQRS를 전혀 사용하거나 (또는 ​​사용해야하는지) 평가하는 데 도움이 될 수 있습니까?

특히 : CQRS는 무엇이든지 상관없이 적용되어야하는 것은 아니며 응용 프로그램 전체에서 가장 중요한 아키텍처 스타일도 아닙니다.

CQRS는 단일 및 잘 지정된 경계 컨텍스트 (Eric Evans의 도메인 기반 디자인 참조)에 적용 할 때 많은 이점을 제공 할 수 있습니다. 당신이나 당신의 팀이 먼저 요청해야

질문 :

  • 내 응용 프로그램의 경계 컨텍스트는 무엇입니까?
  • 각 BC에 대해 : 기본적으로 CRUD입니까, 아니면 더 복잡하고 정교한 모델링이 필요합니까?
  • 만약 CRUD라면 복잡하고 문제가 이미 해결 되었으면
  • 으로 구현하십시오. 휠을 재발 명할 필요가 없습니까? 아니면 완성 된 솔루션 (개념적으로 또는 심지어 소프트웨어 한 조각)을 사용할 수 있습니까?
  • 우리가 직접 구축해야하는 경우,이 특정 BC가 주요 비즈니스 가치를 제공하며 구현에서 제공합니까? 예를 들어 경쟁 우위의 가능성? (도메인 기반 디자인의 "핵심 도메인"을 참조하십시오.)
  • 위의 내용이 적용되면 다양한 아키텍처 스타일을 연구하고 가장 적합한 것을 선택하십시오.

짧은 설명 : 전체 응용 프로그램에 스타일을 적용하지 마십시오. BC를 식별하고 각각의 요구 사항을 충족시키는 가장 간단한 솔루션을 사용하십시오. 이것은 CQRS가 될 수 있지만 대부분 응용 프로그램 내의 1 ~ 2 개의 BC에 해당됩니다.

가장 복잡한 응용 프로그램 부분의 노력을 집중 시키십시오. 은 형식화되고 CQRS를 사용하여 구현되면 실질적인 이점을 제공합니다.

0
  1. 데이터베이스는 동기식으로 작업을 수행하지 않으며 데이터베이스 트랜잭션 격리 수준의 규칙에 따라 인터리브 된 트랜잭션을 사용합니다. 그러나 그들은 거래의 일부로 지표를 업데이트합니다. 이것이 중요한 부분입니다.
  2. 아니요. 그렇다고해서 데이터베이스 테이블과 같이 경합이 짙은 리소스가있는 여러 독자를 차단하는 단일 작성자 문제를 해결합니다. 예 : 내가 작업 한 시스템에서 폭발 데이터가 센서에서 삽입되고 사용자를위한 보고서 작성의 일부로 읽혀졌습니다. 이것은 CQRS가 잘 맞는 장소입니다. CQRS의 대부분의 구현에는 동시성 문제가 있습니다. DDD와 함께 사용하면 실제로 동시성이 크게 달라지는 비즈니스 논리입니다. 그러나 스택이 없거나 멱등환 및 메시지 순서 재 지정으로 죽지 않는 것과 같은 다른 속성을 얻을 수 있습니다.
  3. 두 개의 데이터베이스가 있습니다. 하나는 이벤트 (이벤트 소싱을 수행하는 경우)/엔티티 및 이벤트 당 최신 상태로 유지하려는보기마다 다른/여러 개의 다른 이벤트를 저장하는 이벤트입니다.
  4. MassTransit + SignalR과 같은 것을 사용하고 싶을 것입니다. 이벤트를 구독하고 SignalR-hub를 통해 브라우저에 알림을 푸시하는 읽기 모델 (기본적으로 DTO/화면)을 만듭니다.