응용 프로그램을 확장 가능하게 만드는 것은 무엇입니까?


37

구직 게시물에서 신청자가 "확장 가능한"응용 프로그램 작성 경험이 있어야한다는 것을 계속보고 있습니다. 애플리케이션을 확장 가능하게 만드는 이유는 무엇이며 코드가 수백만 명의 사용자로 확장 될 수 있다는 것을 어떻게 알 수 있습니까?


이 질문을 표현하는 더 좋은 방법은 다음과 같습니다. 확장 성을 염두에두고 코드를 작성하려면 어떻게해야합니까? 따라서 코드는 나중에 생각하는 것과 달리 시작부터 확장 가능합니다. 특정 설계 방법론이 있습니까? 아니면 단순히 작업에 맞는 올바른 알고리즘을 선택하는 것입니까?

답변:


24

확장성에는 두 가지 방향이 있습니다.

  • 수직 (일명 확장) : 더 빠른 CPU, 더 많은 RAM, 더 많은 디스크 공간;
  • 수평 (일명 확장) : CPU의 코어가 많을수록 CPU가 많을수록 서버가 더 많아집니다.

첫 번째는 임의의 제한이 없는지주의해야합니다. 정수 크기가 너무 작거나 길이가 고정 / 제한된 구조 때문입니다. 이러한 구조는 기본 OS와 관련이있을 수 있습니다. 예를 들어, 더 많은 스레드 또는 프로세스를 사용하여 확장하려고하면 어느 시점에서 OS 한계에 도달하게됩니다. 이것이 현재 확장 성이 뛰어난 서버가 비동기 이벤트를 기반으로 동시성을 수행하는 이유입니다. 이 문제는 유명한 C10K 문서에 설명되어 있습니다 .

두 번째는 더 어렵다. 두 가지를 염두에두고 프로그래밍해야합니다. 데이터가 병렬로 처리되고 데이터가 실제로 분산 될 수 있습니다. 노드 간의 통신이 제한되어야합니다. 실제로는 일반적으로 ACID의 일부를 희생해야 함을 의미합니다 (전체 ACID를 보유 할 수 없으며 동시에 확장 할 수 없음). 이 패러다임에서 가장 잘 알려진 데이터 스토리지 솔루션 은 NoSQL 솔루션입니다. 매우 단순한 키-값 저장소에서 시스템 RDBMS와 유사하며 결합 할 수있는 기능 만 제거되었습니다. 키 - 값 저장은 매우 확장 성이 있지만,이 가격으로 제공됩니다. 기본적으로 기본 키에서만 쿼리 할 수 ​​있습니다. 그러나 그것에 대한 해결책이 있습니다.. 누적 복잡성 관점을 살펴보면 매우 차선책 일 수 있지만 엄청나게 평행하게 실행되고 있음을 명심해야합니다.

실제 사례를 통한 확장성에 대한 자세한 내용을 보려면 HighScalability.com 블로그를 확인하십시오 .


스케일 아웃을 언급하면 ​​+1입니다. 더 많은 리소스를 추가하는 것은 의사 결정자에게 매우 빠르고 매력적입니다 (일부 16 진 코어를 구매하고 메모리를 두 배로 늘리십시오!). 그러나 응용 프로그램이 그들에게 압력을 가할 수 없다면 더 큰 문제가 있습니다.
jqa

14

확장 성은 일부 변수를 기준으로 처리량 측면에서 측정됩니다. 예를 들어 X 사용자의 초당 요청 수입니다 . 확장 성을 설명하는 가장 간단한 방법은 다음과 같습니다.

부하가 증가함에 따라 효율성 을 측정 합니다.

확장 성을 위해 설계 할 때 가장 먼저 이해해야 할 것은 어플리케이션에 어떤 측정이 가장 중요합니까? 확장 성의 핵심 요소 인 효율성 을 측정하는 방법에는 여러 가지가 있습니다 .

  • 초당 동시 요청
  • 요청 당 평균 응답 시간
  • 초당 / 분당 처리 된 레코드 수

사용할 수있는 효율 측정이 더 있지만 웹 기반 시스템 또는 배치 처리 시스템에 일반적입니다.

확장 성의 다음 측면은 부하가 증가함에 따라 효율성에 미치는 영향을 측정하는 것입니다. 로드를 늘리는 일반적인 방법은 다음과 같습니다.

  • 더 많은 사용자가 서버를 방문합니다 (예 : 더 많은 웹 트래픽)
  • 데이터베이스에 더 많은 데이터 (예 : 쿼리 시간이 오래 걸리거나 처리 시간이 오래 걸림)
  • RAID의 하드 드라이브 오류 (스토리지 성능 / 신뢰성에 영향을 미침)
  • 네트워크 포화

확장 가능한 응용 프로그램의 목표는 부하 문제를 처리 할 때 효율성을 유지하거나 향상시키는 것입니다. 요컨대, 응답 시간이 너무 오래 걸리는 경우 부하를 고르게 분산시키기 위해 다른 서버를 추가 할 수 있습니까? 이 접근 방식은 한 서버의 작업량을 줄이고 효율성을 위해 서버를 "스위트 스폿"에서 운영합니다.

애플리케이션은 확장 성을 위해 특별히 설계되어야합니다. 즉, 세션 데이터에주의를 기울여 요청을 올바른 서버로 라우팅하여 병목 현상을 줄이면 응용 프로그램의 확장 기능이 제한됩니다.


5

기본적으로 사용자 수를 늘리거나 더 큰 데이터 세트를 처리하거나 더 많은 언어로 인터페이스를 제공 할 때 성능 병목 현상을 피하려고합니다.

기본적으로 데이터베이스 스키마, 알고리즘 및 소프트웨어 개발 프로세스를보고 미래의 문제를 예측하려고합니다. 또한 문제점을 빌드 할 때 문제점을 식별하도록 성능 모니터링을 설정하려고합니다.

확장 가능한 웹 사이트 구축 (아마존 링크)을 읽을 때이 팁을 선택했습니다 .

도움이 되었기를 바랍니다!


3

응용 프로그램을 진정으로 확장 할 수있는 유일한 방법은 전달할 수없는 (또는 매우 비싼) 제한이없는 것입니다.

일반적인 예는 사용 가능한 CPU 사이클이 부족하면 어떻게됩니까? 프로그램이 멀티 트레드 된 경우 여러 코어가있는 상자에서 실행할 수 있지만 더 이상 큰 상자를 구입할 수 없으면 어떻게됩니까? 응용 프로그램은 더 이상 확장 할 수 없으므로 확장 성이 없습니다.

진정으로 확장 가능한 응용 프로그램은 여러 컴퓨터에 투명하게 확산 될 수 있어야하며 눈에 띄는 충돌없이 확장 할 수 있어야합니다. 쉬운 일이 아니며 Google이 그토록 성공한 이유 중 하나입니다.


1

대규모 응용 프로그램을 지원할 때 발생하는 고유 한 문제가 있습니다. 구인 광고는 해당 환경에서 근무했으며 이러한 문제를 해결해야하는 지원자를 찾고 있습니다.

높은 수준의 응용 프로그램에서이 코드 조각이 아주 짧은 기간에 수천 번 실행되도록 요청되면 어떻게 될지에 대한 질문을 지속적으로 요청함으로써 확장 가능하게됩니다. 이는 메모리 풋 프린트 관리, 총계 및 데이터 캐싱 사용, 자체 확장 가능한 데이터 소스 사용 등을 의미합니다.


1

검색 할 DB에 100 개의 행이 있고 한 번에 10 명의 사용자가이를 사용할 때 성능이 우수한 검색 기능을 빌드하는 경우. 100 명의 사용자가 동시에 사용하고 조회 할 행이 100K 일 때의 성능은 어느 정도입니까?

그것이 무엇이든 상관없이 동일한 성능을 발휘한다면 매우 좋습니다. 사용자 / 데이터의 양에 비례하여 수행하면 (처리하는 데 10x 더 많은 데이터 == 10x 더 길다는 의미) 좋습니다. 더 많은 데이터를 수행하면 (10x 모드 데이터 == 10x ^ 10 처리 시간이 길어짐) 확장 성이 떨어집니다.

내 예제는 실제로 Big O 표기법으로 표시되어야하지만 현재 Big O로 예제를 작성하기에 충분히 잘 모릅니다.

더미 데이터를 DB에 덤프하여 더 많은 데이터를 시뮬레이션 할 수 있으며 Apache AB와 같은 더 많은 사용자를 시뮬레이션하는 도구가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.