Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Info

이장을 통해 추가적으로 알게 되는것

  • 액터에 고급 스레드 프로그래밍에서 사용되는 튜닝 옵션 사용하기
  • 액터의 성능을 각각 다르게 설정하기

Image Modified

메시징(유입차량)에따른 톨게이트 구현은 , 트래픽 처리연마를 위한 좋은 샘플입니다.

구현하려고 하는 톨게이트 모델

  • 하이패스와 현금게이트 비율은 3:7이며 비율 조정이 유연해야함 - 실세계는 큰 공사가 필요함
  • 하이패스는 기달림이 없음 - 실세계는 30km이하로 저속운행
  • 현금 게이트는 1~10초 랜덤한 대기발생 - 실세계는 정산원의 능력과 운전자의 능력이 복합적으로 반영됨
  • 동일 Type게이트에서 공평한 대기 분배가 이루어지고 Type이 다른것의 성능 차이는 감수해야함 - 실 세계는 줄을 잘서거나 ,교통법규를 준수하지 않으면  빠르게 통과할수도 있음 

액터 구현

하이패스 게이트

Code Block
languagec#
themeEmacs
        public HigPassGateActor()
        {
            id = Guid.NewGuid().ToString();
            logger.Info($"하이패스 액터 생성:{id}");

            ReceiveAsync<string>(async msg =>
            {
                //하이패스는 그냥 지나가면됨
                logger.Debug($"{msg}");
            });
        }


현금정산소 게이트

Code Block
languagec#
themeEmacs
        public CashGateActor()
        {
            rnd = new Random();

            id = Guid.NewGuid().ToString();
            logger.Info($"현금정산게이트 액터 생성:{id}");

            ReceiveAsync<string>(async msg =>
            {
                //현금정산에 걸리는시간 1~10초                 
                int delay = rnd.Next(1000, 10000);
                await Task.Delay(delay);
                logger.Debug($"{msg}-{delay}");
            });
        }


액터 성능전략 적용

라우터구성

Code Block
languagec#
themeEmacs
	actor.deployment {
		/highpass-gate-pool {
			router = round-robin-pool
			nr-of-instances = 3
		}

		/cashpass-gate-pool {
			router = smallest-mailbox-pool
			nr-of-instances = 7
		}
	}

...

라우터에 대한 심화학습 : https://getakka.net/articles/actors/routers.html

스레드풀 구성

Code Block
languagec#
themeEmacs
# 처리속도가 빨라 동시 처리량이 작게 필요한 경우
fast-dispatcher {
	type = Dispatcher
	throughput = 2
}

# 처리속도가 느려 동시 처리량 확보가 필요한 경우(8번째 동시처리는 7번째 동시처리중 하나가 끝날때를 기다림)
slow-dispatcher {
	type = Dispatcher
	throughput = 7
}

...

더 자세한 심화학습을 하고자 한다면 다음 문서 참고 : https://doc.akka.io/docs/akka/current/dispatchers.html


액터 생성코드

Code Block
languagec#
themeEmacs
AkkaLoad.RegisterActor(
	"highpass",
	actorSystem.ActorOf(Props.Create<HighPassGateActor>()
			.WithDispatcher("fast-dispatcher")
			.WithRouter(FromConfig.Instance),
			"highpass-gate-pool"
));

AkkaLoad.RegisterActor(
	"cashpass",
	actorSystem.ActorOf(Props.Create<CashGateActor>()
			.WithDispatcher("slow-dispatcher")
			.WithRouter(FromConfig.Instance),
			"cashpass-gate-pool"
));

...