-
system-design-101. How to improve API performance?📖 개발 공부 2024. 6. 22. 11:50
API 성능을 향상시키기 위한 5가지 전략!
- Pagination
This is a common optimization when the size of the result is large. The results are streaming back to the client to improve the service responsiveness.
결과 사이즈가 클 때 일반적인 최적화 방법. 서비스 응답성을 높이기 위해 결과를 클라이언트에 스트리밍 방식으로 전달. - Asynchronous Logging
Synchronous logging deals with the disk for every call and can slow down the system. Asynchronous logging sends logs to a lock-free buffer first and immediately returns. The logs will be flushed to the disk periodically. This significantly reduces the I/O overhead.
동기 로깅은 모든 호출에 대해 디스크에 직접 쓴다. 예를 들어, 코드가 로그 메시지를 생성하면 이 메시지는 즉시 디스크에 저장된다. 이 방식은 로그가 확실하게 기록되지만, 매번 디스크에 접근해야하기 때문에 속도가 느리고 시스템의 전체 성능을 저하시킬 수 있다.
반면에, 비동기 로깅은 먼저 메모리상의 버퍼에 저장한 후, 일정 시간 간격이나 특정 조건이 충족되었을 때 한꺼번에 디스크에 저장한다. 이로써 I/O 오버헤드를 줄일 수 있다. - Caching
We can store frequently accessed data into a cache. The client can query the cache first instead of visiting the database directly. If there is a cache miss, the client can query from the database. Caches like Redis store data in memory, so the data access is much faster than the database.
자주 접근하는 데이터를 캐시에 저장하는 방식. DB에 직접 접근하는 대신 캐시를 먼저 조회하고, Cache miss가 발생한 경우 DB에 조회한다. Redis와 같은 캐시는 데이터를 메모리에 저장하므로 데이터 접근 속도가 DB보다 훨씬 빠르다. - Payload Compression
The requests and responses can be compressed using gzip etc so that the transmitted data size is much smaller. This speeds up the upload and download.
요청과 응답을 gzip 등으로 압축하여 전송되는 데이터 크기를 줄일 수 있다. 이는 업로드와 다운로드 속도를 빠르게 한다. - Connection Pool
When accessing resources, we often need to load data from the database. Opening the closing db connections adds significant overhead. So we should connect to the db via a pool of open connections. The connection pool is responsible for managing the connection lifecycle.
자원에 접근할 때, DB에서 데이터를 로드하는데, DB 커넥션을 열고 닫는 것이 상당한 오버헤드를 일으킨다. 따라서 열린 커넥션 풀을 통해 데이터베이스에 연결해야 한다. 이 커넥션풀은 커넥션 라이프사이클을 관리하는 역할을 한다.
Asynchronous Logging
Spring Boot에서 기본적으로 Logback을 로깅 프레임워크로 사용한다. 기본으로 동기 로깅을 사용하고, logback-spring.xml 파일에서 비동기 로깅을 설정할 수 있다.
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 콘솔 앱페더 --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 비동기 앱페더 --> <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"> <appender-ref ref="CONSOLE" /> <!-- 큐 크기 --> <queueSize>5000</queueSize> <!-- 로그 삭제 임계값 설정 --> <discardingThreshold>0</discardingThreshold> <!-- 백그라운드 스레드가 큐의 로그 메시지를 디스크에 플러시하는 데 걸리는 최대 시간 --> <maxFlushTime>1000</maxFlushTime> </appender> <!-- 루트 로거 설정 --> <root level="INFO"> <appender-ref ref="ASYNC" /> </root> </configuration>
참고
반응형'📖 개발 공부' 카테고리의 다른 글
Toss | 서버 증설 없이 처리하는 대규모 트래픽 (0) 2024.07.27 system-design-101. CAP 이론 (CAP theorem) (2) 2024.07.14 system-design-101. REST API vs. GraphQL (0) 2024.06.09 Netflix의 BFF에서 GraphQL Federation으로 전환기 (0) 2024.04.14 유데미(Udemy) - Java 멀티스레딩, 병행성 및 성능 최적화 강의 후기 (0) 2024.03.31 - Pagination