12월 03일 문제 동기식 서비스 호출 > 이벤트 기반 아키텍처
동기식 서비스 호출 방식에서 이벤트 기반 아키텍처로 전환해야 하는 경우를 가정하고,
동기식 서비스 호출
서비스들이 서로 직접적으로 연결이 될 수 밖에 없다
한 서비스의 문제가 전체 시스템에 영향을 준다.
이벤트 기간 아키텍처
각 서비스가 독립적으로 동작
비동기적으로 응답하기에 시스템 응답 속도가 빠름.
필요한 서비스만 확장이 가능해진다.
도입 배경과 이를 통해 해결하고자 하는 문제를 설명해주세요.
도입을 왜 해야하나?
개인적인 생각으로는 서비스 간의 의존성을 최소화해야하기 때문이라고 생각한다.
코드에서도 결합도가 강한 경우 리팩토링이 힘들어지게 되지만, 서버의 경우 결합도가 강한 경우
확장이 너무 어려워지는 문제가 발생한다.
모놀리식으로 충분한 경우 굳이 나눌 필요는 없을 수도 있다..
이벤트 쿠폰 관리쪽을 수정하다가 휴먼에러 발생으로 서버에 문제가 생기면
생기는 시간만큼 사용자가 결제하지 못하고 회사는 금전적인 손실을 안게 되는 문제가 있긴하다.
하지만 이는 극단적인 예시로 일반적인 경우 서버비와 관리 오버헤드로 굳이 나눌 필요는 없다고 생각한다.
해결하고자 하는 문제
트래픽의 분산에 용이해지기도 하고
성장하는 서비스의 경우 도메인 컨텍스트를 나눠야 분업도 가능해지고
문제 발생시 빠른 대처가 가능하기도하다
또한 시스템의 경직성을 해결이 가능해진다
이벤트 브로커(Kafka, RabbitMQ)를 활용해 대략적인 설계와 이에따른 기술적 문제(메시지 중복 처리, 데이터 유실) 및 이를 해결한 방안에 대해 기술해주세요
이벤트 브로커를 활요한 대략적 설계법
이벤트 브로커
말 그대로 여러 서비스 간의 메시지를
중개
해주는 친구이다.
일반적으로 발행 - 구독 모델을 가지고 있으며
요즘 왠만한 규모의 프로젝트에 대부분 적용이 되어 있다.
요즘 국가단위 SI 사업도 오래전부터 사용중이라고 들었음..
물론 매번 말하지만 문제가 많다고 한다 항상
올바르게 사용하지 못하면 메시지 유실 등의 문제가 발생할 수 있는 아주 민감한 서비스같다
브로커가 메시지를 큐에 저장 → 소비자(다른 서버) 가 이를 가져가서 처리한다
기술적 문제
메시지 중복 처리
동일한 메시지가 여러번 처리될 수 있다
같은 메시지큐이기에 AWS SQS 도 같은 문제를 안고 있는데 AWS 에서는
가시성 타임아웃
이라는 개념이 있다메시지를 받은 후 일정 시간 동안 다른 소비사가 해당 메시지를 볼 수 없게 설정함.
적절하게 설정하면 중복 처리를 줄일 수 있다고 함
데이터 유실 가능성
브로커 장애로 메시지가 사라지거나 전달되지 않을 수 있음.
해결방안?
메시지 중복
고유 ID 부여
메시지에 고유한 식별자 부여로 중복 여부 체크
멱등성 처리
카프카에서는
멱등성 처리를 할 수 있는 옵션이 있긴함
properties.setProperty(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, "true");
3.0 이후
참
기본이전
거짓
기본
데이터 유실
ACK 응답
메시지 성공적으로 처리되었는지 소비자가 브로커에 응답(ACK) 보냄
뭔가 생겨먹은게 HTTP 3 way handshake 구조같다.
재시도 매커니즘
메시지 전달 실패시 자동으로 재전송 설정이 가능
횟수까지 설정가능 ㅇㅇ
카프카 파티션 복제