개발자허허의 오늘은 뭐 먹지?

메시지큐는 어떻게 사용하는가? 본문

Dev/자세히 알아보기

메시지큐는 어떻게 사용하는가?

duck67 2021. 4. 25. 22:59
반응형

블라인드에 이런 질문이 올라왔다.

메시지큐를 쓰다가 메시지가 중간에 소실되는 건 어쩔 수 없을텐데, 어떻게 감지/조치하는지?

괜찮은 답변들이 많아서 정리해보면...

  1. 검사하는 로직 넣어서 실패하면 한번 더 보내게 하지 않나? 아니면 될때까지.. 일정이상 fail나면 skip 및 로그 처리
  2. 모든걸 다 감지는 못해서 심각한 장애가 일으킬 수 있거나 필수 데이터가 빠져있으면 job으로 배치 돌려서 그때그때 해결하거나, saga pattern으로 최소한의 필수 데이터를 고려해서 정합성을 맞춤
  3. 클라이언트 입장에서 전송이 실패하면 어디 쌓아놓았다가 나중에 쏴야죠. 카프카 클라이언트에 버퍼가 있는 경우도 있고, 좀 크게 잡으려면 일단 파일에 쓰고 이걸 파일비트나 fluentd로 쏘게하면 디스크 용량만큼 버퍼로 쓸 수 있습니다. db에 써놓는 방법도 좋구요 (outbox pattern이라 함)
  4. 카프카는 메시지큐처럼 pop한다고 끝이 아니고 pull해서 오프셋당겨놓고 commit하는 형태라 메시지 소비패턴만 잘 구성하면 유실은 안됨. mq는 유실됨
  5. 카프카는 믿을만해요
  6. 클러스터링의 목적부터 이해하세요
  7. 카프카는 디스크를 쓰기 때문에 머신 한두개 죽어도 상관없어요.

전반적으로 kafka를 신뢰하는 댓글이 많았고,

클러스터링을 잘 하고 있다면 별 문제는 없을 것 같다는 이야기가 주를 이루었고,

위의 내용중에 몇가지 컨셉을 정리하면 아래와 같다.

 

Kafka의 메인 컨셉

http://kafka.apache.org/documentation/#introduction

SAGA Pattern이란?

분산환경에서 transaction관리를 Application에서 한다.

Transaction의 주체가 DBMS가 아닌 Application에 있고,

Application이 분산되어 있을 때, 각 Application 하위에 존재하는 DB는 Local Transaction 처리만 담당한다.

만약 각각의 APP에 대한 연속적인 transaction 요청 및 실패할 경우 rollback처리를 Application에서 한다.

Atomicity를 보장해주지는 않지만 Eventual Consistency(결과적 일관성)을 유지할 수 있다.

(참고) https://cla9.tistory.com/22

 

Outbox Pattern이란?

메시지 큐로 데이터베이스 테이블을 사용하는 패턴

메시지 브로커에 메시지를 바로 발행하지 않고

OUTBOX라는 임시 데이터베이스 테이블에 메시지를 저장한다.

저장된 메시지는 저장된 Message Relay가 OUTBOX테이블에 메시지를 읽어 메시지 브로커로 발행한다.

=> 메시지가 발행하는데 시차는 생기겠지만 결과적 일관성(Eventual Consistency)을 유지할 수 있다.

* Eventual Consistency란 일시적으로 메시지 처리에 실패해서 일관성이 깨지더라도 결국에 다시 정상 처리를 시도하던지 해서 일관성이 결과적으로 유지되는 것을 말한다.

(참고)

https://www.popit.kr/msa%EC%97%90%EC%84%9C-%EB%A9%94%EC%8B%9C%EC%A7%95-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EC%B2%98%EB%A6%AC%ED%95%98%EA%B8%B0

반응형
Comments