DEV Community

NeNoVen
NeNoVen

Posted on

Latency 결정 요소

  1. 서버 응답 시간: 백엔드 서버가 클라이언트 요청에 대한 응답을 생성하는 데 걸리는 시간입니다. 이는 서버의 하드웨어 및 소프트웨어 성능, 코드 효율성 및 부하에 따라 달라집니다.

    • 개선방안

    1. 분산 시스템 아키텍처:
        - eBay는 검색 요청을 처리하기 위해 분산 시스템 아키텍처를 사용합니다. 여러 서버와 데이터 센터에 검색 서비스를 분산하여 부하 분산 및 가용성을 확보합니다.
    2. 인덱싱 및 쿼리 최적화:
        - eBay는 검색을 위해 뛰어난 인덱싱 및 쿼리 최적화 기술을 사용합니다. 검색어와 관련된 데이터를 미리 인덱싱하고 쿼리를 최적화하여 빠른 검색 결과를 얻습니다.
    3. 캐싱 및 프리페칭:
        - 검색 결과를 캐싱하고 사용자가 유사한 검색을 다시 수행할 때 빠르게 결과를 제공합니다. 또한, 프리페칭을 통해 사용자 예측을 기반으로 결과를 미리 계산할 수 있습니다.
    4. 비동기 및 병렬 처리:
        - 검색 요청을 비동기적으로 처리하고, 병렬 처리를 통해 여러 검색 작업을 동시에 수행하여 응답 시간을 최적화합니다.
    5. 하드웨어 최적화:
        - eBay는 고성능 하드웨어와 SSD (Solid State Drive)를 사용하여 빠른 데이터 액세스를 가능하게 합니다.
    6. 모니터링 및 스케일링:
        - 실시간 모니터링 및 성능 분석을 통해 검색 서비스의 성능을 지속적으로 관찰하고 필요한 경우 자동으로 확장합니다. 클라우드 기반 인프라를 활용하여 수요에 맞추어 자원을 동적으로 확장할 수 있습니다.
    7. CDN (콘텐츠 전달 네트워크):
        - 정적 콘텐츠를 CDN을 통해 전달하여 전 세계 사용자에게 빠른 응답 속도를 제공합니다.
    8. 검색 엔진 최적화 (SEO):
        - 검색 엔진 최적화를 통해 검색 엔진에서 eBay의 상품 및 서비스가 노출되도록 관리합니다.
    </aside>
    
  2. 데이터베이스 액세스: 데이터베이스에서 데이터를 읽거나 쓰는 데 필요한 시간입니다. 데이터베이스 쿼리의 복잡성, 인덱스의 존재, 데이터베이스 서버의 성능 등이 영향을 미칩니다.

    • 개선방안

    1. 인덱스 최적화:
        - 데이터베이스에서 자주 사용되는 쿼리를 위해 필요한 인덱스를 만듭니다. WHERE 절, JOIN 및 ORDER BY 절에서 사용되는 열에 인덱스를 생성하면 데이터 검색이 빨라집니다.
    2. 쿼리 최적화:
        - 쿼리를 최적화하여 효율적으로 실행되도록 합니다. 불필요한 JOIN, 서브쿼리 또는 비효율적인 조건문을 제거하거나 개선합니다.
    3. 캐싱 활용:
        - 데이터베이스 쿼리 결과를 캐싱하여 이전에 검색한 결과를 다시 계산하지 않도록 합니다. 이는 반복적인 요청에 대한 성능을 크게 향상시킬 수 있습니다.
    4. 비동기 처리:
        - 데이터베이스 작업 중에서 동기적으로 처리해야 하는 것이 아니라면 비동기 처리를 고려합니다. 이를 통해 요청 대기 시간을 줄이고 시스템 응답성을 향상시킬 수 있습니다.
    5. 수평 및 수직 분할:
        - 대용량 데이터베이스 테이블의 경우, 수평 분할(Sharding) 또는 수직 분할을 통해 데이터를 분산하고 부하를 분산합니다.
    6. 쿼리 튜닝 도구 사용:
        - 데이터베이스 쿼리를 튜닝하기 위한 도구와 모니터링 솔루션을 사용하여 쿼리 성능을 분석하고 개선합니다.
    7. NoSQL 데이터베이스 고려:
        - 관계형 데이터베이스가 스키마 변화나 고정된 테이블 구조를 필요로하지 않는 경우, NoSQL 데이터베이스를 고려합니다. NoSQL 데이터베이스는 더 유연하게 데이터를 저장하고 검색할 수 있습니다.
    8. 데이터 정규화와 역정규화:
        - 데이터 정규화를 통해 데이터 중복을 최소화하고 데이터 일관성을 유지할 수 있지만, 때로는 역정규화를 통해 데이터베이스 액세스 속도를 향상시킬 수 있습니다.
    9. 최적화된 하드웨어 사용:
        - 데이터베이스 서버에 고성능 하드웨어 및 SSD를 사용하여 데이터 액세스 속도를 향상시킵니다.
    10. 실시간 모니터링 및 로깅:
        - 데이터베이스 작업을 실시간으로 모니터링하고 성능 이슈를 감지하며, 로깅을 통해 문제를 식별하고 해결합니다.
    </aside>
    
  3. 네트워크 지연: 백엔드 서버와 데이터베이스 서버 또는 다른 서비스 간의 통신에 걸리는 시간입니다. 이것은 네트워크 대역폭, 지리적 거리, 네트워크 장비 및 라우팅에 영향을 받을 수 있습니다.

    • 개선방안

    1. CDN (콘텐츠 전달 네트워크) 사용:
        - 정적 콘텐츠를 CDN을 통해 전달합니다. CDN은 전 세계 다양한 위치에 서버를 두고 콘텐츠를 캐싱하여 사용자가 빠르게 액세스할 수 있도록 합니다.
    2. 지리적 로드 밸런싱:
        - 서버를 지리적으로 분산하여 사용자가 지연 시간이 짧은 서버에 연결될 수 있도록 합니다. 클라우드 서비스 제공업체에서 이러한 로드 밸런싱 서비스를 제공합니다.
    3. 캐싱 및 프리페칭:
        - 자주 요청되는 데이터를 미리 캐싱하여 사용자가 요청할 때 더 빠르게 제공합니다. 또한, 사용자의 예측을 기반으로 데이터를 미리 가져와 사용자 경험을 향상시킵니다.
    4. 네트워크 최적화:
        - 네트워크 트래픽을 최적화하기 위해 데이터 압축 및 최적화 프로토콜 (예: HTTP/2)을 사용합니다. 또한, 사용자의 위치와 네트워크 상태에 따라 최적의 서버를 선택합니다.
    5. 클라우드 기반 서버 배포:
        - 클라우드 서비스를 사용하여 필요한 리소스를 빠르게 확장하고 부하를 분산합니다. 클라우드 제공업체는 빠른 네트워크 및 지역 데이터 센터를 제공합니다.
    6. 네트워크 최적화 도구 사용:
        - 네트워크 성능을 모니터링하고 최적화하는 도구와 서비스를 활용합니다. 이러한 도구는 네트워크 병목 현상을 식별하고 해결하는 데 도움을 줍니다.
    7. 로드 밸런서 사용:
        - 로드 밸런서를 사용하여 요청을 여러 서버로 분산시키고 부하를 고르게 분산시킵니다. 이로써 단일 서버에 대한 요청이 줄어들고 응답 시간이 개선됩니다.
    8. DNS 최적화:
        - 빠른 DNS 서비스를 사용하여 도메인 이름을 IP 주소로 변환하는 시간을 최소화합니다. 또한, 다양한 DNS 서버 위치를 고려하여 네트워크 지연을 최소화합니다.
    9. 연결 품질 모니터링:
        - 사용자의 연결 품질을 모니터링하고, 연결이 불안정한 경우 다른 서버로 전환하여 빠른 응답을 유지합니다.
    10. 서버 최적화:
        - 서버의 하드웨어 및 네트워크 설정을 최적화하여 데이터 전송 및 처리 속도를 향상시킵니다.
    </aside>
    
  4. 외부 서비스 호출: 백엔드에서 외부 서비스 또는 API를 호출할 때, 그 서비스의 응답 시간이 Latency에 기여합니다.

    • 개선방안

    1. Circuit Breaker 패턴 사용:
        - Circuit Breaker 패턴을 도입하여 외부 서비스 호출 중 장애가 발생할 경우 시스템의 안정성을 유지합니다. Circuit Breaker는 일시적으로 외부 호출을 차단하고 장애 회복을 시도합니다.
    2. Timeout 설정:
        - 각 외부 서비스 호출에 대한 Timeout 값을 설정하여 응답을 기다리는 시간을 제한합니다. 이렇게 하면 무한정 대기하는 상황을 방지하고 응답 지연을 제한할 수 있습니다.
    3. Retry 메커니즘 도입:
        - 외부 서비스 호출 시 장애가 발생한 경우, 자동으로 재시도 메커니즘을 도입하여 일시적인 문제에 대비합니다. 일정 횟수의 재시도 후에도 실패할 경우 오류 처리를 수행합니다.
    4. **서비스 폴백 메커니즘**:
        - 외부 서비스 호출이 실패한 경우 대체 데이터 또는 폴백 서비스를 제공하여 사용자에게 유용한 정보를 계속 제공합니다.
    5. 외부 서비스 모니터링:
        - 외부 서비스 호출의 상태를 지속적으로 모니터링하고 장애를 신속하게 감지합니다. 모니터링 도구를 사용하여 성능 및 가용성을 추적합니다.
    6. 회로 차단기 상태 모니터링:
        - Circuit Breaker의 상태를 모니터링하고 실패 비율이 일정 수준을 초과하면 자동으로 차단된 회로를 복구하도록 합니다.
    7. 서비스 프록시 사용:
        - 외부 서비스 호출을 위한 프록시 서버를 도입하여 외부 서비스와의 통신을 관리하고 보안을 강화합니다.
    8. 보안 고려:
        - 외부 서비스 호출에 대한 인증 및 권한 부여를 적절하게 처리하여 보안을 강화합니다.
    9. 병렬 호출 제한:
        - 동시에 여러 외부 서비스 호출을 제한하여 서버 리소스 소비를 제어하고 부하를 관리합니다.
    10. 강화된 로깅 및 알림:
        - 외부 서비스 호출과 관련된 로그를 상세히 기록하고, 장애 발생 시 적절한 알림을 관리자에게 전송하여 문제를 신속하게 파악하고 대응합니다.
    </aside>
    
  5. 처리 시간: 요청을 처리하는 동안 발생하는 계산 및 로직 실행 시간도 Latency에 포함됩니다.

    • 개선방안

    1. 코드 최적화:
        - 코드를 최적화하여 불필요한 계산을 줄이고 성능을 향상시킵니다. 반복문과 재귀 호출 등의 비효율적인 패턴을 최소화하고 알고리즘을 개선합니다.
    2. 비동기 처리:
        - 요청을 처리하는 중에 필요한 작업을 비동기적으로 수행합니다. 이를 통해 응답 대기 시간을 최소화하고 동시성을 높입니다.
    3. 메모리 캐싱:
        - 자주 사용되는 계산 결과나 데이터를 메모리 캐시에 저장하여 빠르게 액세스합니다. 이를 통해 계산 시간을 절약하고 응답 시간을 단축합니다.
    4. 데이터베이스 최적화:
        - 데이터베이스 액세스를 최적화하고 쿼리 실행 계획을 개선하여 데이터 검색 및 조작 시간을 줄입니다.
    5. 분산 아키텍처:
        - 요청 처리를 분산 아키텍처로 설계하여 작업을 여러 서버 또는 컨테이너로 분산시킵니다. 이를 통해 요청을 병렬로 처리하고 응답 시간을 단축합니다.
    6. 병렬 처리:
        - 다중 코어 또는 다중 스레드를 활용하여 병렬 처리를 구현합니다. 병렬 처리를 통해 동시에 여러 작업을 수행하여 처리 시간을 단축합니다.
    7. 로깅 및 디버깅:
        - 코드 실행 시간을 로그로 기록하고 성능 문제를 식별하는 데 도움을 주는 디버깅 도구와 모니터링 도구를 활용합니다.
    8. 코드 프로파일링:
        - 코드 프로파일링 도구를 사용하여 코드 실행 시간을 측정하고 병목 현상을 찾아내어 최적화 대상을 확인합니다.
    9. 하드웨어 업그레이드:
        - 필요한 경우 하드웨어 리소스를 업그레이드하여 더 빠른 계산을 가능하게 합니다.
    10. 최적화된 라이브러리 및 프레임워크 사용:
        - 최신 버전의 라이브러리 및 프레임워크를 사용하여 최적화된 함수 및 기능을 활용합니다.
    </aside>
    
  6. 부하와 확장성: 서버 부하와 확장성 결정은 Latency에 직접적인 영향을 미칩니다. 부하가 높거나 서버가 확장되지 않으면 Latency가 증가할 수 있습니다.

    • 개선방안

    1. 부하 분산:
        - 서버 부하를 분산하기 위해 로드 밸런서를 도입합니다. 로드 밸런서는 들어오는 요청을 여러 서버로 분배하여 각 서버의 부하를 분산시킵니다.
    2. 수평 확장 (Horizontal Scaling):
        - 필요한 경우 서버 인스턴스를 추가하여 수평 확장을 구현합니다. 즉, 서버를 복제하여 더 많은 요청을 처리할 수 있도록 합니다.
    3. 자동 확장 (Auto Scaling):
        - 클라우드 환경에서는 자동 확장 기능을 활용하여 트래픽이 증가할 때 자동으로 서버 인스턴스를 추가하고, 트래픽이 감소할 때 서버를 축소합니다.
    4. 캐싱:
        - 자주 요청되는 데이터 또는 계산 결과를 캐싱하여 서버 부하를 줄입니다. 캐싱은 데이터베이스 또는 계산 집약적인 작업의 부하를 줄여 Latency를 낮추는 데 도움이 됩니다.
    5. 비동기 처리:
        - 요청 처리 중에 동기적으로 처리해야 하는 작업을 비동기적으로 처리하여 응답 시간을 최소화합니다. 대표적인 예로 백그라운드 작업 큐 또는 메시지 브로커를 활용할 수 있습니다.
    6. 데이터베이스 최적화:
        - 데이터베이스 쿼리의 부하를 최소화하기 위해 인덱스, 캐싱, 쿼리 최적화 등을 고려합니다. 또한, 수평 분할 (Sharding)을 사용하여 데이터베이스 부하를 분산시킵니다.
    7. 네트워크 최적화:
        - 네트워크 대역폭을 늘리거나 CDN을 활용하여 네트워크 부하를 최소화합니다. 빠른 네트워크 연결은 Latency를 낮출 수 있습니다.
    8. 모니터링 및 로깅:
        - 서버 부하와 성능을 지속적으로 모니터링하고 문제가 발생할 때 신속하게 대응합니다. 로깅을 통해 성능 이슈를 식별하고 개선합니다.
    9. 하드웨어 업그레이드:
        - 필요한 경우 서버 하드웨어를 업그레이드하여 높은 성능을 제공하도록 합니다.
    10. 클라우드 서비스 활용:
        - 클라우드 서비스 제공업체의 관리형 서비스를 활용하여 서버 운영 및 확장을 단순화하고 Latency를 관리합니다.
    </aside>
    

Top comments (0)