#24시간 멈출 수 없는 충전 서비스를 위한 무중단 배포 전략
전기차 충전 서비스는 점검 시간이라는 개념이 없습니다. 새벽 2시에도 누군가는 충전하고 있고, 충전 중인 차량에 영향을 주는 배포는 허용되지 않습니다. 이 글에서는 플러그링크가 서비스 중단 없이 안전하게 배포하기 위해 적용한 전략을 공유합니다.
#충전 서비스 배포의 특수성
일반적인 웹 서비스와 달리, 충전 서비스 배포에는 몇 가지 추가 제약이 있습니다.
- 활성 충전 세션 보호: 배포 시점에 충전 중인 세션이 끊기면 안 됩니다
- 충전기 연결 유지: OCPP WebSocket 연결이 끊어지면 충전기가 오프라인으로 전환됩니다
- 결제 정합성: 충전 요금 정산이 중간에 유실되면 안 됩니다
#블루-그린 배포
API 서버는 블루-그린 배포를 적용합니다. 새 버전(그린)을 띄우고, 헬스체크를 통과하면 로드밸런서가 트래픽을 전환합니다.
[Load Balancer]
│
├──► Blue (v1.2.3) ← 현재 트래픽
│
└──► Green (v1.2.4) ← 헬스체크 대기
핵심은 전환 시점입니다. 활성 충전 세션이 있는 요청은 기존 Blue 인스턴스에서 처리가 완료될 때까지 기다린 후 전환합니다.
#OCPP Gateway의 롤링 업데이트
충전기와의 WebSocket 연결을 관리하는 OCPP Gateway는 더 신중하게 배포합니다. 한 번에 전체 인스턴스를 교체하면 수만 대의 충전기가 동시에 재접속을 시도하면서 연결 폭풍이 발생하기 때문입니다.
인스턴스를 하나씩 순차적으로 교체하되, 각 인스턴스는 기존 연결을 graceful하게 종료합니다.
# 롤링 업데이트 설정
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
lifecycle:
preStop:
exec:
command: ['/bin/sh', '-c', 'sleep 30']
terminationGracePeriodSeconds: 120
충전기는 연결이 끊어지면 자동으로 재접속을 시도합니다. 이때 다른 Gateway 인스턴스로 분산되어 연결되므로, 전체 서비스에는 영향이 없습니다.
#카나리 배포와 자동 롤백
결제 관련 서비스는 카나리 배포를 적용합니다. 새 버전에 전체 트래픽의 5%만 먼저 보내고, 에러율과 응답 시간을 모니터링합니다.
이상이 감지되면 자동으로 롤백됩니다. 판단 기준은 단순합니다.
- 에러율이 기존 대비 2배 이상 증가
- p99 응답 시간이 기존 대비 3배 이상 증가
- 충전 세션 시작 실패율 증가
#배포 금지 시간대
아무리 무중단 배포라도, 리스크를 최소화하기 위해 배포를 피하는 시간대를 정해두었습니다.
- 출퇴근 시간 (07:00-09:00, 17:00-19:00): 충전 트래픽이 가장 높은 시간대
- 월말 정산 기간: 충전 요금 정산 배치가 돌아가는 시간
그 외 시간에는 자유롭게 배포할 수 있습니다. 배포 빈도는 평균 하루 2-3회입니다.
#정리
무중단 배포는 기술적 도전이기도 하지만, 결국 “충전 중인 사용자에게 불편을 주지 않겠다”는 약속입니다. 전기차 충전이 일상이 되려면, 서비스는 항상 그 자리에 있어야 합니다.