2017-10-01 6 views
2

Postgres를 사용하여 이벤트 소싱 시스템을 구현하려고합니다. 가장 좋은 설명은 예제입니다. 내 이벤트가 결국 사람을 설명해야한다고 가정 해 봅시다. 그리고 난 다음 이벤트가 :이벤트의 일관되지 않은 동작으로 이벤트 소싱

  1. PersonCreatedEvent (값 = 100, 필드 = "ID", 날짜 = ..)
  2. AgeUpdated (값 = 10, 필드 = "나이"날짜 = ..)
  3. LastNameUpdate (값 = "newLastName"필드 = "LASTNAME"날짜 = ...)
  4. LocationUpdated (값 = (위도, 긴), 필드 = "위치"날짜 = ...)
  5. 잔액 업데이트 (값 = 1000, 필드 = "잔액", 날짜 = ..)

이벤트 1은 평생 동안 한 번만 발생합니다.
이벤트 2 - 3 여러 번 발생할 수 있습니다.
이벤트 4 - 5 여러 번 여러 번 발생할 수 있습니다. 하루의 끝에서

, 나는 주로 내 테이블에 천만명이있는 경우 이벤트 4, 그래서 5

와 일치하는 테이블로 끝날 것이다, 나는 이벤트 수십억이있을 수 있습니다 동안 그 중 99 %는 기본적으로 4, 5입니다. 이렇게하면 대용량 데이터 저장소가 생겨 Postgres가 잘 작동하는지 확신 할 수 없습니다. (상당한 작업량과 인프라가 증가 할 수 있습니다.)

이것은입니다. 예를 들어, 내 엔티티는 100 개의 필드로 결합 될 수 있습니다. 이는 엔티티 당 적어도 100 개의 이벤트를 의미합니다. 필드 중 일부는 이벤트 4와 5의 특성을 가지고 있습니다.

제 경우에는 이벤트 소싱을 사용하는 것의 부가 가치는 본인의 내적 본질적으로 내 사례에서 제품 요구 사항 인 내역을 얻는 것입니다.

이 경우 가장 좋은 방법은 무엇입니까? 더 자주 속성을 다른 곳에서 처리해야합니까?

업데이트 : 또 다른 예는 장치 집합체를 살펴 보는 것입니다.

  1. DeviceManufacturerUpdated (값 = "시스코", 필드 = "제조", 날짜 = ..)
  2. DeviceNameUpdated (값 = "foo는"필드 = "이름", 날짜 = ...)
  3. DeviceIpUpdated (값 = "1.1.1.1"필드 = "IP"날짜 = ...)
  4. DeviceLocationUpdated (값 = "새로운 위치"필드 = "위치"날짜 = ...)
  5. DeviceLastSeenUpdated (value = "some date", field = "last_seen", date = ...)
여기 1. 이벤트 1과 동일

은 2 이벤트 2 4. 이벤트 4 일 5 차례 heppen 수있는 모든 일 heppen이 수 차례 3. 이벤트 3 heppen 수있는 한 시간을 heppen 수 있습니다.나는 위해 Postgress 이상이 구현하고있는 경우 이벤트 (5)는 주로 이벤트 4, 5가 들어 나는 거대한 테이블 끝날 분마다

을 heppen 수

+0

스냅 샷이 도움이 될 수도 있지만 특정 시점에서 필자는 데이터베이스 크기와 관련하여 어떤 조치를 취해야한다고 가정합니다. (크기는 지속되는 이벤트의 "유형"결과입니다). 어떤 시점에서는 스냅 샷이 남지만 이벤트 삭제 후 내역 기능을 잃게됩니다. 내 테이블이 같은 이벤트 유형의 99 %로 구성되어있을 때 내가 뭔가 잘못하고있는 것처럼 느껴집니다. 그것은 내가 알지 못하는 최적화를위한 공간이있는 것처럼 느껴집니다. : - | 어떻게 생각해? – Tomer

답변

2
내 엔티티에서 의미 100 개 필드의 결합 될 수

아마 당신의 이벤트가 잘못 곡물에 당신의 개체 모델을 나타냅니다

해당 엔티티 당 적어도 100 개 이벤트. 도메인에서 일어나고있는 100 가지 속성에 영향을 미치는 한 가지 "물건"은 일반적으로 하나의 데이 터가있는 많은 이벤트가 아니라 많은 양의 데이터가있는 하나의 이벤트로 사용자의 기록에 나타납니다.

잠재적으로 많은 수의 이벤트로 끝나지 않을 것이라고 말하는 것은 아닙니다. 특히 엔티티가 많은 경우 특히 그렇습니다.

두 가지 공통적 인 답변이 있습니다. 하나는 에서 빌려옵니다. 우리는 집계의 측면에서 도메인을 생각합니다 - 서로 격리 될 수있는 국가 컬렉션. 엔티티가 분리 될 수 있기 때문에 동일한 내구성 저장소에 있는지 또는 저장소가 공유되는지는 중요하지 않습니다. 따라서 이벤트를 배포 할 수 있습니다.

또 다른 가능성 - 많은 영역에서 자연적 시간적 리듬이 있습니다. 회계 연도 말에 현재 상태를 롤업하고 그 상태를 사용하여 새 스트림의 시작을 표시하고 이전을 폐기합니다.

가비지 수집 가능성이 있습니다. 적절한 데이터 구조를 사용하면 낮은 가치의 이벤트를 대체하여 백그라운드 프로세스를 통해 기록을 갈아 엎을 수 있습니다.

중요한 것은 crud 소싱이라는 개념에서 벗어나는 것입니다.

더 넓게는 비즈니스가 엔티티의 전체 기록을 추적 할 때 가치를 창출하는지 여부도 고려해야합니다. 비용/이익 분석에서 정보를 문서 스냅 샷에 저장하라는 내용의 엔터티에 대해 이벤트 기록을 사용해서는 안됩니다.

3

제게는 당신이 (세분화 된) CRUD 시스템을 갖고 있으며, Event sourcing이 필요하지 않은 것으로 보입니다. 이것은 나쁘지 않습니다. 명령의 유효성을 검사하기 위해 기록에서 모든 이벤트를 다시 적용하여 상태를 재구성 할 필요가 없습니다. 귀하의 경우 일 수도 있고 일 수도 있습니다. 현재 상태로 충분합니다.

이벤트 아이디어가 마음에 드시면 이 필요하고이 필요하면 Event log을 사용할 수 있습니다. 이것은 Event sourcing과 비슷하지만 결국 일관된 방식으로 이벤트를 사용하며 읽기 측에만 사용합니다.

어쨌든 동작별로 엔티티를 분할하려면 DDD을 사용할 수 있습니다. 동일한 ID (예 : PersonDetailsPersonAccountBalance)를 공유하는 두 개의 집계를 사용할 수 있습니까? 왜? 잔액을 업데이트 할 때 잔액이 긍정적인지 확인 할 때 사람의 이름 (또는 위치)이 필요하지 않기 때문에 (약 update his balance이고 makeADeposit 또는 withdrawMoney이 아닌 이상하지만 도메인에 따라 다름).

+0

감사합니다. 내 생각에 BalanceUpdated가 약간의 실수를 저질렀다고 생각합니다 ... 나쁜 예입니다. 이벤트 소싱을 사용하면 사람의 역사를 알고 싶었고 언제든지 그 사람을 설명했습니다. 합계 사람을 해결해 봅시다. 매우 자주 업데이트되는 속성이 있으면 diffrenetly 처리해야합니까? 내 테이블이 동일한 이벤트 유형의 99 %로 구성된 경우 무언가가 잘못되었다고 느낍니다. – Tomer

+0

@Tomer 정말 각 경우에 따라 다릅니다. 나는 그것을 확실히 말하기 위해서 정확한 사업 내용을 알아야합니다 ... –

+0

당신은 완전히 옳습니다. 나는 유스 케이스를 더 잘 나타내는 예제를 추가했다. 네 생각은 어떤지 말해봐. – Tomer

2

내게는 동일한 집계 루트에 AgeUpdated 및 BalanceUpdated 이벤트가있는 것이 이상하게 보입니다. 이있는 이벤트 CRUD 사용 사례이거나 전체 디자인에 대해 더 많은 작업을해야한다는 것을 자신의 이름으로 속삭입니다.

사람 대신 재미있는 거래 그룹이 있습니까? 이것을 파악하려면 불변량 인이 있어야한다고 생각해야합니다. 즉, 어떤 상황에서 트랜잭션이 실패 할 수 있으며 항상 참이어야합니다. (그렇지 않은 경우 도메인 기반 디자인 집계를 읽으십시오)

예를 들어 계정에 대해 일종의 거래를하고 있다면 비즈니스 규칙은 계정을 $ 100 이상 초과 할 수 없다는 것입니다. 이 경우 계정을 소유 한 사람 대신 계정을 집계 루트로 사용할 수 있습니다.

사람의 균형을 완벽하게 유지하려면 읽기 모델이 있어야 사용자의 모든 것을 집계 할 수 있습니다.

하지만 모든 것은 사용 사례에 따라 다릅니다.

행운을 빈다.

+0

고마워요! BalanceUpdated가 약간의 실수를 저지른 것 같아요. 그것이 실제로 사람 집계에 속하지 않아 그것을 beacuse. 이벤트가 Person aggregate와 관련이 있다고 잠시 생각해 봅니다. (아마도 locationupdated가 더 낫지는 않습니까?)이 이벤트가 실제로 올바른 위치에있는 경우를 어떻게 처리해야합니까? 빈도는 다른 이벤트보다 * 100 더 큽니까? – Tomer

+0

귀하의 우려 사항에 따라 다릅니다. 나는 근본적으로 많은 뿌리깊은 사건들을 가지고있는 것이 본질적으로 잘못이 아니라고 생각한다. 성능에 대해 걱정한다면 스냅 샷과 같이 좀 더 복잡한 것을 구현하기 전에 실제로 문제가되는지 측정하십시오. 너무 많은 인프라를 구축하지 않고 도메인 로직을 실험하고 싶다면 CQRS/ES 애플리케이션 구축을위한 새로운 서비스 https://serialized.io (공동 창업자 중 한 명입니다) . –

관련 문제