정합성 문제란 무엇인가
정합성(整合性, Consistency) 문제란 시스템 내 데이터 간의 논리적 관계나 상태가 어긋나는 상황을 의미함.
쉽게 말해 "데이터가 서로 맞지 않음" → 즉, 하나는 A라고 말하고 다른 하나는 B라고 말하는 경우를 말함.
이러한 정합성 문제가 발생하면 서비스의 신뢰성이 떨어지고, 사용자 경험에도 직접적인 영향을 줄 수 있음.
1. 정합성의 의미
정합성은 시스템에서 데이터의 상태가 논리적으로 일관되고 모순되지 않는 것을 의미함.
정합성이 잘 유지된다는 것은 업데이트, 복제, 분산 처리, 캐시 반영 등이 모두 제대로 동기화되어 있는 상태를 뜻함.
예시
- 주문 상태가 “결제 완료”인데 실제 결제 이력이 없음 → 정합성 문제
- 재고 수량은 0인데 주문은 통과됨 → 정합성 문제
- Kafka로 전송된 이벤트에는 변경 정보가 반영되었지만, DB에는 반영되지 않음 → 정합성 문제
2. 정합성 문제가 발생하는 상황
상황 | 설명 |
분산 시스템 | 서로 다른 서버/서비스가 데이터를 개별적으로 보유하거나 처리하면서 동기화 실패 |
비동기 메시징 (Kafka 등) | 이벤트가 중간에 유실되거나, 순서가 뒤바뀌어 수신됨 |
DB와 캐시 불일치 | DB를 먼저 업데이트했지만 캐시를 갱신하지 않아 사용자에게 잘못된 정보 제공 |
이중 처리/실패 처리 | 네트워크 장애 등으로 동일 요청이 중복 처리되어 상태가 꼬이는 경우 |
트랜잭션 경계 바깥 작업 | DB 트랜잭션은 성공했지만 외부 API 호출이 실패함 (혹은 그 반대) |
3. 정합성 문제를 방지하거나 해결하는 방법
1) 트랜잭션(Transaction) 활용
- DB 내에서 ACID 트랜잭션을 적용하여 여러 작업을 하나의 원자 단위로 처리함.
- 단일 시스템 내에서는 매우 효과적인 방법임.
2) 이중 확인(Double-check)
- 상태 변경 전후를 검증하여, 조건에 따라 명시적으로 확인하고 동작 수행함.
- 예: 재고가 남아있는지 다시 확인 후 주문 처리
3) 이벤트 소싱 / 메시지 지연 처리
- 비동기 메시지 시스템(Kafka 등)에서는 이벤트 순서 보장, 중복 제거, 리트라이 등을 적용함.
4) 데이터 정합성 검증 로직 추가
- 일정 주기로 DB를 점검하거나, API 응답값을 검증하여 자동 알림 또는 롤백 처리함.
5) SAGA 패턴
- MSA에서 정합성을 유지하기 위해 사용하는 대표적인 분산 트랜잭션 패턴
- 보상 트랜잭션 방식으로 각 서비스가 실패 시 되돌리는 책임을 가짐
4. 강한 정합성 vs 약한 정합성
구분 | 설명 | 예시 |
강한 정합성 | 항상 모든 시스템의 데이터가 즉시 일치함 | 은행 송금, 재고 차감 |
약한 정합성 | 일시적으로 불일치할 수 있으나, 시간이 지나면 일치함 | SNS 좋아요 수, 조회수 |
최종적 정합성(Eventual Consistency) | 궁극적으로는 동일한 상태로 수렴함 | S3, NoSQL 시스템 |
→ 어떤 종류의 정합성이 필요한지는 시스템 특성에 따라 설계해야 함.
5. 실무 사례
- 회원가입 후 이메일 발송 실패
- DB에는 유저가 생성되었으나, 이메일 발송은 실패 → 후속 작업 불일치 발생
- 주문 승인 후 결제 실패
- 재고 차감은 완료되었지만 결제 API 실패 → 주문 상태와 금액이 불일치
- MSA 간 상태 불일치
- 결제 서비스는 “완료”, 주문 서비스는 “대기” → 최종 상태 정합성 깨짐
- 이벤트 기반 처리
- Kafka의 메시지 중복 소비로 인해 동일 알림이 두 번 전송됨
정리
정합성 문제는 시스템의 데이터 상태가 논리적으로 일관되지 않을 때 발생하는 문제임.
단일 시스템에서는 트랜잭션으로 어느 정도 해결 가능하지만, 분산 시스템/캐시/이벤트 기반 아키텍처에서는 복잡한 문제가 생길 수 있음.
따라서 설계 단계부터 어떤 정합성이 필요한지(강한/약한/최종적) 를 결정하고,
트랜잭션, 이벤트 처리 방식, 보상 로직, 검증 자동화 등으로 대비해야 안정적인 서비스를 제공할 수 있음.
출처 : ChatGPT
'DB' 카테고리의 다른 글
PostgreSQL (0) | 2025.04.28 |
---|