Fair Call Queue
Client의 요청을 담아놓는 Queue이다.
heavy한 클라이언트로 인해 전체 요청의 처리가 늦어지지 않도록 하기 위해 만들어졌다.
이전 방식 FIFO Queue
Fair call queue가 도입되기 전에는 FIFO방식의 큐를 사용하였다.
하지만 이러한 방식은 heavy user로 인해 전체 응답 속도를 느리게 만들었다.
그리고 high load를 발생시키면 전체 시스템에 과부하가 걸려 분산 서비스에 대한 공격이 가능하기에
DDoS방식으로 공격이 가능하다.
Fair Call Queue 구성
multi-level queue가 multiplxer와 scheduler로 연결되어있다.
RPC Scheduler
Listen queue에 RPC요청이 도착하면 reader threads들이 요청을 RPC Scheduler로 전달한다.
그리고 이 RPC Scheduler는 이 요청을 여러 개의 queue로 나누어서 넣는다.
각 queue는 priority queue이며
큐에 넣기 전에 각 요청별로 우선순위를 지정한다.
이 스케쥴러는 pluggable하여 선택 가능하며 default는 DecayRpcScheduler이다.
DecayRpcScheduler
각 user 별로 request 수를 기억하고 있다.
해당 count는 시간이 지날수록 decay 정도를 고려한다.
sweep period마다 유저별 priority를 계산한다.
sweep period마다 유저별 request 수에 decay factor가 곱해진다.
이것으로 유저별 가중치가 반영되고 rolling된 평균 요청수를 구할 수 있다.
sweep이 매번 수행될 때마다 모든 유저의 요청수에 ranking이 매겨지고 이에따라 각 유저는 priority를 할당받는다.
기본 우선순위 임계치(priority thresholds)는 0.125, 0.25, 0.5 이다.
- 전체 요청에 비해 50% 이상의 요청을 호출한 유저는 lowest priority 를 가진다.
- 25%~50% 의 요청을 호출한 유저는 2번째로 낮은 우선순위(2nd lowest priority) 를 가진다.
- 12.5%~25% 는 두번째로 높은 우선순위 (2nd highest priority)를 가진다.
- 그 외 나머지는 highest priority 를 가진다.
RPC Multiplexer
multiplexer는 low-priority queue와 high-prioirty queue를 비교하고
penalty를 컨트롤한다.
요청들을 weighted round-robin 방식으로 읽는데
high->low 순으로 요청을 먼저 처리하고 low-priority에 대한 starvation을 방지한다.
어떤 요청을 가져올지를 결정하며
기본으로 (8, 4, 2, 1) 이 4가지 weight를 구분하는 priority level로 구성된다.
8개의 요청을 hightest priority queue에서 꺼내고
4개를 2nd highest, 2개를 third, 1개를 lowest에서 꺼내
handler에게 주는 방식이다.
Backoff
backoff는 요청을 처리한다기 보다는 client에게 exception을 throw하는 방식이다.
request queue가 가득 찼을 때나,
더 높은 우선순위 큐의 요청 처리가 너무 오래걸린다면 발생한다.
만약 자신이 backoff가 자주 발생한다면 너무 자주, 무거운 요청을 전송했는지를 점검해볼 필요가 있다.
Cost based Fair Call Queue
Fair Call Queue도 heavy user에 대한 영향을 줄이는데 효과가 좋았다.
하지만 각 요청의 cost가 고려되어있지 않다.
cost-based extension을 적용하면
priority 매길 때 해당 유저의 요청 수행때 걸린 processing time도 집계하여 사용한다.
아래 코드로 cost를 반영한 fair call queue를 사용할 수 있다.
costprovder.impl = org.apache.hadoop.ipc.WeightedTimeCostProvider
'Data Engineering > Hadoop' 카테고리의 다른 글
Amazon EMR Hadoop 구축해보기 | MYSQL RDS, EMR 클러스터 생성 (0) | 2024.01.12 |
---|---|
HDFS 명령어 모음 (0) | 2024.01.09 |
Hadoop RAID, Eraser Coding (1) | 2024.01.08 |
Observer Name Node(ONN)로 부하 분산 (0) | 2024.01.08 |
Hadoop의 High Availability (고가용성) 아키텍처 (1) | 2024.01.08 |