해결된 질문
작성
·
96
0
학습 관련 질문을 최대한 상세히 남겨주세요!
고민 과정도 같이 나열해주셔도 좋습니다.
먼저 유사한 질문이 있었는지 검색해보세요.
인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
1.
"Message Relay는 전송이 실패한 이벤트에 대해서만 Outbox Table에서 polling하면된다 "
그리고 생성 10초 이후 이벤트를 polling 하는 이유가
"중복 이벤트 발송을 방지하기 위해서"라고 말씀하셨는데 그 부분이 잘 이해가 안됩니다.
우선 첫번째로,
예를 들어 위와 같은 상황에서
1.Article Service는 API 요청을 받으면 2가지 동작을 한다.
2.Message Relay로 직접 이벤트를 전달하고, Outbox table에 이베트를 삽입한다.
위와 같이 이해를 했습니다.
그런데 이 2가지 동작 다음에
"Message Relay는 전송이 실패한 이벤트에 대해서만 Outbox Table에서 polling해서 중복된 이벤트를 처리하는 일이 없도록 한다"라는 동작을 어떻게 어떤 순서로 수행할 수 있는건가요??
그리고 여기에 추가로
"생성 10초 이후 이벤트를 polling 해서 중복 이벤트 발송을 방지할 수 있다"라는 부분도 어떤 순서로 동작하기에 가능한 일인지 잘 모르겠습니다
제가 헷갈리는 부분은
이벤트를 직접 받기도 하고,
2.위 ppt 설명에서
2개의 애플리케이션이 있다면, 0~1번 샤드와 2~3번 샤드를 각각 polling한다.가 잘 이해가 되질 않습니다.
예를 들어
A 애플리케이션이 0~1번 샤드에 할당된 상태
B 애플리케이션이 2~3번 샤드에 할당된 상태일때,
만약, A 애플리케이션의 데이터가 유실됐다는 오류가 발생 -> Message Relay는 Outbox table에서 0~1번의 샤드만 polling한다.
이런 식으로 이해하면 옳게 이해한 것이 맞을까요?
매번 질문글에 상세한 답변 감사합니다
좋은 하루 되세요
답변 2
0
blackhole124님, 안녕하세요!
"Message Relay는 전송이 실패한 이벤트에 대해서만 Outbox Table에서 polling하면된다 "
그리고 생성 10초 이후 이벤트를 polling 하는 이유가
"중복 이벤트 발송을 방지하기 위해서"라고 말씀하셨는데 그 부분이 잘 이해가 안됩니다.
최초에 api 요청이 들어왔을 때,
outbox 테이블 데이터 삽입
이벤트 발송
outbox 테이블 데이터 삭제
위 과정이 일어나게 됩니다.
즉, 이벤트 발송이 정상적으로 처리되었으면, 이미 outbox 테이블에는 데이터가 삭제가 되어있어야 합니다.
재처리 스케줄러가 10초 지난 outbox 데이터를 polling 하는데, 이게 있으면 데이터는 최초에 즉시 발행되지 못했음을 의미하므로 데이터가 조회됩니다.(발행 완료된건 삭제했으므로)
그런데 만약 10초 딜레이가 없다고 가정해보겠습니다.
api 요청으로 인해 outbox 테이블 데이터 삽입된 시점에,
재처리 스케줄러가 "동시"에 해당 데이터를 조회할 수 있습니다.
api 요청은 삽입했던 outbox 테이블을 조회하고, 이벤트 발행하고, outbox를 삭제합니다.
이벤트는 분명 발행된 상태입니다.
그런데 재처리 스케줄러도 그 찰나의 순간에 동일한 데이터를 조회한 상황이라, 이벤트를 불필요하게 중복 발행합니다.
"동시성" 상황에는 아주 작은 확률이지만, 이러한 문제가 발생할 수 있는 것이고,
짧은 지연(10초)을 넣어서 해결한 것입니다.
2개의 애플리케이션이 있다면, 0~1번 샤드와 2~3번 샤드를 각각 polling한다.가 잘 이해가 되질 않습니다.
예를 들어
A 애플리케이션이 0~1번 샤드에 할당된 상태
B 애플리케이션이 2~3번 샤드에 할당된 상태일때,
만약, A 애플리케이션의 데이터가 유실됐다는 오류가 발생 -> Message Relay는 Outbox table에서 0~1번의 샤드만 polling한다.
이런 식으로 이해하면 옳게 이해한 것이 맞을까요?
네, 맞습니다! 각 애플리케이션의 재처리 스케줄러는 자신에게 할당된 샤드만 polling합니다.
각 샤드마다 단일 스레드로 처리하고 있으므로, 여러 애플리케이션에 샤드를 균등하게 할당해서, 컴퓨팅 리소스 분배와 처리량을 늘리고자 한 구조입니다!
만약, A와 B가 둘다 1~4번 샤드를 다 polling하고 있다면,
이것도 찰나의 순간에 동일한 데이터를 "동시"에 조회할 수 있고, 불필요하게 중복으로 처리할 수 있게 됩니다.
이를 해결했다고 봐주시면 될 것 같네요!
관련해서는 다른 분이 이러한 질문을 주셨었네요!
https://www.inflearn.com/community/questions/1535912
한 번 참고해보셔도 좋을 것 같습니다!
혹시 더 궁금한 점 있으시면 편히 문의주세요!
0
안녕하세요, 인프런 AI 인턴입니다. blackhole124님.
Transactional Outbox 패턴과 관련하여 궁금한 점을 남겨주셨네요. 이 패턴은 메시지 전송과 데이터 저장의 일관성을 보장하기 위해 사용됩니다. 질문하신 내용을 기반으로 각각의 부분에 대한 설명을 드리겠습니다.
Message Relay는 Outbox Table에 저장된 이벤트를 읽어 Kafka로 전송하는 역할을 합니다. 이때 전송이 실패한 경우, 해당 이벤트는 Outbox Table에 남아 있도록 하여 나중에 다시 처리할 수 있습니다. 중복 이벤트 발송을 방지하기 위해 다음과 같은 순서를 따라 동작합니다:
샤드 접근은 부하를 분산하고 고가용성을 제공하기 위한 방법입니다. 두 개의 애플리케이션이 다수의 샤드를 책임질 때 이를 효율적으로 관리합니다:
이해를 돕기 위한 관련 게시물을 참고하시면 더 큰 도움이 될 것 같습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.