2016-09-29 5 views
0

간단한 게임의 도메인을 모델링하고 싶었습니다.DDD 디자인 통신 집계

우리에게는 다른 건물을 살 수있는 선수가 있으며, 주식도 있고 선수는 앞으로 추가 할 다른 것들을 가질 수 있습니다. 하지만 지금은 빌딩과 주식에만 집중하고 있습니다.

나는 Player, PlayerBuildingManagment, PlayerStock의 세 가지 집계 루트로 나누기로 결정했습니다. Stock과 PlayerBuildingManagment가 Player와 매우 관련되어 있기 때문에 적절한 부분인지 확실하지 않으므로 mayby는 집계되지 않아야합니다. 반면에 나는 거대한 집계를 하나 만들고 싶지 않습니다. 모든 경우에 재고 관리가 필요하기 때문에 건물 관리가 한 명의 플레이어에 의해서만 수정 될 수 있기 때문에 병행 성은 문제가되지 않습니다. 플레이어가 이렇게 건물을 살 곳

플레이어

증권 1 AddToStock() 2 TakeFromStock()

PlayerBuildingManagment 1. AddBuilding는()

지금은 프로세스를 구현해야합니다 필요합니다

  1. 자원이 충분한 지 확인하고 재고가 있는지 확인하십시오. .TakeFromStock()
  2. 건물 PlayerBuildingManagment.AddBuilding()을 추가해야합니다.
  3. 데이터를 유지합니다.

나는하지만 우리가 하나의 트랜잭션 내에서 두 개의 집계의 상태를 수정해서는 안 알고에서 하나의 서비스 함수 내에서이 프로세스를 실현할 수 있습니다. 이 의사 전달이 어떻게 실현되어야한다고 생각하니? 아마도 플레이어 집계 내에 재고 및 건물 관리를 구현해야합니다. 또는이 프로세스를 위해 일부 프로세스 관리자를 생성하십시오. 좀 실마리를주세요.

+1

경합이없는 단일 스레드 프로세스의 경우 경계가 무엇인지는 중요하지 않습니다. 단일 트랜잭션에서 여러 집계를 수정하지 않는 규칙은 여기에없는 트랜잭션 실패 수를 줄이는 것입니다. 또한 가능한 경쟁 조건이 없으므로 잠금 메커니즘이 필요하지 않습니다. – plalx

답변

0

집합 적으로 일관성있는 경계가되는 집계 간의 트랜잭션 일관성 확보는 문제가되지 않습니다.

플레이어, 은행처럼 행동하는 PlayerStock, 계약자처럼 행동하는 PlayerBuildingManager가 있다고 가정 해 보겠습니다.

  • 플레이어 : 충분한 재고 및 비용 X에 대한 플레이어 P에 의해 건물 Y를 구축하는 요청에 대한 확인의 문제에 대해서

    , 나는 아마도 PlayerStock이 매개 변수를 하나의 명령을 집계 보낼 것 주식 포획에 성공하면 ID, P, 주식의

  • 양이
  • 이 무엇을, X을하고하기 : 여기

PlayerStoc이 메시지의 발신자 k는 성공하면 다른 사람에게 메시지를 효과적으로 전달하는 "수행 할 작업"을 제공합니다 (실패하면 "수행 할 작업"이있을 수도 있지만 이는 또 다른 문제입니다).

"what to do"메시지 매개 변수는 플레이어 X에 대한 건물 Y를 빌드하는 명령을 인코딩하며 PlayerBuildingManager로 전송됩니다.

나머지는 여러 집계의 일반적인 최종 일관성으로 처리 할 수 ​​있습니다.

따라서 UI를 통한 일부 컨트롤러는 PlayerStock에 플레이어 X로부터 일정 금액 X를 차감하고 성공시 메시지를 보내는 메시지를 PlayerStock에 보냅니다. 성공하면 playerBuildingManager가 플레이어 P의 건물 Y를 생성하라는 메시지 인 성공 메시지를 실행합니다. 주식이 차감되었지만 건물이 아직 구체화되지 않은 최종 일관성 기간이 있습니다. 이것이 다중 집계를 사용할 때 당신이 구입하는 궁극적 인 일관성입니다.

성공한 메시지를 매개 변수로 인코딩하는 이유는 PlayerStock를 구성 할 수있는 카탈로그와 누가 구성 할 수 있는지에 대해 더 느슨하게 결합 할 수있게하기 위해서입니다. 임의의 성공 메시지를 매개 변수로 사용하면 PlayerStock이 지나치게 많은 것을 알지 않아도 높은 수준의 유연성을 제공합니다.

(. 당신이 처리하지 않으려면 물론, 같은 집계에 그들 모두를 넣을 수 있습니다)


이 더 가고 싶은 경우

이의이 말을하자 PlayerBuildingManager는 PlayerStock에서받은 명령으로 건물을 짓는데 실패합니다. 글쎄요, 주식을 돌려 주어야합니다. 그러나 느슨하게 결합 된 상태를 유지하기 위해 PlayerStock은 P를 PlayerStock에 X를 반환하는 메시지를 보낼 수 있습니다.

또한 건물의 대기 시간이 실시간이 아니라 실시간으로 이루어지면 어떻게 될지 고려해보십시오 (현실 세계 에서처럼). 이 경우 플레이어는 공사를 취소하고 싶어 할 수도 있고 허용하지 않을 수도 있습니다 ...

+0

당신이 묘사하는 것은 프로세스 관리자 a.k.a Saga가 가장 잘 처리하는 것 같습니다. – plalx