연습 - 수동으로 웹앱 규모 조정
트래픽이 증가할 것으로 예상되면 시스템을 규모 확장해야 합니다. 성능의 감소에 대응하여 규모 확장할 수도 있습니다.
호텔 예약 시스템 예의 경우 특별 행사, 특별 이벤트 또는 계절적 변동으로 인해 트래픽이 추가로 발생할 것으로 예상되면 웹앱의 인스턴스 수를 늘립니다. 수요가 감소되면 시스템의 크기를 다시 조정할 수 있습니다.
이 연습에서는 App Service 요금제를 만들고, 이 계획을 사용하여 웹앱을 배포합니다. 로드 중인 웹앱의 성능을 모니터링합니다. 그런 다음 앱을 스케일 아웃하고 계획에 따라 앱 성능이 개선되었는지 확인합니다.
이 연습에서는 웹 API를 구현하는 웹앱 샘플을 사용합니다. 웹 API는 호텔 예약 웹 사이트에 대한 고객의 예약을 만들고 검색하는 HTTP POST 및 GET 작업을 공개합니다. 예약이 저장되지 않습니다. GET 작업은 단순히 더미 데이터를 검색합니다.
또한 이 연습에서는 몇 명의 사용자가 POST 및 GET 작업을 동시에 실행하는 상황을 시뮬레이션하는 클라이언트 앱도 실행합니다. 이 앱은 크기 조정 전후에 웹앱의 성능을 테스트하는 데 사용하는 워크로드를 제공합니다.
App Service 계획 및 웹앱 만들기
중요
이 연습을 수행하려면 사용자의 Azure 구독이 필요하며 요금이 발생할 수 있습니다. Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.
Azure Portal에 로그인합니다.
Azure Portal 메뉴 또는 홈 페이지에서 리소스 만들기를 선택합니다. 리소스 만들기 창이 나타납니다.
왼쪽 메뉴 창의 범주에서 웹을 선택하고 웹앱을 검색하여 선택한 다음 만들기를 선택합니다. 웹앱 만들기 창이 나타납니다.
기본 탭에서 각 설정에 다음 값을 입력합니다.
참고
웹앱의 이름은 고유해야 합니다. <이름 또는 이니셜>hotelsystem과 같은 이름을 사용하는 것이 좋습니다. 이 연습에서
<your-webapp-name>
이 표시되는 위치에는 모두 이 이름을 사용하세요.설정 값 프로젝트 세부 정보 구독 이 연습에 사용할 Azure 구독을 선택합니다. 리소스 그룹 새로 만들기 링크를 선택하고 mslearn-scale이라는 새 리소스 그룹을 입력합니다. 인스턴스 세부 정보 이름 표 앞의 참고 사항을 참조하세요. 이 연습의 뒷부분에서 기억할 수 있는 고유한 이름을 입력합니다. 게시 코드 런타임 스택 .NET 6(LTS) 운영 체제 Windows 지역 기본값 적용 App Service 계획 Windows 플랜 기본값 적용 요금제 기본값 적용 검토 + 만들기>만들기를 차례로 선택합니다. 웹앱이 생성 및 배포되기를 기다립니다.
웹앱 빌드 및 배포
Azure 작업 표시줄에서 ‘Cloud Shell’ 아이콘을 선택하여 Azure Cloud Shell을 열고 다음 명령을 실행하여 호텔 예약 시스템의 소스 코드를 다운로드합니다.
git clone https://github.com/MicrosoftDocs/mslearn-hotel-reservation-system.git
mslearn-hotel-reservation-system/src 폴더로 이동합니다.
cd mslearn-hotel-reservation-system/src
호텔 시스템용 앱을 빌드합니다. 앱에는 시스템용 웹 API를 구현하는 웹앱과, 웹앱 부하 테스트에 사용하는 클라이언트 앱으로 총 두 가지가 있습니다.
dotnet build
게시할 HotelReservationSystem 웹앱을 준비합니다.
cd HotelReservationSystem dotnet publish -o website
게시된 파일이 있는 website 폴더로 이동합니다. 파일을 압축하여 이전 작업에서 만든 웹앱에 배포합니다. 메모장에 다음 코드를 복사하여
<your-webapp-name>
을 웹앱 이름으로 바꾼 다음, 편집된 코드 블록을 Cloud Shell에 붙여넣고 실행합니다.cd website zip website.zip * az webapp deploy --src-path website.zip --name <your-webapp-name> --resource-group mslearn-scale
웹 브라우저를 사용하여
http://<your-webapp-name>.azurewebsites.net/api/reservations/1
로 이동합니다. 예약 번호 1에 대한 세부 정보가 포함된 JSON 문서가 나타납니다.
규모 확장 전의 웹앱 성능 모니터링
Cloud Shell로 돌아가서 ~/mslearn-hotel-reservation-system/src/HotelReservationSystemTestClient 폴더로 이동합니다.
cd ~/mslearn-hotel-reservation-system/src/HotelReservationSystemTestClient
코드 편집기를 사용하여 이 폴더의 App.config 파일을 편집합니다.
code App.config
ReservationsServiceURI
를 지정한 줄의 주석 처리를 제거하고 웹 사이트 이름 값을 웹앱의 이름으로 바꿉니다. 파일은 다음 예와 같이 표시됩니다.<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="NumClients" value="100" /> <add key="ReservationsServiceURI" value="https://<your-webapp-name>.azurewebsites.net/" /> <add key="ReservationsServiceCollection" value="api/reservations" /> </appSettings> </configuration>
참고
이 파일의
NumClients
설정은 동시에 웹앱에 연결을 시도하여 작업을 수행할 수 있는 클라이언트의 수를 지정합니다. 이 작업은 예약을 만든 다음 쿼리를 실행하여 예약 세부 정보를 가져옵니다. 사용된 데이터는 모두 가짜이며, 어느 곳에서도 유지되지 않습니다. 이 값을100
으로 설정한 채로 두세요.Ctrl+S를 선택하여 파일을 저장합니다.
코드 편집기를 사용하여 이 폴더의 HotelReservationSystemTestClient.csproj 파일을 편집합니다.
code HotelReservationSystemTestClient.csproj
웹앱에 대해 선택한 런타임 스택과 일치하도록
TargetFramework
를 지정하는 줄을 편집합니다.TargetFramework
값을netcoreapp7.0
으로 변경합니다. 파일은 다음 예와 같이 표시됩니다.<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp7.0</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Newtonsoft.Json" Version="12.0.1" /> <PackageReference Include="System.Configuration.ConfigurationManager" Version="4.5.0" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\HotelReservationSystemTypes\HotelReservationSystemTypes.csproj" /> </ItemGroup> </Project>
Ctrl+S를 선택하여 파일을 저장하고 Ctrl+Q를 눌러 코드 편집기를 닫습니다.
새 구성으로 테스트 클라이언트 앱을 다시 빌드합니다.
dotnet build
클라이언트 앱을 실행합니다. 클라이언트가 실행되기 시작하고, 예약을 수행하고, 쿼리를 실행하면서 몇 가지 메시지가 표시됩니다. 시스템을 몇 분 동안 실행합니다. 응답 속도가 느려지고 곧 HTTP 408(시간 제한) 오류로 인해 클라이언트 요청이 실패합니다.
dotnet run
Azure Portal에서 리소스로 이동을 선택하여 웹앱을 엽니다.
왼쪽 메뉴 창에서 모니터링, 메트릭,을 차례로 선택합니다.
웹앱 창의 메뉴 모음 오른쪽에서 현지 시간: 지난 24시간(자동) 시간 범위를 선택한 다음, 지난 30분을 선택하고 적용을 선택합니다.
창의 차트 제목에서 차트에 다음 메트릭을 추가합니다.
- 메트릭 추가를 선택하고 메트릭 드롭다운 목록에서 CPU 시간을 선택합니다. 집계에 합계를 선택합니다.
- 메트릭 추가를 선택하고 메트릭 드롭다운 목록에서 HTTP 서버 오류를 선택합니다. 집계에 합계를 선택합니다.
- 메트릭 추가를 선택하고 메트릭 드롭다운 목록에서 HTTP 4xx를 선택합니다. 집계에 합계를 선택합니다.
- 메트릭 추가를 선택하고 메트릭 드롭다운 목록에서 응답 시간을 선택합니다. 집계에서 평균을 선택합니다.
오른쪽 메뉴 모음에서 대시보드에 고정을 선택합니다. 대시보드에 고정 창이 나타납니다. 새로 만들기 탭을 선택합니다.
대시보드 이름 드롭다운 목록에서 웹앱 이름을 입력한 다음 만들기 및 고정을 선택합니다.
시스템이 안정될 때까지 5분 동안 실행한 다음 CPU 시간, HTTP 4xx 오류 수 및 평균 응답 시간을 적어둡니다. 상당한 수의 HTTP 4xx 오류가 표시되어야 합니다. 이러한 오류는 HTTP 408 시간 제한 오류입니다. 평균 응답 시간은 몇 초입니다. 웹 서버에서 부하를 처리하는 방법에 따라 때때로 HTTP 서버 오류가 발생할 수 있습니다.
다음 작업을 수행하는 동안 클라이언트 앱이 실행되도록 둡니다.
웹앱 규모 확장 및 성능 향상 확인
Azure Portal에서 웹앱 이름(App Service)을 선택하고 왼쪽 메뉴 창의 설정에서 스케일 아웃(App Service 요금제)을 선택합니다. 스케일 아웃(App Service 요금제) 창이 나타납니다.
구성 탭에서 수동 스케일링을 선택하고 인스턴스 수를 5롤 설정합니다. 저장을 선택합니다.
클라이언트 앱을 실행하고 있는 Cloud Shell로 전환합니다. 일부 요청은 여전히 시간 초과되지만 오류로 인해 실패하는 요청이 더 적어야 합니다.
또 다시 앱을 5분 동안 실행합니다. 다음으로, Azure Portal의 대시보드에서 앱에 대한 메트릭을 보여 주는 차트로 이동합니다. 이제 사용 가능한 CPU 성능이 5배 이상 높아졌으므로 CPU 시간이 상당히 증가했음을 알 수 있습니다. 평균 응답 시간이 줄고 HTTP 4xx 오류의 수도 감소됩니다. 다음 차트에서는 일반적인 결과 집합을 보여 줍니다. 규모 확장이 발생한 지점이 강조 표시되어 있습니다.
조금 더 실험하려는 경우 App Service 계획의 인스턴스 수를 10개로 늘려보세요. S1 계층에서 지원되는 최대 인스턴스 수는 10입니다. CPU 시간이 추가로 증가하고 이에 따라 응답 시간과 HTTP 4xx 오류가 감소한다는 것을 알 수 있습니다.
클라이언트 앱을 실행하고 있는 Cloud Shell로 돌아갑니다. Enter 키를 선택하여 앱을 중지합니다.
Azure Portal에서 인스턴스 수를 다시 1로 설정합니다. 웹앱을 선택하고 왼쪽 메뉴 창에서 스케일 아웃(App Service 요금제)을 선택합니다. 구성 탭에서 인스턴스 수를 1로 설정하고 저장을 선택합니다.