분산 시스템은 단일 시스템보다 어렵다. 네트워크는 신뢰할 수 없고, 서버는 언제든 죽을 수 있고, 시계는 동기화되지 않는다. CAP 정리는 선택을 강요한다.
개발자들이 흔히 하는 실수가 있다. 로컬에서 잘 되니까 분산 환경에서도 잘 될 것이라고 가정하는 것이다. 하지만 분산 시스템에서는 새로운 종류의 실패가 발생한다. 부분 실패, 네트워크 파티션, 타임아웃.
일관성 vs 가용성
CAP 정리에 따르면 일관성, 가용성, 파티션 허용성 중 두 가지만 선택할 수 있다. 현실에서 네트워크 파티션은 피할 수 없다. 따라서 실질적인 선택은 일관성과 가용성 사이에서 이루어진다.
은행 시스템은 일관성을 선택한다. 잔액이 잘못되면 안 된다. 소셜 미디어는 가용성을 선택한다. 일시적으로 좋아요 수가 틀려도 서비스가 작동하는 것이 중요하다. 비즈니스 요구사항에 맞게 선택해야 한다.
실패를 받아들이기
분산 시스템에서 실패는 예외가 아니라 정상이다. 실패를 전제로 설계해야 한다. 재시도, 타임아웃, 서킷 브레이커, 폴백 같은 패턴이 필요하다. 멱등성을 고려해야 한다. 같은 요청을 여러 번 보내도 결과가 같아야 한다.
관측 가능성도 중요하다. 분산 추적, 로그 집계, 메트릭 수집 없이는 문제를 디버깅하기 어렵다. 서비스가 많아질수록 복잡성은 기하급수적으로 증가한다. 도구 없이는 운영이 불가능하다.