Go, Vantage point
가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.
Github | https://github.com/overnew/
Blog | https://everenew.tistory.com/
티스토리 뷰
알림 서비스가 분산 시스템을 사용하는 이유
애플리케이션으로 알림을 보내는 대표적인 서비스는 FCM(andriod)과 ARNs(IOS)이 있다.
애플리케이션뿐만 아니라 이메일이나 slack 메시지 등 알림 서비스는 다양한 매체에 적용된다.
이러한 알림 서비스에서는 가장 중요한 것이 알림 데이터 손실을 방지하는 것이다.
만약 단일 시스템을 사용한다면 single point of failure(단일 장애지점)이 되기 때문에 리스크가 크다.
따라서 메시지를 보내는 앞단에 메시지 큐(Apache Kafka, RabbitMQ 등)를 적용하게 된다.
이러한 메시지 큐들도 결국 단일 장애지점을 피하기 위해 분산 시스템이 사용된다.
분산시스템의 Trade-off
그런데 여러 서버를 배치하는 분산 시스템에서는 정확히 한번 메시지 전달을 보장하는 것은 불가능하다.
이로 인해 중복전송을 100% 방지하는 것도 불가능하다.
분산시스템은 단일 시스템에 비해 가용성이 높지만, 결국에 모든 기술은 Trade-off를 가진다.
아래의 Delivery semantics(통신 시스템에서 메시지가 수신자에 전달되는 방식의 보장 방식)의 종류를 확인해 보자.
1. At-most-once (최대 1번 전달)
- 전달이 되지 않을 수 있지만, 전달이 되면 중복은 X.
2. At-least-once (최소 1번 전달)
- 메시지가 최소 한 번은 전달, 중복 가능성 있음.
3. Exactly-once (정확히 한번 전달)
주로 1,2번이 가장 많이 사용되지만 엄밀히 말하면 최소 한번 전달(At-least-once) 조차 불가능할 수 있다.
왜냐하면 네트워크 파티션이 발생할 수 있기 때문이다.
네트워크 파티션(Network Partition)은 분산 시스템에서 네트워크 연결의 일시적인 장애로 인해 시스템의 일부 노드들이 서로 통신할 수 없게 되는 상황을 의미한다. 이 상황에서는 문자 그대로처럼 시스템이 여러 부분으로 나뉘게 된다.
극단적으로 이야기하면 사용자와 서버 간의 연결이 끊기면 아무것도 전달할 수 없다.
따라서 최소 한번 전달은 불가능할 수 있다.
이 대표적인 예가 두 명의 장군 문제와 FLP이다.
이해하기 쉬운 두 장군 문제로 설명해 보자.
두 장군 문제( Two Generals Problem )
두 명의 장군이 서로 다른 위치에서, 동시에 공격해야만 공략 가능한 같은 성을 공격하려 하고 있다.
사자를 통해 메시지를 전달해야 하지만 적군의 의해 메시지가 손상되거나 전달되지 않을 수 있다.
A가 B에게 전달한 메시지가 정상 도착해도 B가 전달을 잘 받았는지 알 수 있는 방법이 없기 때문에 결국 공격을 같이 시작할 수 없다.
이처럼 분산 시스템에서는 메시지 전달의 신뢰성을 믿기 어려울 뿐만 아니라, 특히 신뢰하기 어려운 네트워크 환경이라면 더욱 힘들어진다.
분산 시스템이 이를 해결하는 방식
두 장군 문제와 FLP는 시스템의 복잡성의 문제를 말하는 것이 아니라, 분산 시스템에서는 at least once가 불가능하다는 것을 의미한다.
그래도 당연하게 여러 번 시도하는 방식은 단 한 번의 시도가 전달되기 바라는 것보다는 안정적이다.
그런데 경험을 돌이켜 보아도, 우리가 애플리케이션의 동일한 알람을 여러 번 받는 경우는 드물다.
실제로 많이 사용되는 메시지 큐(RabbitMQ 등)들은 at least once를 보장하는 것은 아니라 그런 척을 하는 것이다.
이때 중요한 것이 멱등성이다.
전달되는 메시지가 멱등적인 경우, 예를 들어 게임의 이벤트 알림이 온다고 했을 때 이 알림을 3번 받는다고 해서 이벤트의 정보는 여전히 동일하게 전달된다.
이런 멱등적인 메시지는 여러 번 전달되더라도 상관없기 때문에 단 한 번의 알림보단 여러 번의 알림을 보내게 된다.
따라서 신뢰성과 정확성이 중요한 시스템들은 1번을 보내는 것 대신 10번을 보내더라도(비용은 10배 발생) 최소 한 번은 전달되길 바라는 것이다.
물론 실제로 여러 번 전달되는 것을 방지하기 위해서, 이벤트 ID를 확인하여 중복된 것은 버리고 알림을 발송하거나 애플리케이션 단에서 중복을 배제하도록 처리할 수 있다.
이처럼 분산 시스템은 강력한 장점을 가지는 만큼 이로 인해 전체적인 시스템의 복잡성을 높인다는 것을 이해하자.
참조
가상 면접 사례로 배우는 대규모 시스템 설계 기초(알렉스 쉬 저)
https://bravenewgeek.com/you-cannot-have-exactly-once-delivery/
'개발 > 기타' 카테고리의 다른 글
리눅스 쉘 커스텀 명령어 & 명령어 이름 변경 (0) | 2024.10.29 |
---|---|
URL 링크 단축 사용 이유와 링크 단축기 구현 방식 (0) | 2024.09.10 |
리눅스에서의 APT, YUM, DNF의 차이 (0) | 2024.08.19 |
Hypervisor의 overcommit (0) | 2024.07.20 |
왜 Web server와 WAS의 분리가 필요할까? (1) | 2024.07.14 |