직접 해보는 AWS Load Balancer LOR 라우팅 정책 실험 - 직접 해보니깐 더 모르겠네요;;;
안녕하세요. 어느새 2023년 11월이 끝나가네요.
이번에는 AWS Load Balancer의 라우팅 정책을 직접 테스트해보려고 합니다.
2019년 11월부터 Application Load Balancer(ALB)에 Least Outstanding Requests(LOR)이라는 라우팅 정책이 추가되었는데요.
LOR 정책이 구체적으로 어떻게 동작하는지 궁금해서 정책 설명을 찾아봤는데
AWS 공식 문서를 아무리 찾아봐도 자세한 설명은 없더라고요 ㅜ
그래서 직접 LOR 라우팅 정책을 해부해 보기로 했습니다!
해부한다고 했지만 거창한 것은 아니고, 제가 궁금했던 것들 한번 확인해보려고 합니다 ㅎㅎ...
0. LOR 라우팅 정책에 대해서 궁금했던 것들 - websocket 연결
가장 적게 요청을 처리하고 있는 인스턴스로 라우팅 해준다는 LOR 라우팅 정책에서 가장 궁금했던 것은
"websocket 연결을 효율적으로 분배해 줄 수 있는지" 였습니다.
aws 문서에서 찾아볼 수 있었던 설명은 "websocket 연결 요청이 LOR에 의해서 라우팅 된다" 정도입니다.
저는 websocket 연결이 LOR에 포함되는 것인지 확인해 볼 겁니다!
실무에서 개발하고 있는 API 서버가 GraphQL subscription을 지원하는데 이쪽에서 성능 이슈가 많이 발생하고 있습니다.
이를 해결하기 위해 API 사용량 limit, 라우팅 같은 정책을 개발해야 하나 고민하던 중에 AWS ELB에서 뭔가 좋아 보이는 LOR 정책을 제공하고 있는 것을 발견했습니다.
그런데 websocket에 대한 설명이 제가 원한만큼 자세하지 않더라고요 ㅜ
TL-DR
- LOR 라우팅 정책은 웹소켓 연결은 고려하지 못함
- 그래도 라운드로빈 정책보다는 인스턴스의 상황을 많이 고려해 줌
1. 실험 환경
다음과 같이 ALB 1개와 EC2 인스턴스 3개를 만들어서 라우팅이 어떻게 이뤄지는지 살펴보려고 합니다.
2. 실험 방법
2.1. 일반 http 요청에 대한 LOR 라우팅 정책 동작 방식
LOR 라우팅 정책이 일반 http 요청에 대해서 어떻게 동작하는지 알아보기 위해 다음 2가지 실험을 준비했습니다.
- ALB로 0.1초마다 1000번의 쿼리를 요청 보내면 각각의 인스턴스에 몇 번씩 라우팅 되는지
- 각 인스턴스별로 0.5초, 1초, 1.5초의 지연 시간이 있을 때, ALB로 0.1초 간격으로 1000번의 쿼리를 요청 보내면 각각의 인스턴스에 몇 번씩 라우팅 되는지
1번 실험은 쿼리에 대한 부하가 일정할 때 어떻게 동작하는지 알기 위해서 준비했습니다.
- 라운드로빈 라우팅 정책과의 차이를 보고 싶었습니다.
2번 실험은 쿼리에 대한 부하기 일정하지 않을 때 어떻게 동작하는지 알기 위해서 준비했습니다.
2.2. WebSocket 연결 요청에 대한 LOR 라우팅 정책 동작 방식
이제 WebSocket 연결 요청에 대해서는 어떻게 동작하는지 알아보기 위해 다음 2가지 실험을 준비했습니다.
- ALB로 0.1초마다 1000번의 구독을 요청 보내면 각각의 인스턴스에 몇 번씩 라우팅 되는지
- 2.1의 1번 상황에서 ALB로 0.1초마다 1000번의 구독 요청을 보내면 각각의 인스턴스에 몇 번씩 라우팅 되는지
- 2.1의 2번 상황에서 ALB로 0.1초마다 1000번의 구독 요청을 보내면 각각의 인스턴스에 몇 번씩 라우팅 되는지
각각의 EC2 인스턴스에는 apollo server를 이용한 간단하게 개발된 graphql server를 실행시켜 뒀습니다.
- 테스트 서버 코드: https://github.com/goodahn/aws-alb-lor-routing-test
- apollo server 링크: https://www.apollographql.com/docs/apollo-server/data/subscriptions/
3. 실험 결과
3.1. 일반 http 요청에 대한 LOR 라우팅 정책 동작 방식
1차 실험 결과(병렬적으로 요청을 보내지 않아서 실험 실패)
1. ALB로 0.1초마다 1000번의 쿼리를 요청 보내면 각각의 인스턴스에 몇 번씩 라우팅 되는지
인스턴스1로 라우팅 된 횟수 | 333 회 |
인스턴스2로 라우팅 된 횟수 | 334 회 |
인스턴스3로 라우팅 된 횟수 | 333 회 |
2. 각 인스턴스별로 1.5초, 1초, 0.5초의 지연 시간이 있을 때, ALB로 0.1초 간격으로 1000번의 쿼리를 요청 보내면 각각의 인스턴스에 몇 번씩 라우팅 되는지
인스턴스1로 라우팅 된 횟수 | 333 회 |
인스턴스2로 라우팅 된 횟수 | 332 회 |
인스턴스3로 라우팅 된 횟수 | 334 회 |
2차 실험 결과(ELB 대상 그룹의 LOR 라우팅 정책 설정 누락으로 실험 실패)
1. ALB로 0.1초마다 1000번의 쿼리를 요청 보내면 각각의 인스턴스에 몇 번씩 라우팅 되는지
인스턴스1로 라우팅 된 횟수 | 333 회 |
인스턴스2로 라우팅 된 횟수 | 333 회 |
인스턴스3로 라우팅 된 횟수 | 334 회 |
2. 각 인스턴스별로 1.5초, 1초, 0.5초의 지연 시간이 있을 때, ALB로 0.1초 간격으로 1000번의 쿼리를 요청 보내면 각각의 인스턴스에 몇 번씩 라우팅 되는지
인스턴스1로 라우팅 된 횟수 | 333 회 |
인스턴스2로 라우팅 된 횟수 | 333 회 |
인스턴스3로 라우팅 된 횟수 | 334 회 |
3차 실험 결과
1. ALB로 0.1초마다 1000번의 쿼리를 요청 보내면 각각의 인스턴스에 몇 번씩 라우팅 되는지
인스턴스1로 라우팅 된 횟수 | 334 회 |
인스턴스2로 라우팅 된 횟수 | 333 회 |
인스턴스3로 라우팅 된 횟수 | 333 회 |
2. 각 인스턴스별로 1.5초, 1초, 0.5초의 지연 시간이 있을 때, ALB로 0.1초 간격으로 1000번의 쿼리를 요청 보내면 각각의 인스턴스에 몇 번씩 라우팅 되는지
인스턴스1로 라우팅 된 횟수 | 204 회 |
인스턴스2로 라우팅 된 횟수 | 295 회 |
인스턴스3로 라우팅 된 횟수 | 501 회 |
3.2. WebSocket 연결 요청에 대한 LOR 라우팅 정책 동작 방식
1. ALB로 0.1초마다 1000번의 구독을 요청 보내면 각각의 인스턴스에 몇 번씩 라우팅 되는지
인스턴스1로 라우팅 된 횟수 | 333 회 |
인스턴스2로 라우팅 된 횟수 | 334 회 |
인스턴스3로 라우팅 된 횟수 | 333 회 |
2. 2.1의 1번 상황에서 ALB로 0.1초마다 1000번의 구독 요청을 보내면 각각의 인스턴스에 몇 번씩 라우팅 되는지
인스턴스1로 라우팅 된 횟수 | 334 회 |
인스턴스2로 라우팅 된 횟수 | 333 회 |
인스턴스3로 라우팅 된 횟수 | 333 회 |
3. 2.1의 2번 상황에서 ALB로 0.1초마다 1000번의 구독 요청을 보내면 각각의 인스턴스에 몇 번씩 라우팅 되는지
인스턴스1로 라우팅 된 횟수 | 330 회 |
인스턴스2로 라우팅 된 횟수 | 335 회 |
인스턴스3로 라우팅 된 횟수 | 334 회 |
4. 리뷰
websocket 연결을 고려하지 않는 LOR 라우팅 정책
쿼리는 잘 라우팅 되는 것을 확인할 수 있었으나 subscription은 라우팅이 잘 이뤄지지 않았습니다.
특히 쿼리 요청에 대해서 딜레이를 줬음에도 subscription 라우팅이 잘 이뤄지지 않았던 것은 실험이 잘못된 것은 아닌가 계속 의심되는 부분입니다.
혹시라도 잘못된 점을 찾으면 다시 진행해 보도록 하겠습니다.
인프라 구성의 어려움
비용 문제 때문에 ALB를 실험할 때마다 생성하고 삭제해야 해서 귀찮았습니다 ㅜㅠ
만약 실험에 사용되는 서비스가 많았다면 AWS Cloudformation을 사용해서 자동화하는 것까지 생각했을 것 같습니다!
생각보다 도움이 되었던 편견...?
실험 결과 3.1 "일반 http 요청에 대한 LOR 라우팅 정책 동작 방식" 부분을 보면 3차 실험까지 진행한 것을 확인할 수 있습니다.
사실 여러 번 진행할 생각이 전혀 없었는데 결과가 예상했던 것과 너무 다르게 나와서 3차례나 실험을 진행하게 되었습니다.
원래 편견(?)을 가지고 실험을 수행하면 안 되는데 이로 인해서 잘못 구성된 실험 환경을 찾을 수 있어서 도움이 되었습니다.
이렇게 LOR 라우팅 정책을 실험해 봤는데요...
막상 한 건 별로 없는데 시간은 오래 걸린 것 같습니다. 그리고 찝찝함도 남아버렸고요...
직접 테스트한 결과라서 조금 후련하긴 하지만 흠...
혹시 LOR 라우팅 정책에 대해서 정확히 아시는 분이 있다면 도움 부탁드립니다 ㅜ