Open easyfordev opened 2 years ago
f(f(x)) = f(x)
)at-most-once
: 실패나 타임아웃 등이 발생하면 메시지를 버릴 수 있다. 데이터가 일부 누락되더라도 영향이 없는 경우엔 대량처리 및 짧은 주기의 전송 서비스에 유용할 수 있다.
exactly-once
: 메시지가 정확하게 한 번만 전달되는 것을 보장한다. 손실이나 중복 없이, 순서대로 메시지를 전송하는 것은 구현 난이도가 높고 비용이 많이 든다.
at-least-once
: 메시지가 최소 1번 이상 전달되는 것을 보장한다. 실패나 타임아웃 등이 발생하면 메시지를 다시 전송하며, 이 경우엔 동일한 메시지가 중복으로 처리될 수 있다.
kafka의 경우 at-least-once
를 보장하며 일정 버전 이후에서는 옵션을 통해 exactly-once
를 적용가능
트랜잭션을 적용하여 구현. Producer가 트랜잭션에서 처리한 데이터의 offset을 커밋함으로써, Consumer에 정확하게 메시지를 전달할 수 있다. Consumer에도 트랜잭션을 적용
Producer to Consumer 까지 가는 파이프라인은 exactly-once
보장. 성능은 떨어짐.
파이프라인 전체에 대해 exactly-once
를 지원하려면 kafka 외부의 애플리케이션단에서도 중복 처리 이슈가 해결되어야 한다 -> 거의 불가능
참고 )
To reiterate, there is no such thing as exactly-once delivery. We must choose between the lesser of two evils, which is at-least-once delivery in most cases. This can be used to simulate exactly-once semantics by ensuring idempotency or otherwise eliminating side effects from operations. 출처: https://bravenewgeek.com/you-cannot-have-exactly-once-delivery/
저는 급하게 읽어서 따로 준비하진 못했습니다. 다음에 꼭! 준비하도록 할게요 ㅠㅠ
[Chapter 10] 알림 시스템 설계