인프런 커뮤니티 질문&답변

차영호님의 프로필 이미지

작성한 질문수

실습으로 배우는 선착순 이벤트 시스템

Producer 사용하기

kafka Producer 실행 중 에러 시 redis count 정합성 이슈

24.08.11 21:23 작성

·

116

·

수정됨

0

안녕하세요! 섹션3 Producer 관련 강의를 보다가 궁금한 점이 생겼습니다.

 

redis를 활용해 count 증가 후 선착순에 들어 kafka 로 이벤트를 발행하는 도중 네트워크 오류 등의 문제가 발생한다면 count 값만 늘어나고 쿠폰 생성이 안될 것 같습니다.

 

이 경우, 실무에서는 어떤 식으로 처리하시나요??

(redis쿼리 -> kafka 이벤트 발행)의 원자성을 보장해줘야 될 것 같다는 생각이 들었습니다.

kafka의 이벤트 발행 부분을 try...catch로 감싸서 redis의 count를 감소시키는 로직을 작성하는게 가장 간단해보입니다.

그런데, 해당 롤백 로직에서 에러가 발생할수도 있기 때문에 카운트 증가 -> 이벤트 발행의 원자성을 보장하기 어려울 것 같습니다.

 

추가) kafka 이벤트 발행 실패 시 userId, eventId, count 값을 로그로 남겨 추후 kafka 이벤트를 재발행하는 방법도 있을 것 같습니다.

이때, 재실행은 로그에서 데이터를 추출 개발자가 수동 혹은 배치 등의 프로그램을 작성해 정합성을 맞추는걸까요?? 실무에서 어떤 식으로 실패한 요청을 다시 성공시키는지 궁금합니다

 

답변 2

0

최상용님의 프로필 이미지
최상용
지식공유자

2024. 08. 14. 10:34

차영호님 안녕하세요.
좋은질문 감사드립니다!
Kafka 메시지 발송을 보장하기 위해서는 여러가지 방법이 있을것 같습니다.
1. Kafka 메시지 발송에 실패한다면 Dead Letter Queue 에 메시지를 발행하여 후처리를 하는 방법이 있을 것 같습니다.

  1. Kafka 메시지 발송에 실패했을 때 운영자(사람) 에게 알림을 주어 수동으로 메시지 재발행을 시키도록 할 수 있을 것 같습니다.

  2. Kafka 메시지 발송에 실패했을 때 별도의 저장소 (rdb, 파일 등) 에 저장하여 후처리를 진행할 수 있습니다.

  3. 말씀하신대로 Kafka 메시지 발송에 실패했다면 redis 의 카운트를 내릴수도 있을것 같습니다.

상황에따라서, 선택에따라서 여러가지 방법이 있을 수 있습니다!

0

인프런 AI 인턴님의 프로필 이미지

2024. 08. 11. 21:26

안녕하세요, 인프런 AI 인턴입니다.

차영호님의 질문과 관련하여 비슷한 상황을 다룬 기존 답변을 찾아보았습니다. 질문의 핵심은 Kafka에서 이벤트 발행 중 에러가 발생했을 때 Redis count의 정합성을 어떻게 보장하느냐에 관한 것으로 보입니다.

이와 관련하여 “데이터베이스에 쿠폰 insert 실패시“라는 제목의 질문에서 유사한 상황이 논의되었습니다. 여기서는 Kafka 컨슈머가 쿠폰 저장 과정에서 실패하였을 때, Redis에서 이미 증가된 카운트에 대한 처리 방법에 대해 논의되었습니다. 질문자는 카프카 컨슈머가 쿠폰 리포지토리에 save하는 과정에서 실패하여 롤백되었을 때, Redis에서 이미 증가된 카운트를 줄여야 하는지에 대한 궁금증을 표현했습니다. 이에 대해 인스트럭터는 FailedEvent 저장 실패 시, Dead Letter Queue를 사용한 재발급 시도 등 여러 대응방안을 제시했습니다.

이 정보는 질문의 원자성 보장 문제에 대한 직접적인 해결책을 제시하지 않을 수 있지만, Kafka와 Redis를 사용함에 있어서 발생할 수 있는 문제점과 일반적인 해결 방법에 대한 통찰을 제공합니다. 특히 예외 처리와 관련하여서는, 실패할 경우 로그를 남기고 개발자나 운영진에게 알림을 주어 후처리 할 수 있는 방법을 권장하고 있습니다.

()데이터베이스에 쿠폰 insert 실패시

해당 사례를 바탕으로 Kafka 이벤트 발행 실패 시 Redis 카운터 조정 필요성에 대해 고민하는 것은 타당해 보입니다. 이벤트 발행 부분을 try-catch로 감싸고, 예외 발생 시 롤백 로직을 적용하는 것은 하나의 방법이 될 수 있으나, 예외 처리 로직에서 또 다른 에러가 발생할 가능성을 고려하는 꼼꼼한 접근이 필요함을 알 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.