요청 종류에 따른 개발
#large-scale-system
2024-08-13
요청 종류에 따른 개발

🛠️ 요청 종류에 따른 개발

시스템이 읽기 전용인지, 쓰기 및 업데이트를 위한 것인지도 중요하다. 이를 파악하고 처리 속도를 빠르게 하여 응답한다면 보다 많은 사용자를 수용할 수 있다. 읽기 요청 최적화 하는 방법이랑 쓰기 요청 최적화 하는 방법을 살펴 보도록 하자

🤓 읽기 요청 최적화

캐시사용

모든 사용자가 같은 데이터를 요청할때 DB의 데이터를 Redis 같은 캐시에 올려두면 데이터를 빠르게 제공할 수 있으며 DB의 부하를 줄일 수 있다. 개인화된 데이터가 아니라면 캐시를 사용하여 데이터 로드에 시간 소요를 최소화 하는 방법이 중요하다.

엣지 단에서 캐싱을 처리하면 시스템의 요청 처리량이 줄어들어 적은 수의 애플리케이션으로도 요청을 처리할 수 있다. 엣지 캐싱은 사용자와 가까운 곳에서 데이터를 제공하므로 네트워크 지연을 최소화하고, 사용자 경험을 향상시킬 수 있다.

캐싱 전략을 설계할 때는 캐시 갱신 정책도 중요하다.

예를들어 공지사항이 자주 변경되지 않으면 유효기간을 길게 설정할 수가 있다. 그러나 자주 변경 된다면?? 유효기간을 짧게 설정하거나 변경 시점에 캐시를 무효화해서 최신 데이터를 제공할 수 있도록 해야한다.

데이터 베이스 사용 최적화

DB 인덱싱

DB인덱싱은 조회 성능을 크게 향상시킬 수 있는 방법이다. 인덱스를 사용하면 DB는 데이터를 빠르게 검색할 수 있다. 올바르게 설계된 인덱스는 읽기 성능을 최적화하고 쿼리 응답 시간을 줄인다. 다만 주의할 점은 인덱스가 너무 많으면 쓰기 성능이 저하될 수 있다는 것이다.

DB 샤딩

DB샤딩은 DB를 여러 샤드로 분할하여 각각의 샤드가 독립적으로 쿼리를 처리하도록 하는 방법이다. 이를 통해 DB에 대한 부하를 분산시킬 수 있으며 읽기 요청에 대한 응답 속도를 향상시킬 수 있다.

다음 쿼리문을 보면서 추가적으로 얘기를 해보자

CREATE TABLE orders ( order_id SERIAL PRIMARY KEY, customer_id INT, order_date DATE, amount DECIMAL ) PARTITION BY RANGE (order_date); CREATE TABLE orders_2023_01 PARTITION OF orders FOR VALUES FROM ('2023-01-01') TO ('2023-02-01'); CREATE TABLE orders_2023_02 PARTITION OF orders FOR VALUES FROM ('2023-02-01') TO ('2023-03-01');

날짜를 기준으로 달마다 분리해서 테이블 파티셔닝을 했다. 이는 기본적인 형태의 샤딩으로 DB수준에서 데이터를 분할한다.

읽기 전용 DB

주로 읽기 요청을 처리하는 DB인스턴스이다. 데이터를 주기적으로 동기화하여 최신 상태를 유지하면서 읽기 요청을 처리한다. 이 방법은 메인 DB에 대한 읽기 부하를 줄이고 성능을 최적화 할 수 있다.

쿼리 최적화

쿼리 최적화는 SQL쿼리를 효율적으로 작성하여 데이터베이스의 읽기 성능을 향상시키는 방법입니다. 예를 들어, 불필요한 조인을 줄이고, 필요한 컬럼만 선택하며, 적절한 조건을 사용하는 것이 중요하다. 쿼리 실행 계획을 분석하여 병목 지점을 찾아내고, 이를 최적화할 수 있다.

🤓 쓰기 요청 최적화

쓰기에서 가장 많은 시간을 소요하는 부분은 DB에 데이터를 생성하는 부분이다. 이를 해결하기 위한 방법은 다음과 같다.

비동기 처리

쓰기 요청을 비동기 방식으로 처리하면 DB에 접근하지 않고 빠르게 응답을 반환할 수 있다. 예를들어 메세지를 바로 DB에 쓰지 않고 큐에 넣어 나중에 처리하는 방법이 있다. 비동기 처리는 특히 높은 트래픽을 처리할 때 유용하다. 다만 주의 해야할점은 비동기 처리시 데이터 소실이나 오류를 방지하기 위해 큐에 데이터를 넣을때 적절한 검증을 수행하고, 큐에 쌓인 데이터를 지속적으로 모니터링하여 실패한 요청도 재시도할 수 있는 매커니즘을 마련해야한다. 또한 데이터의 순서를 보장하고, 중복 처리를 방지하기 위한 고유 식별자를 사용해야한다.

배치 처리

실시간으로 처리할 필요가 없는 쓰기 요청은 배치처리를 통해 한꺼번에 처리할 수 있다. 예를 들어 일정시간마다 큐에 쌓인 메세지를 DB에 쓰는 방법이 있다. 매일 자정에 하루동안 수집된 로그 데이터를 한 번에 DB에 저장하는 방식으로 사용할 수 있다. 주의 해야할점은 배치 처리시에도 데이터소실을 방지하기 위해 배치 작업중 오류가 발생한 경우 이를 기록하고 재시도 할 수 있는 매커니즘을 마련해야한다. 또한 배치 작업의 상태를 모니터링하고, 배치 작업이 완료 되었는지 확인하는 프로세스를 마련해야한다.

분산 DB

단일 DB로 모든 쓰기 요청을 처리하기 힘들면 분산DB를 사용하여 부하를 분산시킬 수 있다. 분산DB는 데이터를 여러개의 노드에 분산 저장하여 고가용성과 확장성을 제공한다. 또한, 샤딩기법을 통해 데이터베이스를 수평으로 분할하여 각 샤드가 독립적으로 쓰기 작업을 처리하도록 할 수 있다. 이를 통해 단일 노드의 부하를 줄이고, 시스템의 전체 성능을 향상시킬 수 있다.

댓글

댓글을 불러오는 중...