2016-09-02 10 views
0

하려면 다음을 게시 할 때ACID 속성을 사용하여 Kafka + 데이터베이스와 같은 로그를 작성 하시겠습니까? 구조의이 종류을 어떻게 테스트 계획입니다

모든 데이터가 로그에 사실로 저장됩니다

http://www.confluent.io/blog/turning-the-database-inside-out-with-apache-samza/하지만 검증은 변화가 테이블에 있어야합니다 . 예를 들어, "고객 1과 함께 송장 생성"을 보내면 고객이 존재하는지 다른 것들이 있는지 확인한 다음, 유효성 검사가 로그에 적용되고 현재 변경 사항을 테이블에 적용하면 테이블에 가장 최신의 정보는 아직 모든 변화의 역사가 있습니다.

로그를 데이터베이스의 테이블에 넣을 수 있습니다 (PostgreSQL 사용). 그러나 나는 그것의 확장성에 대해 우려하고 또한 여러 클라이언트와 PG의 이벤트 스트림에 대한 폴링없이이 작업을 수행 할 수있는 다른 RDBMS를 승인하고 싶습니다.

그러나 카프카를 사용하면 두 저장소간에 ACID가 걱정되므로 카프카가 PG 롤백 또는 이와 유사한 데이터를 잘못 얻을 수 있습니다.

그래서 :

1 2- 빠른 이벤트 저장을위한 실시간 조정 PG (또는 다른 RDBMS)에 suscribe 할 수있는 RDBMS 및 로그 저장 또는 사이에 일관성을 유지할 수 있습니까?

+0

. 변경 로그는 당신이 그것을 나가고 싶은 유일한 것입니까? – Tim

+0

그리고 여러 클라이언트에서 구독 할 수 있습니다. 나는 그것이 폴링을 사용할 필요가 있기 때문에 DB에 많은 압력을 가할 수 있다고 걱정한다. – mamcx

답변

0

쉽게 제공 질문 (1) 답변 :

  1. 설정하여 transaction isolation level 제대로 일관성을 유지하고 DB 롤백에 대해 걱정하지 충분히있을 수 있습니다. 격리 수준을 '직렬화 가능'으로 설정하지 않는 한 때때로 불일치가 발생할 수 있습니다. 그럼에도 불구하고, 당신은 일관성이 보장되지만 여전히 바람직하지 않은 행동을 할 수 있습니다. 예를 들어, 고객은 고객을 생성하고 비동기 API를 사용하여 인보이스를 신속하게 연속적으로 배치하며 인보이스 이벤트는 우선 지원 시스템을 조회합니다. 이 경우 인보이스 이벤트는 무효화되고 고객은 그 시간까지 고객이 생성되기를 바랄 필요가 있습니다. 클라이언트를 제어하고 동기화 API를 사용하도록 요구하는 경우 피하기 쉽습니다.

  2. 이벤트를 관계형 데이터베이스에 저장할 수 있는지 여부는 예상 한 데이터 집합 크기, 하드웨어 및 액세스 패턴에 따라 다릅니다. 나는 큰 시간 Postgres 팬이며, 당신이 할 수있는 일은 굉장히 빨리 이벤트 조회를 할 수 있습니다. 내 경험에 비추어 볼 때 - 운영 테이블 크기가 2300 ~ 300GB 미만이고 괜찮은 서버를 사용한다면 Postgres는 갈 수있는 방법입니다. 이벤트 소싱에는 일반적으로 조인이 없으며 공통 액세스 패턴은 모든 이벤트를 ID로 가져 오는 것입니다 (선택적으로 시간 소인으로 제한됩니다). Postgres는 이러한 종류의 쿼리에서 탁월합니다. 그러나 이벤트 구독자는이 데이터를 가져와야하기 때문에 수천 명의 구독자가있는 경우 좋지 않을 수 있습니다. 실제로는 드물게 발생합니다.

"개념적으로 올바른"답 : 여전히 스트리밍 방식을 추구하고 근본적으로는 시스템의 모든 이벤트를 통해 이벤트 주문 보증을 제공해야 다음 경쟁 조건을 해결하십시오. 예를 들어 언제든지 '고객 1 추가'이벤트를 주문하고 '고객 1의 청구서 작성'이벤트를 수행하여 일관성을 보장 할 수 있어야합니다. 이것은 일반적으로 분산 시스템 (예 : 벡터 시계 참조)에 대해 해결하기가 정말 어려운 문제입니다. 특정 사례에 적합한 영리한 트릭으로 완화 할 수 있습니다 (예 : 위 예제에서 'customerId'로 이벤트를 분할하여 백엔드에 도달하면 일찍 분할 할 수 있습니다. 그런 다음 동일한 고객과 관련된 모든 이벤트가 생성 된 순서대로 (대략) 처리되도록 보장 할 수 있습니다.

필요한 경우 내 포인트를 명확히 설명해 드리겠습니다.

(1) 단순 대 쉬운 : 당신이 단지 DB를 사용하여 대 등 설치를 달성하기 위해 원하는 것을 분명하지 않다 mandatory link

+0

1) 사용 가능한 "트릭"이있는 자원 목록 또는 서적이 있습니까? 2) 나는 데이터가 크지 않을 것이고 잠재 고객은 작은 상점 주인이라고 생각한다. 나는 데이터베이스에 직접 kafka에 로그를 쓰는 대신 로그를 테이블에 쓴 다음 로그를 INTO kafka로 가져온다 고 생각한다. 결국 (DB에 대해 1 클라이언트 만) 그런 다음이를 사용하여 구독자에 대한 데이터를 배포하십시오. 그래서 DB -> LogInDb -> Pull -> LogInKafKa -> PUSH -> Clients가 있습니다. – mamcx

+0

나는 알고있다. 응용 프로그램이 허용 할 수있는 트레이드 오프에 따라 다릅니다. 나는 그것이 일반화하기 어려울 것이라고 상상한다. – Tim