방금이 기사를 읽었으며 혼란스러워합니다.
하나의 webapp과 하나의 고유 한 응용 프로그램이 "작업자"역할을 하고 동일한 데이터베이스를 공유 한다고 가정 해 봅시다 .
아, "공유"라고했는데이 기사에서는 무엇에 대해 경고합니까? :
넷째, 응용 프로그램 (또는 서비스)간에 데이터베이스를 공유하는 것은 좋지 않습니다. 비정질 공유 상태를 거기에 넣는 것은 너무 유혹적이며 그것을 알기 전에는 엄청나게 결합 된 괴물이 있습니다.
=> 동의하지 않습니다. 개별 응용 프로그램이 여전히 동일한 장치의 일부인 경우가 있으므로 "커플 링 문제"라는 개념은이 경우에 의미가 없습니다.
계속하자 : webapp는 클라이언트 HTTP 요청을 처리하고 언제든지 일부 집계 (DDD 용어)를 업데이트하여 해당 도메인 이벤트를 생성 할 수 있습니다.
작업자의 목표는 필요한 작업을 처리하여 해당 도메인 이벤트를 처리하는 것입니다.
요점은 :
이벤트 데이터를 작업자에게 어떻게 전달해야합니까?
읽은 기사에서 알 수 있듯이 첫 번째 해결책은 훌륭한 메시지 지향 미들웨어 인 RabbitMQ를 사용하는 것입니다.
작업 과정은 간단합니다.
웹 dyno가 이벤트를 생성 할 때마다 RabbitMQ를 통해 이벤트를 게시하여 작업자에게 피드를 제공합니다.
단점은 잠재적 전송 실패 또는 하드웨어 문제를 처리하지 않고 집계 업데이트 커밋과 이벤트 게시간에 즉각적인 일관성을 보장하는 것이 아무것도 없다는 것입니다 . 그것은 또 다른 주요 이슈입니다.
예 : 도메인 업데이트의 잘못된 표현을 나타내는 이벤트에서 집계 업데이트가 성공하지 않고 이벤트가 게시되었을 수 있습니다.
글로벌 XA (2 단계 커밋)가 존재한다고 주장 할 수 있지만 모든 데이터베이스 또는 미들웨어에 적합한 솔루션은 아닙니다.
그렇다면 이러한 즉각적인 일관성을 보장하는 좋은 솔루션은 무엇입니까? :
IMO, 데이터베이스에 이벤트를 집계 업데이트와 동일한 로컬 트랜잭션으로 저장합니다.
간단한 비동기식 스케줄러가 생성되어 데이터베이스에서 현재 게시되지 않은 이벤트를 쿼리하고이를 RabbitMQ로 보내어 작업자를 채 웁니다.
그러나 왜 webapp 측에 추가 스케줄러가 필요합니까?이 경우 RabbitMQ가 필요한 이유는 무엇입니까?
이 솔루션을 사용하면 특히 데이터베이스가 공유되므로 RabbitMQ가 불필요 할 수 있습니다.
실제로 어떤 경우이든 즉각적 일관성 에는 데이터베이스의 폴링이 포함됩니다.
따라서 왜이 설문 조사에 대해 근로자가 직접 책임을지지 않습니까?
따라서 왜 웹에서 많은 기사가 데이터베이스 큐잉을 거의 비판하지 않고 메시지 지향 미들웨어를 홍보하는지 궁금합니다.
기사의 발췌 :
간단하고 업무에 적합한 도구를 사용하십시오.이 시나리오는 메시징 시스템에 적합하지 않습니다. 위에서 설명한 모든 문제를 해결합니다. 더 이상 폴링, 효율적인 메시지 전달, 큐에서 완료된 메시지를 지울 필요가 없으며 공유 상태가 없습니다.
그리고 즉각적인 일관성, 무시?
요약하면 실제로 데이터베이스 공유 여부에 관계없이 데이터베이스 폴링이 필요한 것 같습니다 .
몇 가지 중요한 개념을 놓쳤습니까?
감사