앱 및 API 확장을 위한 앱 제공 패턴

오늘날 앱과 API를 확장하는 것은 올바른 부하 분산 알고리즘을 선택하는 것이 아닙니다. 20년 이상 앱 제공이 발전해 온 동안 거의 변함없이 유지된 것이 바로 부하 분산 알고리즘입니다. 가장 큰 이점은 가용성을 유지하는 것입니다. 이것이 성과에 미치는 영향은 최소한으로 줄었습니다. 

이는 알고리즘을 선택하는 것이 중요하지 않다는 것을 의미하지 않습니다. 결국, 라운드 로빈 은 API나 애플리케이션에 가장 좋은 선택이 아닐 수 있지만, 가장 적은 연결가장 빠른 응답 간의 선택은 아키텍처보다 디지털 서비스의 전반적인 성능과 가용성에 영향을 덜 미칠 가능성이 높습니다. 

이는 디지털 서비스를 설계하고 운영하는 데 필요한 6가지 핵심 역량 중 하나로 앱 제공이 격상됨에 따라 앱 제공에 대한 구조적 관점을 제시하는 것입니다. 

로드 밸런싱 알고리즘이란 무엇입니까?

부하 분산 알고리즘은 가용성을 보장하고 성능을 개선하기 위해 리소스 풀에 부하를 분산시키는 프로그래밍 방식입니다.

부하 분산 알고리즘은 구체적인 리소스를 선택하는 방법과 고려되는 변수를 지정합니다.

라운드 로빈 은 가장 간단한 알고리즘으로, 알려진 리소스 집합을 순차적으로 반복합니다. A, B, C라는 세 개의 리소스가 있는 경우 라운드 로빈은 첫 번째 요청을 A로, 두 번째 요청을 B로, 세 번째 요청을 C로 라우팅합니다. 그런 다음 선택 프로세스가 다시 시작됩니다.

최소 연결은 '부하가 증가하면 성능이 감소한다'는 두 번째 연산 공리(axiom)에 기반한 알고리즘입니다. 따라서 최소 연결 알고리즘 연결(부하)이 가장 적은 리소스를 선택합니다. 이 알고리즘에는 여러 변형이 있는데, 가장 주목할 만한 것은 리소스 간 용량 차이를 허용하는 가중치가 있는 최소 연결 입니다.

성능이 최우선일 때 가장 빠른 응답 시간이 사용됩니다. 로드 밸런서는 수동 또는 능동적으로 각 리소스의 응답 시간을 결정하고 모든 요청에 대해 가장 빠른 응답 시간을 선택합니다. 이 알고리즘은 마지막 마일이나 사용자 네트워크 상황에 영향을 미치지 않으므로 사용자 응답 시간을 보장하지 않습니다.

소스 IP는 소스(클라이언트) IP에 대한 간단한 해시 값을 사용하여 리소스를 선택하는 네트워크 부하 분산에서 남은 알고리즘입니다. 이 알고리즘은 주어진 소스 IP에 대해 항상 동일한 리소스를 선택합니다. 이 알고리즘은 모든 사용자가 단일 프록시/IP 주소에서 온 경우 동일한 리소스로 이동하게 되는 '메가 프록시' 문제의 영향을 받기 때문에 더 이상 선호되지 않습니다. 이러한 현상은 대상 리소스에 과도한 부담을 주어 성능이 저하되고 궁극적으로 실패로 이어질 수 있습니다.

부하 분산 알고리즘은 앱 전송 아키텍처의 중요한 부분이지만 전반적인 아키텍처적 접근 방식만큼 앱이나 디지털 서비스의 성능과 규모에 미치는 영향은 적습니다.

앱 전달이란 무엇입니까?

앱 제공은 앱, API, 디지털 서비스를 위한 확장 가능하고 성능이 뛰어난 아키텍처를 설계하는 분야입니다. 이 솔루션은 핵심 구성 요소로 부하 분산을 크게 사용하지만 레이어 7 라우팅과 같은 최신 기능을 통합하고 일반적인 아키텍처 패턴을 활용하여 성능을 최적화하고 리소스를 효율적으로 활용합니다.

우리는 로드 밸런싱(구현 세부 사항)과 아키텍처(설계 프로세스) 사이에 경계를 긋기 위해 앱 제공이라는 용어를 사용합니다.

왜 우리는 확장하는가?

규모는 비즈니스 결과에 대한 기술적 대응입니다. 즉, 고객 만족도 점수, 전환율, 수익 창출을 개선하기 위해 디지털 서비스를 구성하는 작업 부하 의 가용성과 성능을 유지해야 할 필요성이 있습니다. 마지막 부분은 특히 중요합니다. 우리 조사에 따르면 오늘날 대부분(58%)의 기업이 매출의 절반 이상을 디지털 서비스에서 창출하기 때문입니다.

예를 들어, 비즈니스 연속성(BC)을 위해 퍼블릭 클라우드를 사용하는 것도 고려해보세요. BC는 퍼블릭 클라우드의 가장 중요한 기본 사용 사례이며, 그 핵심은 글로벌 규모, 즉 글로벌 로드 밸런싱의 구현입니다. 장애 조치(Failover)는 앱 제공의 핵심 기능으로, 전체 사이트에 적용하면 요청을 한 위치에서 다른 위치로 빠르게 리디렉션할 수 있습니다.  기업의 디지털 존재감을 지속적으로 확보하는 것은 기술적 대응을 통해 가능해진 비즈니스 결과입니다.

어떻게 확장하나요?

이 질문에 답하는 것부터 앱 제공 아키텍처에 대한 기술 여정이 시작됩니다. 규모에는 수직(위)과 수평(바깥)의 두 가지 모델이 있습니다.

수직적 확장은 시스템에 더 많은 처리 능력을 추가하면 용량이 늘어난다는 원칙에 기초합니다. 이러한 확장 방법은 주로 자체 포함형 모노리식 애플리케이션과 시스템에 이점이 있습니다. 인프라를 제외하면 대부분의 조직은 더 이상 수직적 규모에 의존하지 않습니다. 수직적 규모를 위해서는 CPU나 RAM을 추가하거나 네트워크 용량을 확장하는 등 물리적 환경을 변경해야 하기 때문입니다. 가상화를 통해 수직적 확장이 훨씬 빨라졌지만, 특히 퍼블릭 클라우드 환경에서는 소프트웨어와 시스템을 마이그레이션해야 하는 요구 사항이 발생하면 방해가 될 수 있습니다. 이는 새로운 가상 머신으로 마이그레이션하는 경우에도 마찬가지입니다.

수평적 확장은 사용 가능한 총 리소스를 늘려서 더 많은 처리 능력을 추가하는 아키텍처적 접근 방식입니다. 이는 여러 애플리케이션, 서비스 또는 시스템 인스턴스에 처리 능력을 분산시켜 달성됩니다. 이는 리소스를 마이그레이션하는 대신 복제하는 데 의존하므로 오늘날 가장 일반적인 확장 방법입니다. 더욱이 수평적 확장은 수직적 확장 보다 더 다양한 아키텍처 옵션을 제공하므로 모든 애플리케이션과 API에 더 적합합니다.  

따라서 현대의 앱 제공 패턴이 수평적 규모의 원칙에 기반을 두고 있다는 것은 놀라운 일이 아닙니다.

앱 전달 패턴

단순히 수평적 규모를 선택하는 것으로 논의가 끝나는 것은 아닙니다.

결정이 내려지면(일반적으로 기본 결정입니다) 구현과 관련된 아키텍처 결정을 내릴 때 추가적인 고려 사항을 고려해야 합니다. 이러한 결정에 접근하는 가장 간단한 방법은 The Art of Scalability라는 책에서 설명한 대로 스케일 큐브 의 렌즈를 통해서입니다.

매우 간단하게 말하면, 스케일 큐브에는 x, y, z라는 세 개의 축이 있습니다. 각각은 로드 밸런싱 아키텍처 패턴에 매핑됩니다. 이러한 각 패턴은 다양한 유형의 애플리케이션과 API에 따른 성능 및 가용성과 관련된 특정 결과를 충족하는 데 적합합니다.

디지털 서비스는 성능과 리소스 소비를 동시에 최적화하기 위해 여러 패턴을 통합하는 아키텍처를 사용할 가능성이 높습니다. 이러한 접근 방식에는 시스템적 사고가 필요합니다. 모든 구성 요소, 구성 요소 간 상호작용, 사용자에서 앱으로 요청이 흐르는 방식 등을 고려해야 하기 때문입니다.

X축 스케일

X축 패턴은 가장 기본적인 패턴입니다. 이는 수평적 복제를 기반으로 하며 대부분의 작업은 부하 분산 알고리즘을 통해 수행됩니다. 가장 간단한 패턴이며, 제가 POLB(Plain Old Load Balancing)라고 부르는 결과를 가져옵니다.

이렇게 부르는 이유는 애플리케이션 계층에서 요청 및 응답과 상호 작용하기 위해 최신 로드 밸런서의 고급 기능을 활용하지 않는 아키텍처의 단순성 때문입니다.

이 패턴에서는 애플리케이션이 복제되고, 구성된 부하 분산 알고리즘의 결정에 따라 요청이 인스턴스로 전달됩니다. 

이 패턴은 종종 TCP(4계층)와 함께 사용되기 때문에 HTTP(7계층) 검사에 의존하는 다른 패턴보다 성능상 이점이 있습니다. 대체로, 프록시를 사용하는 대신 연결을 함께 연결할 수 있으며, 이를 통해 초기 연결 후 로드 밸런서를 네트워크 홉으로 효과적으로 바꿀 수 있습니다. 이를 통해 전반적인 성능은 향상되지만 초기 연결 이후 로드 밸런서가 요청 및 응답을 검사하거나 조치를 취할 수 있는 기능이 사라집니다. X축 아키텍처는 가용성을 보장하는 데 탁월하고 성능이 매우 뛰어나 방화벽과 애플리케이션 게이트웨이와 같은 인프라와 보안 서비스를 확장하는 데 자주 사용됩니다. 

다양한 기존 애플리케이션(모놀리스, 3계층 웹, 클라이언트-서버)은 이 패턴을 사용하여 확장되는 경향이 있습니다. 이러한 애플리케이션이 최신 앱 제공 아키텍처에 활용할 수 있는 보다 개별적인 구성 요소로 분해되는 경우가 거의 없기 때문입니다.

Y축 스케일

이 패턴은 기능 분해를 기반으로 하며, 전체 시스템이 아닌 기능에 따라 확장하기 위해 앱 제공의 애플리케이션 계층(계층 7) 기능을 활용합니다. y축 패턴은 레이어 7 라우팅이 앱 전송 아키텍처 툴박스에서 핵심 도구가 되는 첫 번째 패턴입니다.

일반적으로 y 및 z 기반 패턴은 7계층 라우팅을 활용하여 풀을 선택한 다음 부하 분산 알고리즘을 사용하여 특정 리소스를 선택합니다. 이는 7계층 라우팅이 사용되지 않는 기본 x 패턴과는 다릅니다.

이 패턴은 일반적으로 HTTP인 7계층에서 작동한다고 가정하고 일부 변수를 사용하여 트래픽을 애플리케이션이나 서비스의 특정 인스턴스로 분산합니다. 예를 들어, URI에서 패턴 /login이 발견되면 로드 밸런서는 구성된 로드 밸런싱 알고리즘을 기반으로 로그인 요청만 처리하는 앱 인스턴스 풀에서 인스턴스를 선택합니다. 변수는 요청 헤더나 요청 페이로드의 어떤 것이든 될 수 있습니다. 이를 통해 에이전트 기반 라우팅, API 라우팅, 콘텐츠 기반 라우팅(이미지, 스크립트 등)이 가능합니다.

애플리케이션 인스턴스는 복제본일 수 있습니다. 이는 요청의 변수를 통해 식별할 수 있는 앱 사용에 차이가 있을 때 종종 발생합니다. 예를 들어, 로그인체크아웃 기능 요청의 URI, HTTP 헤더의 값 또는 요청 페이로드의 값을 통해 구별할 수 있습니다. y축 패턴을 적용하면 기존 애플리케이션은 기능에 따라 확장할 수 있으며, 다른 기능의 예상 성능을 유지하는 동시에 대용량 기능을 처리하는 데 더 많은 리소스를 할당할 수 있으므로 리소스 활용 효율성이 더욱 높아집니다.  

y축 패턴을 사용하여 기존 애플리케이션을 기능적으로 확장하는 방식은 오늘날 애플리케이션을 기능적으로 분해하는 마이크로서비스가 널리 퍼지기 전부터 시작되었습니다. y축 패턴은 마이크로서비스에도 여전히 적용할 수 있으며, 실제로 이 패턴은 오늘날 인그레스 컨트롤러 에 의해 구현됩니다. 눈치 빠른 독자라면 이 패턴이 HTTP(7계층) 구성에 의존하는 API에도 적용 가능하다는 것을 알아차릴 것입니다. 따라서 API 게이트웨이가 이 기본 패턴을 활용하는 것은 놀라운 일이 아닙니다.

이 패턴은 웹 2.0 초기부터 eBay에 의해 유명해졌습니다 . 확장성 아키텍처에는 기능을 별도의 애플리케이션 풀로 분할하는 것이 포함되었습니다. 한 세트의 애플리케이션 서버는 판매 기능을 담당하고, 다른 세트의 애플리케이션 서버는 입찰 기능을 담당하며, 또 다른 세트의 애플리케이션 서버는 검색 기능을 담당했습니다. 그들은 총 16,000여 개의 애플리케이션 서버를 220개의 서로 다른 풀로 구성했습니다. 이를 통해 각 풀을 해당 기능의 요구 사항과 리소스 소비에 따라 서로 독립적으로 확장할 수 있었습니다. 이를 통해 리소스 종속성을 분리하고 합리화할 수도 있었습니다. 예를 들어 판매 풀은 백엔드 리소스 중 비교적 작은 하위 집합과만 통신하면 되었습니다.

y축 패턴은 이미지와 같은 여러 유형의 콘텐츠 요청을 하나의 리소스 풀에 분배하고, 다른 유형의 콘텐츠 요청을 다른 리소스 풀에 분배하는 데에도 사용할 수 있습니다.

y축을 사용하여 부하를 분산하면 디지털 서비스의 구성 요소를 개별적으로 확장할 수 있으며, 이는 x축 패턴보다 리소스 활용 측면에서 훨씬 더 효율적입니다. 이를 통해 서비스 또는 애플리케이션 계층에서 구성 최적화가 가능해져 주어진 콘텐츠 유형을 최적화하기 위해 웹 또는 앱 서버의 특정 변수를 조정하여 성능을 개선할 수 있습니다.  

Z축 스케일

Z축 패턴은 소셜 미디어와 인터넷의 폭발적인 성장에 따라 반드시 필요하게 되어 인기를 얻었습니다. 이는 본질적으로 추가 세분화가 적용된 Y축 확장 패턴으로, 일반적으로 사용자 이름이나 장치 식별자와 같은 특정 변수를 기반으로 합니다.

이 패턴은 데이터 분할에서 파생된 기술을 사용하여 아키텍처적 차별화를 허용합니다.

이 패턴은 요청의 일부 데이터에 따라 요청을 분산시키는 데이터베이스에서 사용되는 원칙을 적용합니다. 이는 데이터 계층의 병목 현상을 해결하는 데 도움이 될 뿐만 아니라 데이터 주권 규칙을 준수하는 수단으로 사용할 수도 있습니다. 식별 가능하고 일반적으로 고유한 변수를 사용하여 수평적으로 확장된 리소스 풀에서 요청을 라우팅합니다. 이 패턴은 일반적으로 특정 서비스나 애플리케이션에 대한 대량의 요청 등 높은 처리량이 필요할 때 사용됩니다.

Z축 패턴은 수백만 개에 달할 수 있는 에지 및 IoT 장치를 관리하는 데 특히 유용합니다. 샤딩 요청의 기본 패턴으로 장치 식별자를 사용하면 데이터 전송 속도를 크게 향상시킬 수 있습니다. 이 기능은 특히 원격(클라우드나 데이터 센터) 위치에 구성을 저장하는 장치에 유용할 수 있습니다. 이 데이터는 장치에 고유하며 안전하게 분할할 수 있기 때문입니다.

이 패턴은 높은 부하에서 데이터 액세스가 이루어지면 성능이 크게 저하될 수 있으므로 성능을 향상시키는 경향이 있습니다. 따라서 더 많은 인스턴스로 데이터 액세스를 분할하면 부하가 감소하고 그에 따라 성능이 향상됩니다. 이렇게 하려면 데이터 무결성에 신중하게 주의해야 하며, 공유 데이터를 분할하는 데 사용할 경우 일관성 문제가 발생할 수 있습니다. 메타는 전체 아키텍처의 일부로 서비스 샤딩을 개발하면서 샤딩이라는 주제를 확대했습니다 . 성능이 뛰어나고 확장성이 뛰어난 앱 전송 아키텍처를 개발하는 데 세심한 주의를 기울이는 것은 대규모 아키텍처 내의 공식적 계층으로 앱 전송을 인식하는 것이 어떻게 상당한 이점을 가져올 수 있는지를 보여주는 훌륭한 사례입니다.

기본이 아닌 데이터 소스에 액세스하는 서비스의 경우, z축 패턴은 시스템 전체의 데이터 품질에 큰 영향을 주지 않고도 처리량을 향상시킬 수 있습니다. 이러한 접근 방식에서는 특정 애플리케이션이나 API 인스턴스를 데이터 소스에 연결하는 코드를 추가할 필요성이 사라지고, 인스턴스 수준에서 데이터 커넥터를 구성하고 앱 제공 라우팅을 결합하여 올바른 데이터 소스가 사용되도록 보장합니다.

확장의 비결은 앱 제공 아키텍처입니다.

오늘날 디지털 서비스가 제공되는 세상에서 단일 앱 제공 패턴만 사용하여 고성능의 안정적인 디지털 서비스를 구축하는 경우는 드뭅니다. 이는 디지털 서비스의 본질적인 복잡성과 장치, 사람, 소프트웨어에 걸쳐 나타날 수 있는 '사용자'의 다양성 증가 때문입니다.

따라서 아키텍처적 접근 방식은 사용자에게 최적의 경험을 제공하기 위해 디지털 서비스 전반에서 앱 제공 패턴을 가장 잘 활용하는 방법을 고려합니다.

디지털 서비스를 구성하는 서비스와 애플리케이션에 크게 의존하기 때문에 '올바른' 또는 '잘못된' 아키텍처 솔루션은 없습니다. 단, 이러한 솔루션은 부하 분산 알고리즘에만 기반해서는 안 됩니다.

실제로, 부하 분산 패턴 내에서 부하를 어떻게 분산할 것인지 선택하는 것보다 특정 앱이나 API에 맞는 아키텍처를 선택하는 것이 더 중요하기 때문에 알고리즘 선택에 대한 언급이 전혀 없다는 점에 유의해야 합니다.

이는 앱 제공을 규율하는 요인 중 하나입니다. 오늘날 앱 전송 및 보안이 사용되고 구현되는 방식은 단순한 웹 서버 규모를 훨씬 넘어섭니다. 이를 구현하면 성능, 가용성에 영향을 미칠 수 있으며, 궁극적으로 비즈니스 성과에 영향을 미칠 수도 있고, 실패로 이어질 수도 있습니다. 따라서 조직에서는 앱 제공을 디자인 툴박스의 전략적이고 구조적인 도구로 접근하는 것이 중요합니다.

부하 분산은 확장을 위한 핵심 기술 요구 사항으로 남아 있습니다. 앱 전송 패턴을 이해하고 이를 통해 부하 분산을 활용하는 방식을 이해하면 디지털 서비스의 확장성과 성능을 설계하는 데 더 나은 관점을 제공할 수 있습니다. 특히 해당 서비스가 하이브리드 형태이고 API와 최신 앱과 기존 앱이 혼합된 경우 더욱 그렇습니다.