이전에 Nginx를 사용해서 이미지 캐싱 서버를 따로 구축하여 사이트 속도를 개선했는데도 불구하고 아직 우리 사이트 속도는 사용자가 원활하게 사용하기에는 느렸다. 다른 이커머스 사이트를 보면 로딩 없이 사이트 전체 내용을 바로 확인할 수 있던데, 왜 안될까?
분석 결과 원인은 api의 속도가 느리기 때문이었다. 문제긴 한데 어떻게 api 속도를 빠르게 할 수 있을까? 이미지뿐만 아니라, api 서버에서 가져오는 데이터도 캐싱할 수 있지 않을까? 라는 생각이 문득 전에 공부했던 경험을 통해 들었고 적용 해보기로 했다.
api 서버에서 가져오는 데이터를 캐싱하는 방법은 여러 가지다. 대표적으로 Global Caching, Local Caching 두 가지 전략으로 나눌 수 있다. Global Caching은 분산 서버 환경에서, 사용자의 세션이 불일치하는 문제가 발생하여 로그인이 끊기는 경우에 해결 방안으로 사용된다. Local Caching은 단일 서버 환경에서 빠르게 최적화를 하고 싶을 때 사용된다.
우리 서비스는 분산 서버 환경이 아직은 아니기 때문에 Local Caching 전략을 선택했다. Local Caching 전략의 단점으로는 데이터 정합성을 예로 들 수 있는데, 정적인 콘텐츠를 데이터베이스에서 나르는 기능을 수행하는 것이 대부분이기 때문에 Trade off를 고려했을 때, 내 선택이 맞다고 생각했다.
곧바로 퇴근 후에 생각했던 것을 적용해 봤다.
const cache = require('memory-cache');
function cacheMiddleware(duration) {
return (req, res, next) => {
const key = '__express__' + req.originalUrl || req.url;
const cachedBody = cache.get(key);
if (cachedBody) {
res.send(cachedBody);
return;
} else {
res.sendResponse = res.send;
res.send = (body) => {
cache.put(key, body, duration * 1000);
res.sendResponse(body);
};
next();
}
};
}
app.get("/api/banner", cacheMiddleware(1000) async (req, res) => {
...
}
코드 블럭 맨 아래에 있는 /api/banner 라우터 두 번째 파라미터에, 개발한 메서드를 넣으면 된다. 초를 기준으로 캐시 된다.
결과는 대 성공.... 우리 사이트의 모든 요소들이 로드되기까지의 시간을 기준으로 속도가 5배 더 빨라졌다. Spring을 사용했을 때는 Local Caching 전략을 사용하기 위해 세팅해야 될 것들이 많았는데, 코드 몇 줄로 세팅이 완료돼서 신기했다.. 이래서 nodejs가 개발 속도가 빠르다는 얘기가 나오는 건가..?
'서버' 카테고리의 다른 글
CPU Burst, IO Burst (0) | 2023.06.29 |
---|---|
linux file descriptor (0) | 2023.06.05 |
HTTP 프로토콜이 만들어진 이유 (1) | 2022.09.11 |
Scale out에 적합한 로그인 환경에 대해 검토한 글 (2) | 2022.09.11 |
서버의 장애를 대비한 확장 방법 검토하기 (1) | 2022.09.11 |