[프로그래밍 패턴] 제한(Throttling) 패턴

김카레·2019년 12월 23일
2

프로그래밍 패턴

목록 보기
1/3

이 시리즈는 GOF의 디자인 패턴 이외의 패턴을 다룹니다.
항상 아래의 2가지를 염두해두고 사용하고자 합니다.
1. 불필요한 패턴은 복잡성을 증가시킨다.
2. 패턴이 필요하다는 의미는 언어 차원에서 지원하지 못하는 기능이 있다는 반증일 수 있다.

개요

  • 개별 tenant가 전체 서비스에서 사용하는 리소스를 제어해야 할 때 사용

image.png

구현 상세

  • Tenant : 서비스를 사용하는 tenant. 초당 실행 제한 횟수를 가지고 있다.
  • CallsCount : tenant 당 현재까지 실행된 횟수를 관리한다.
    val tenantCallsCount = ConcurrentHashMap<String, AtomicInteger>()
  • Throttler : 일정 시간 마다 전체 tenant들의 실행횟수를 초기화한다.
override fun start() {
	Timer(true).schedule(object:TimerTask() {
		override fun run() { callsCount.reset() }
		}, 0, throttlePeriod)
}
  • Service : 실행 횟수를 실제 비교하고 증가시킨다.
fun call(tenant: Tenant): Int? {
	 if (count.getCount(tenant.name) ?: 0 >= tenant.allowedCallsPerSecond) {
		return -1
	}
	return count.incrementCount(tenant.name)
}

Github

Reference

profile
김카레

0개의 댓글