1. 12월 17일 금요일 서버 장애 회고
내가 다니는 회사는 node.js 기반으로 퀵서비스 플랫폼을 운영하는 스타트업이고, 퀵서비스 요금 계산 시 카카오네비 API를 통해 출발지~도착지의 거리를 조회한 다음 요금을 산정하는 방식이다.
따라서, 외부의 네비API가 작동하지 않으면 우리 서비스에서 주문접수 자체가 되지않는 굉장히 큰 취약점을 가지고 있었다.
이 취약점으로 인해 과거 몇 차례 서비스 장애를 겪었고, 사수님이 카카오네비 API호출을 실패한 경우 네이버 directions API로 우회하도록 코드를 수정해 놓았다.
그리고, 12월 17일 오후4시 51분 경, 카카오 네비 API에 장애가 있었다.
원래대로라면 네이버 directions API로 우회를 해야했지만 어쩐일인지 이 기능이 작동하지 않았다.
아래는 문제의 코드이다. (코드 각색 있음)
const fetchDistance = async () => {
try {
data = await axios({
reqFormat = {
url: 'https://apis-navi.kakaomobility.com/v1/directions',
method: 'get',
params: { // params },
headers: { // headers }
}
});
// 이 아래로 코드진행이 되지 않았다...
// 비정상 응답인 경우도 throw Error 함
} catch (err) {
throw new Error("kakao navi api eror")
}
}
const main = async () => {
let kakaoResponse;
try {
kakaoResponse = await fetchDistance();
} catch (err) {
// 에러 있을 경우 슬랙 발송
// 네이버 directions API로 우회하는 코드
}
}
우선 main에서 fetchDistance를 실행해 카카오네비 API를 통해 거리를 조회해 온다. 이때, 오류가 발생하면 catch로 잡아 네이버 directions API로 우회하도록 설계해 놓았다.
여기서 문제는, 카카오API에 문제가 있었음에도 catch로 빠지지 않았다는 것이다.
이유는, 요청을 받은 카카오API가 비정상 응답을 주는것이 아닌 아예 응답을 주지 않았기 때문이었다.
위의 코드는 axios를 통한 http통신을 하는데, await을 사용해 코드진행이 순차적으로 되도록 설계되어 있다. 이 코드에서 사용한 axios 모듈의 경우 default timeout값이 없어 카카오API에서 응답이 없는 경우 아래로 코드 진행이 되지않고 계~속 응답을 기다리는 상태가 된다.
코드 테스트를 할 때, 응답이 오지 않는 경우는 차마 생각해내지 못한듯 하다.
이번 장애에서 배운점은 다른 서버와 통신을 할 때는 timeout 설정이 무조건! 필요하다는 것이다.
최근에 서버에 장애가 자주 발생해 심적으로 힘들었는데, 앞으로도 서비스를 더 키우면서 여러 장애들이 많이 발생할 것 같은 예감이다.
백엔드 개발자로서 멘탈을 보강하고 코드이슈로 인한 장애가 발생하지 않도록 실력을 열심히 키워야겠다.
2. 2021.12.19 socket.io 를 이용한 실시간통신
회사의 운영관리 프로그램에 실시간 배송현황을 보여주는 페이지가 있는데, 이 부분이 redis의 pub/sub 기능 + 소켓통신으로 구현되어있다.
해당 코드를 분석하며 redis, pub/sub, 소켓 통신에 대해 학습했다.
redis는 in-memory DB라 서버가 꺼지면 데이터가 다 날아간다는데, 그럼 redis서버를 다시 띄워야 하는 경우에는 데이터를 어떻게 유지할 수 있을지 궁금하다🤔
'개발 > 개발공부 일지' 카테고리의 다른 글
GoF의 23가지 디자인 패턴 정리 (0) | 2025.05.01 |
---|---|
전략패턴(디자인패턴)을 공부해 보자 (0) | 2025.05.01 |
[22.01.17 ~ 22.01.23] FCM 작업, 첫 유닛테스트 코드 작성, mongod.lock is not empty 에러 (0) | 2022.01.23 |
[21.12.27 ~ 22.01.09] 회사일, Eloquent Javasciprt, Axios 라이브러리 분석 (0) | 2022.01.09 |
[12월 4주차] 도커 컨테이너 간 통신문제 해결, 배송물량 증가로 인한 프로그램 성능이슈, 앞으로의 공부 계획 (0) | 2021.12.26 |