확장 성 및 마이크로 서비스 : Docker로가는 길

안녕,

이 기사의 목표는 확장 성과 마이크로 서비스를 이해하고 이것이 Docker로가는 길을 어떻게 이끄는 지 이해하도록하는 것이지만, Docker를 사용하는 유일한 이유는 확장 성과 마이크로 서비스가 아님을 분명히하겠습니다. 다른 많은 장점이 있습니다.

또한 마이크로 서비스에 대해 이야기 할 때 대부분 사람들이 Docker를 외치기 시작합니다.

"아니! Docker는 마이크로 서비스가 아니며 우리가 마이크로 서비스를 구현할 수있는 유일한 방법으로 Docker를 사용하지 않습니다. "

마이크로 서비스와 Docker는 마이크로 서비스를 구현하고 확장 할 때 좋은 듀오 일 뿐이므로 Netflix, Spotify, IBM 등의 대기업에서 채택했습니다.

따라서 시나리오를 고려하여 확장 성이해하기 시작 하겠습니다 .

애플리케이션을 만들고 클라우드 또는 온 프레미스의 서버에서 호스팅했으며 초당 10,000 명의 사용자를 확보했으며 애플리케이션을 실행하는 서버가 사용자에게 쉽게 서비스를 제공 할 수있었습니다.

이 숫자 10k는 하드웨어 사양 및 코드가 사용자 요청을 처리하는 방식에 따라 다릅니다. 예를 들어, 노드 기반 서버는 동기식 차단 IO를 사용하는 Java 또는 PHP 기반 서버와 비교하여 비동기식 비 차단 IO를 사용하므로 결과적으로 Node- 기반 서버는 훨씬 더 많은 동시 요청을 처리 할 수 ​​있습니다.

돌아와서 서버가 정상적으로 작동하고 새로운 기능이 시작되었고 갑자기 일부 사용자가 시간 초과 오류가 발생하기 시작했습니다.

그래서 여기서 무슨 일이 일어 났습니까?

로그를 보면 한 번에 10 만 개 이상의 요청이 표시되고 애플리케이션에서 모두 처리 할 수 ​​없었습니다. 따라서 사용자는 시간 내에 응답을받을 수없고 시간 초과가 발생했습니다 (시간 초과는 일반적으로 약 100 초입니다).

그래서 서버가이 엄청난 수의 사용자 요청을 동시에 처리 할 수 ​​없다는 것을 깨달았습니다.

그래서 당신은 해결책을 찾았고 첫 번째 결과는 다음과 같습니다.

수직 확장 수행

  • 즉, RAM 크기를 늘리거나 더 나은 CPU 또는 둘 다를 얻습니다. 그러나 이것에는 한계가 있으며 다른 한편으로 사용자 기반은 날마다 지속적으로 증가합니다. 따라서 최상의 솔루션이 아닙니다.

수평 확장 수행

  • 즉, 여러 서버를 구입하여 서로 다른 지역에서 호스팅하고 사용자를 한 지역에서 해당 특정 지역에서 호스팅되는 서버로 안내합니다 (예 : 인도에 한 서버, 미국, 영국에 한 서버 등).
  • 이것은 좋은 솔루션 이었지만 곧 사용자 수가 급증했기 때문에 특정 지역에서 하나의 서버만으로는 충분하지 않다는 것을 곧 깨달았습니다. 이제 각 지역에서 100,000 개의 요청을 받고 있었으며 단일 서버는 한 번에 100,000 개의 요청을 처리 할 수 ​​없었습니다.

따라서 역방향 프록시 뒤의 모든 지역에 여러 서버를 배포했습니다.

  • 역방향 프록시는 응용 프로그램 서버 앞에 위치하며 이러한 응용 프로그램 서버에 대한 요청의 부하를 분산하는 또 다른 서버입니다.
  • 이제로드 밸런싱이 무엇을 의미하는지 궁금하다면 모든 애플리케이션 서버가 비슷한 양, 즉 거의 동일한 수의 수신 요청을 받도록 모든 수신 요청을 다른 애플리케이션 서버에 분배하는 것을 의미합니다.
  • 예 : 이제 초당 10 만 개의 수신 요청이 1 개의 애플리케이션 서버가 아니라 3 개의 애플리케이션 서버에 의해 처리되고 있습니다. 따라서 하나의 애플리케이션 서버는 이제 한 번에 33k 요청 만 처리하고 있으며 쉽게 처리 할 수 ​​있습니다.
  • 역방향 프록시는 부하 분산을 담당합니다. 이를 위해해야 ​​할 일은 애플리케이션 서버의 IP : PORT와 함께 사용해야하는로드 밸런싱 알고리즘을 지정하는 것입니다. 기본적으로 라운드 로빈은 대부분의로드 밸런서에 대한로드 밸런싱 알고리즘입니다.
  • 이제 모든 지역에 3 ~ 4 개의 서버를 배포했습니다. 따라서 이제 시스템은 리 전당 30 ~ 400,000 개의 수신 요청을 쉽게 처리 할 수 ​​있으며 모든 것이 완벽하게 작동합니다.
  • 3 개의 지역이 있다고 가정하면 초당 100 만 개 이상의 요청을 처리하게됩니다. “ 축하합니다! 아주 간단하게 달성 한 엄청난 이정표입니다.”

이 모든 작업이 완료되면 비즈니스가 성장함에 따라 애플리케이션 코드가 거대하고 복잡 해졌고 결과적으로 여러 서버에서 코드와 데이터를 유지하는 데 문제가 발생하기 시작했습니다. 새로운 기능을 추가하고 타사 서비스를 통합하는 일은 점점 더 지루해졌습니다.

새로운 기능을 추가 할 때마다

  1. 먼저 서버에서 전체 애플리케이션을 제거해야합니다.
  2. 새로운 기능으로 새 애플리케이션을 다시 빌드하십시오.
  3. 서버에 다시 배포

그래서 다시 검색해서 마이크로 서비스로 전환하면이 문제를 해결할 수 있다는 것을 알았습니다.

그렇다면 마이크로 서비스 란 무엇 입니까? 문제를 어떻게 해결합니까?

마이크로 서비스는 거대한 서비스를 독립적으로 테스트, 배포 및 무한 확장 할 수있는 소규모 (마이크로) 서비스로 나누는 아키텍처 패턴 일뿐입니다.

그래서 당신은 천천히 그리고 조심스럽게 당신의 거대하고 고도로 결합 된 애플리케이션 ( 기술적 인 용어 로 Monolith 라고 불림 )을 서로 대화하고 모노리스가하는 일을 할 수있는 작은 독립 서비스로 나누기 시작했습니다.

이 작업을 수행하는 방법에 대한 간단한 예를 들어 보겠습니다.

소셜 네트워킹 사이트가 있고 누군가 사용자를 팔로우하고 싶을 때마다 해당 사용자 프로필의 팔로우 버튼을 클릭하면 요청이 서버로 전달되고 모노리스가 요청을 처리하기 시작한다고 가정 해 보겠습니다. 기본적으로 '팔로우'요청을 처리하기 위해 작성한 함수를 트리거합니다.

따라서 그 단일 기능은

  1. 먼저 SSL 인증서를 확인합니다 ( "잠깐, 이것은 우리가 설정 한 역방향 프록시에 의해 수행됩니다"또는 "내 호스팅 플랫폼에서 처리해줍니다"라고 말할 수 있지만이 예에서는 아직 이것들이 있고 우리는 모든 것을 처음부터 구현하는 석기 시대에 있습니다. )
  2. 다음으로 요청을 보내는 사용자를 인증합니다.
  3. 그런 다음 몇 가지 기본 유효성 검사를 수행 한 후 '누가 누구를 따르는 지'관계를 저장하는 테이블에 레코드를 생성합니다.
  4. 그런 다음 팔로우중인 사용자에 대한 알림을 생성하고 보냅니다.
  5. 그리고 위의 모든 작업이 성공하면 200 번 "지금 사용자를 팔로우 하고 있습니다" 라는 응답 을 보내거나 그렇지 않으면 발생한 오류에 해당하는 400 초 또는 500 초를 보냅니다.
  • 단계는 완벽하지만 이러한 모든 단계를 수행하는 단일 기능은 대규모 프로젝트의 유지 관리를 복잡하고 번거롭게 만드는 결합을 도입하므로 좋은 설계 관행이 아닙니다.
  • 또한 사용자 요청을 처리하는 대부분의 함수는 항상 처음 두 단계 (예 : SSL 인증서 확인 및 사용자 인증으로 인해 코드베이스의 크기가 증가 할 수 있음)가 있으므로 코드 중복을 볼 수 있습니다.

그래서 당신은

  1. 첫째, 사용자를 인증하기 위한 인증 마이크로 서비스 를 생성합니다 .
  2. 다음으로, 누가 누구를 팔로우하는지 기록 하는 UserFollowing 마이크로 서비스 를 생성합니다.
  3. 그런 다음 팔로우중인 사용자에게 알림을 보내는 알림 MicroService 를 만듭니다 .

글쎄, 우리는 일반적으로이를위한 특정 마이크로 서비스를 생성하지 않습니다. 대신 API 게이트웨이를 사용합니다. API Gateway를 앞서 언급 한 고급 역방향 프록시로 생각하십시오. 역방향 프록시도 설정할 수 있지만 많은 구성을 작성해야합니다. 따라서 대규모 목적을 위해 우리 는 API 관리, 분석, 보안 등과 함께 이러한 API 게이트웨이를 제공하는 Mulesoft 또는 Apigee 와 같은 타사 플랫폼을 사용 합니다. 따라서 조직은 이러한 비 기능적 요구 사항을 타사 서비스에 위임하고 비즈니스 논리에 더 집중할 수 있습니다.

따라서 API Gateway는 이제 SSL 인증서 확인을 수행 합니다. 또한이 게이트웨이를 사용하면 인증 및 마이크로 서비스를 구현할 필요가 없습니다. 이 예 불구을 위해서 , 아무것도 잘못이 그렇게 거기로의이 Microservice로 유지하자, 그냥 스마트 결정이 아니다.

이제 요청 흐름은 다음과 같습니다.

  1. 사용자가 '팔로우'를 클릭하면 프록시에서 API 게이트웨이로 요청이 전달됩니다.
  2. API 게이트웨이가 SSL 확인을 수행합니다.
  3. 그런 다음 사용자를 인증하기 위해 인증 마이크로 서비스 가 호출됩니다.
  4. 그런 다음 요청은 레코드를 생성 할 UserFollowing 마이크로 서비스 로 이동합니다 .
  5. 그런 다음 알림 마이크로 서비스 가 호출되고 알림을 보냅니다.

이제 우리는 이러한 마이크로 서비스를 어떻게 배포해야하나요?

그럼 당신은 말할지도 모른다 "운영 체제에, 4000, 3000에 다른 포트에 API 게이트웨이를 통지 Microservice를 별도의 포트에서 이러한 microservices, 인증 Microservice을 실행, 오가!, 그것은 꽤 쉽게 휴식 API를 사용하여 네트워크를 통해 통신" 믿는 나 이것은 매력처럼 작동합니다.

이제 기본 프로그래밍 언어 / SDK의 최신 버전으로 새 기능을 만들고 운영 체제 환경을 최신 버전으로 업데이트했다고 가정 해 보겠습니다. 그렇게하면서 이전 버전을 사용하여 빌드 된 다른 마이크로 서비스가 현재 작동하지 않는다는 것을 깨달았습니다. 이것은 최신 버전이이 마이크로 서비스 (작동하지 않는)가 사용하고 있던 이전 버전 API 중 일부를 제거했기 때문에 발생했습니다.

또는 동일한 기본 종속성의 다른 버전이 필요한 일부 타사 도구를 사용할 수 있습니다. 예를 들어 소프트웨어 A에는 Java 8이 필요하고 소프트웨어 B에는 Java 11이 필요하며이 두 버전을 동일한 OS에 설치할 수 없습니다.

이제 우리는 무엇을해야합니까?

우리가하는 일, Google it!

이제 가상 머신을 사용하여이 문제를 해결할 수 있음을 알 수 있습니다.

예, Windows에 Kali Linux를 설치하고 해킹 작업을 수행하거나 다른 운영 체제에서 놀기 위해 사용한 것입니다.

예, 정확히 그렇습니다. 그러나 이러한 VM의 유용성은 단순히 놀기만하는 것이 아닙니다. 실제로이를 사용하여 OS 상단 또는 하드웨어 상단에 격리 된 환경을 만들 수 있습니다.

"그럼 다른 버전에서 위의 문제를 어떻게 해결합니까?"

짐작 하셨겠지만, OS 상단의 각 마이크로 서비스에 필요한 종속성이있는 다양한 운영 체제를 만들고 다른 가상 머신의 해당 단일 서버에서 이러한 마이크로 서비스를 실행할 수 있습니다. 이렇게하면 모든 마이크로 서비스가 제대로 작동하고 전체 시스템이 가동되고 실행됩니다.

이제 "잠깐만 요, 제목에도 커가 언급되어 있고 아직 도커에 대해서는 언급하지 않았습니다"라고 말할 수 있습니다.

글쎄, 나는 그 시간을 추측한다!

문제에 대해 논의하는 패턴과 해결책을 계속해 봅시다.

따라서 이제 변경 후 마이크로 서비스를 다시 배포하려고 할 때마다 이러한 가상 머신이 회전하는 속도가 매우 느리다는 것을 깨달았습니다. 이는 많은 시간이 걸리는 PC / 노트북을 켜는 것과 유사합니다 ( '종료'대신 '다시 시작'을 실수로 클릭 한 적이 있고 이제 다음과 같이 기다려야하는 경우이 고통과 관련이 있습니다. 다시 종료하기 위해 영원함 ).

부팅하는 데 너무 많은 시간이 걸리는 것 외에도 VM은 앱에 전혀 필요하지 않은 많은 다른 OS 관련 프로세스를 구동하는 전체 운영 체제를 가지고 있기 때문에 많은 메모리를 사용합니다. 우리 앱에는 필요한 종속성 만있는 OS 만 있으면됩니다.

그리고 아래 다이어그램에서 볼 수 있듯이 정확히도 커가 제공하는 것입니다.

도커 데몬 (백그라운드 프로세스)을 회전하여 OS 커널을 가상화하고 OS 상단에서 컨테이너라고하는 이러한 격리 된 환경을 실행합니다. 이것은 별도의 OS 및 기타 라이브러리를 위에 두는 것보다 매우 가볍습니다.

하드웨어를 가상화하는 VM과 달리 Docker는 OS 커널을 가상화하므로 Ubuntu와 같은 Linux 배포를 사용하는 경우 Ubuntu 위에 Windows 기반 환경 (컨테이너)을 만들 수 없지만 환경을 만들 수는 있습니다 ( 컨테이너) Debian, Fedora 등과 같은 다른 Linux 배포판의

이제 우리는 메모리와 처리 능력을 절약하고 있습니다.

우리는 또한 가상 머신 시대에 일반적으로 훨씬 적은 시간에 많은 시간이 걸리던 이러한 마이크로 서비스를 회전시키고 있습니다. 매우 빠른 간단한 노드 기반 애플리케이션을 가동하는 데 20 초가 거의 걸리지 않습니다.

그렇다면 시스템 배포는 어떻게할까요?

  1. 각 마이크로 서비스를 가져 와서 Docker 이미지를 빌드하는 방법을 설명하는 Docker 파일을 만듭니다.
  2. Docker 데몬을 사용하여 이러한 이미지를 컨테이너로 실행합니다.

"그러면 이러한 마이크로 서비스 간의 통신은 어떻습니까?"

음, Docker를 사용하여 약간의 구성으로 이전과 똑같습니다.

"마지막으로 우리는 Docker를 사용하여 엄청난 개발 시간과 리소스 사용을 절약했습니다."

그럼 다음은? 이 Docker 및 마이크로 서비스 접근 방식에 다른 문제가 있습니까?

네, 있습니다.

  1. 많은 마이크로 서비스를 도입함에 따라 이러한 마이크로 서비스 간의 새로운 통신 복잡성을 도입하고 있습니다.
  2. 우리는 이러한 마이크로 서비스를 완전히 상태 비 저장으로 전환해야합니다. 즉, 이러한 마이크로 서비스에 상태를 저장할 수 없습니다 ( 이제 통신이 상태 비 저장이어야한다는 ReST를 엄격하게 따를 수 있기 때문에 프로이기도합니다 ).
  3. 이러한 컨테이너의 오케스트레이션에는 도커 컨테이너 수의 확장 및 축소, 컨테이너 간로드 밸런싱, 다운되면 컨테이너 다시 시작 등이 포함됩니다. 여기에는 Kubernetes, Docker Swarm과 같은 서비스가있어이 문제를 해결하고 원하는 경우 CI / CD를 사용하여 클럽 오케스트레이션으로 한 단계 더 나아가려면 Openshift를 사용할 수 있습니다.
  4. 그리고 마이크로 서비스로 인한 마지막 단점은 마이크로 서비스 간의 비동기 통신입니다. 사용자 요청을 처리하는 마이크로 서비스는 가용성이 높아야하므로 요청을 보류하고 완료를 기다릴 수 없습니다. 이 비동기 통신을 위해 메시징 큐를 구현해야하고이를 수행하기 위해 사용할 수있는 RabbitMQ와 같은 서비스가 있습니다.
  5. 소셜 네트워킹 사이트의 위 예에서 알림 서비스는 메시지 대기열을 구현해야하는 가장 좋은 예입니다. 누군가가 팔로우 요청을 보내면 알림 서비스가 알림을 보낼 때까지 보류 할 수 없기 때문입니다. 우리가하는 일은이 sendNotification () 메시지를 메시지 큐에 넣고 완료를 기다리지 않고 사용자에게 확인을 보내는 것입니다.
  6. 그러면 "알림이 사용자에게 전송되는지 어떻게 확신 할 수 있습니까?"라는 질문이 있습니다.
  7. 음, 그것은 메시지 큐 구현에 의해 처리됩니다. 일반적으로 지속성 기능과 함께 제공되므로 메시지 대기열에 넣은 메시지가 손실되지 않고 알림이 확실히 전송됩니다.

따라서 확장 성과 마이크로 서비스가 어떻게 Docker를 사용하는 길을 닦았는지에 대해 조금 배웠기를 바랍니다.

더 많은 것을 기대하십시오!

Suggested posts

코드 공유시 3 단계의 기술적 추상화

GitHub, Docker 및 Heroku 살펴보기

코드 공유시 3 단계의 기술적 추상화

지금까지 8 년 동안 프로그래밍을 해왔고, 몇 달 전까지 만해도“내 프로젝트를 다른 사람과 공유하려면 어떻게해야합니까?”라는 질문에 답할 수있었습니다. 내가 "프로젝트"라고 말할 때, 나는 단일 R 스크립트 나 몇 가지 bash 명령에 대해 말하는 것이 아닙니다. 22 세의 저도 복사하여 붙여 넣기를 알아낼 수있었습니다! 외부 종속성이있는 여러 언어로 된 여러 파일이있는 프로젝트를 의미합니다. 모든 것을 zip 폴더에 넣습니까? 이전 버전과 호환되지 않는 새 버전의 언어 및 패키지를 어떻게 처리합니까? 내가 공유하는 사람이 코딩 방법을 전혀 모르는 경우 어떻게해야합니까? 프로젝트를 공유하는 올바른 방법은 수신자에게 표시 할 코드의 양과 추상화 할 양에 따라 다릅니다.

AKS 성능 여정 : 1 부 — 모든 크기 조정

AKS 성능 여정 : 1 부 — 모든 크기 조정

2019 년과 2020 년 동안 ASOS Web 내의 저희 팀은 개선 된 서비스 밀도, 확장성에 대한 잠재력을 탐색하고 활용하기 위해 Azure Cloud Services의 일부 프런트 엔드 마이크로 서비스를 AKS (Azure Kubernetes Service)로 마이그레이션하는 여정을 시작했습니다. , 성능 및 애플리케이션 제어. ASOS의 주요 아키텍처 변경의 일환으로 일련의 게이트에서 새로운 설정을 면밀히 조사하여 고객에게 최상의 경험을 제공 할 수 있도록합니다.

Related posts

"실용적인 프로그래머"의 5 가지 필수 사항

역대 베스트셀러 코딩 북의 요점

"실용적인 프로그래머"의 5 가지 필수 사항

Pragmatic Programmer는 1999 년에 처음 출판되었으며 이후 역대 최고의 프로그래밍 책으로 선정되었습니다. 저자 Andy Hunt와 David Thomas는 Agile Manifesto의 원저자 중 하나였으며 몇 가지 심각한 자격을 가지고 있습니다.

대규모 GraphQL 쿼리 공격으로부터 보호

공격자가 공개적으로 사용 가능한 GraphQL 인터페이스를 사용하여 사이트를 스크랩하거나 서비스 거부 공격을 실행하는 방법에 대해 알아보십시오. 이들은 4 가지 방법 중 하나로이를 수행 할 수 있습니다. 단일 대형 쿼리를 신중하게 구성하여 실행하고, 관련 데이터를 가져올 수있는 병렬 쿼리를 많이 작성하고, 일괄 요청을 사용하여 많은 쿼리를 연속적으로 실행하고, 마지막으로 많은 요청을 보냅니다.

기술 인터뷰의 사회적 구성 요소

코딩 문제는 스트레스가 많지만 스트레스에 대한 당신의 반응은 당신의 기술적 능력보다 더 크게 말합니다.

기술 인터뷰의 사회적 구성 요소

기술 업계의 직책을 위해 인터뷰 할 때 일반적으로 제안을 고려하기 전에 최소한 3 차례의 인터뷰를 거치게됩니다. 라운드는 일반적으로 다음과 같습니다. 그렇게 생각하면 잘못된 것입니다.

훌륭한 개발자의 3 가지 행동 특성

훌륭한 개발자의 3 가지 행동 특성

훌륭한 개발자를 만드는 비 기술적 인 것들 나는이 기사를 작성하는 것을 한동안 미루고 있습니다. 나는 그것을 작성할 자격이 있다고 생각하지 못했습니다. 오늘은 쓸 때라고 생각했습니다.