분산 환경에서 메세지를 전달할 때 사용되는 전략 세 가지에 대해 설명함.

아래 링크를 보고 정리

www.joinc.co.kr/w/man/12/Kafka/exactlyonce

 

Kafka exactly-once

분산환경에서의 Exactly-once은 매우 어렵다.

www.joinc.co.kr

 

A 에서 B 로 0,1,2,3,4,5,6,7,8,9 의 10개 메세지를 보낸다고 하자.

이 때 메세지를 보내는 전략 중 다음 세 가지를 선택 가능하다.

 

< at-most-once >

A 에서 B로 최대 한 번은 보내는 전략

중간에 네트워크 이슈나 타임아웃, 실패 등의 이슈로 인해 메세지가 전달되지 않을 수 있지만

그건 신경쓰지 않는다.

예를 들어 0,1,2 는 방화벽에 막혀서 사라져버렸고

3,4,5,6 은 B가 받질 못해 사라져버렸고

7,8,9 만 B에 제대로 도착함.

0~6은 어떻게 되는 걸까? 그냥 사라진 상태 그대로 둔다.

이 전략은, 짧은 간격으로 주기적으로 발생하는 센서 데이터 등을 보낼 때 사용한다.

중간에 메세지가 사라지더라도, 영향이 크지 않고, 대량 처리가 용이하다.

 

< exactly-once >

A 에서 B로 보내는 메세지를 정확하게 딱 한 번 보내는 전략

중간에 여러 이슈 때문에 실패가 떠서 사라지는 메세지 소실 이슈와

ack 가 오지 않아 A가 똑같은 메세지를 다시 보내는 중복 이슈 등이 생길 수 있지만

이러한 이슈들을 모두 해결하고 B 는 딱 하나의 메세지만 받는다.

구현하기 굉장히 어렵다.

중간에 B에게 열심히 가고 있는 메세지가 여러 환경의 제약때문에 속력이 너무 느려졌는데,

A가 '중간에 사라졌나? 다시 보내야지' 하고 똑같은 메세지를 다시 보낼 수 도 있다.

그럼 먼저 보낸 메세지와 나중에 다시 보낸 똑같은 메세지가 중복으로 들어갈 것인데,

이러한 환경의 조건들까지 모두 생각해서 구현해야 하는 것이 exactly-once 전략이다.

모든 경우를 대비해야한다.

 

< at-least-once >

A 에서 B로 최소 한 번은 보내는 전략

A 가 보내는 메세지가 여러 이슈 때문에 사라지거나, 지연될 수 있다.

이런 상황에서 A 는 사라진 메세지를 B가 받지 못할거라 생각하기 때문에

메세지를 다시 보낸다. B가 받을 때까지.

그에 따라 똑같은 메세지가 중복으로 발송될 수 있다.

(위에 exactly-once 에서 든 예처럼, 너무 느리게 가서 중간에 사라졌다고 착각하게 되는 경우)

B는 A가 보내는 메세지를 반드시 받는다.

그런데 그 메세지는 1개 이상 올 수 있다.

A가 0,1,2,3,4 를 보냈는데, B는 0,0,3,3,3,3,3,3,2,4,4,1,1,1,1 이렇게 중복되어 올 수 있다.

또한 환경의 차이에 의해 도착하는 메세지들의 순서가 다르게 올 수 있다.

A가 1,2,3,4,5 순서로 보냈는데, B는 5,2,4,1,3 순서로 받을 수 있다.

 

 

 

+ Recent posts