2017-02-15 5 views
2

저는 Employee 엔티티를 액터로 나타 냈습니다. 나는 또한 배우로 모델링 된 2 가지 서비스를 가지고있다. 둘 다 메시지를 보내서받은 Employee 액터의 상태를 조작합니다. 이제 두 서비스가 동일한 액터를 처리하고 있다고 가정 해 봅시다. 지금은이 괜찮 직원 배우가 두 서비스 A에서 다음과 같은 순서로 상태 변경 메시지를 수신하는 것이 완벽하게 가능하며 B액터 모델에서 MVCC를 얻는 방법

Employee <- |a1|a2|a3|b1|b2|b3|

. 그러나 때로는하지

Employee <- |a1|b1|a2|b2|a3|b3|

어쩌면 a2a1에 의해 변경 상태에 의존했지만, b1 우리가 하나의 스냅 샷/버전으로 작업 할 수 있도록, 우리는 트랜잭션을 데이터베이스에 비유에서 그것을

변경 트랜잭션 수명 동안 데이터의

필수 모델에서 우리는 전체 직원 개체를 잠그고 데이터베이스가 수행하는 것과 비슷한 상태를 업데이트합니다.

액터가 일련의 메시지로 처리되는 대량 메시지를 수신 할 수 있습니까? 아니면 내 데이터 자체 모델링에 결함이 있습니까?

답변

5

실제로 a1-a3과 b1-b3이 무엇을 나타내는지는 모르므로 질문에만 올바르게 답할 수 있습니다. 나에게 메시지가 너무 세밀하게 나왔다. 예를 들어, 아마도 a1-a3은 각 메시지에서 하나의 데이터 속성 만 설정하려고합니다. b1-b3도 마찬가지입니다.

그러나 메시지에 중점을 두어야 할 것은 개별 특성을 설정하는 것이 아니라 Employee에서 동작을 유발하는 것입니다. 따라서 자신이 제안한대로 메시지를 행동으로 디자인하십시오. 여기서 a1-a3은 단일 작업 요청으로 축소됩니다. 이것은 종종 커맨드 패턴 (command pattern)이라고 불리며, 오브젝트/액터에게 명령을 내리거나 명령을 내리십시오. 이렇게하면 메시지 당 올바른 트랜잭션 경계가 생깁니다.

나는 "object/actor"라고 말한 것에 유의하십시오. 액터뿐만 아니라 객체 디자인에서도 동일한 접근법을 사용할 수 있습니다. 도메인 객체/배우를 멍청한 데이터 보유자로 취급하는 대신 의도를 밝히는 인터페이스를 생각해보고 도메인 모델에 자신이 원하는 것을 말하십시오.

귀하의 질문에 대한 답변입니다. HTH.

본은

+0

. 트랜잭션 블록 내부에서 작성한 변경 사항이 무엇이든간에 단일 메시지를 사용하여 트랜잭션을 완전히 수행하는 메시지를 만들었습니다! 감사! –

1

둘 다 그것에게 메시지를 전송하여이 받은 직원 배우의 상태를 조작 할 수 있습니다.

음. 정의에 의한 액터는 상태 나 조작을 다른 액터와 공유하지 않습니다. 모든 상태 조작은 메시지 처리 범위 내에서 트랜잭션입니다. 액터는 그 의미에서 집합체를 나타냅니다. 메시지는 일반적으로 도메인 이벤트/명령이며 범위와 유비쿼터스 언어의 일부를 포함합니다. DDD 추론은 액터를 생각할 때 많은 도움이됩니다.

내 두 센트

내가 함께 결국 무엇

세르지 <> <

+0

"단일 메시지 내에서 돌연변이/트랜잭션 동작을 제한해야합니다". 이것은 액터 모델 –

+0

에 실제로 적용해야하는 패턴입니다. 따라서 DDD와 ActorModel 패러다임이 어떻게 모여서 EventSourcing과 CQRS를 자연스러운 선택으로 만들어 궁극적 인 결과 일관성을 부여하는 것이 좋습니다. –

+0

@SergiyChernets Microsoft Channel9 전시회 (DDD 및 CQRS on Service Fabric)에서 여러분의 연설을 회상합니다. 이론 부분과 다이어그램에 대한 이야기는 좋았지 만 (데모) 구현은 내 기대에 조금 못 미쳤습니다. 너무 복잡하고 지원 코드가 많아 실제 도메인에서 초점을 흐트러 뜨립니다. 제 생각에는 문제는 C# 문법 자체입니다. 나는 Erlang과 유사한 개념을 구현했으며 훨씬 우아했습니다. F # 대신 사용해 보셨나요? – ajukraine