어플리케이션에서 생성하는 정보를 분석하고,모니터링 하기 위해서 다음과 같은 방법을 가장 많이 사용합니다.

  • 로그를 적재한다. ( Nlog,Log4j등등 모듈)
  • 로그를 통합한다. ( 엘라서틱 로그 스태쉬)
  • 로그를 데시보드화하고 분석한다 ( 키바나등 )


하지만, 너무나 큰 대용량 처리횟수에대해 실시간성으로 모니터링을 하고 싶다고 하면

Matrix를 활용 합니다.  시간별 CPU변화량,네트워크 변화량 등에 일반적으로 사용되고 있으며

매 이벤트마다 로그를 기록하는 방식이아니고, 증분의 값을 주기적인 시간에 측정함으로 

대용량 실시간 카운팅을 측정하는데 효율적입니다.

대용량 처리 이벤트 방법 선택

자체 큐시스템을 가지고 있는 액터의 스펙을 살펴보겠습니다.

링크 : https://akka.io/

초당 5천만 메시지를 커버 할수 있으며, 실시간 모니터링 객체(이벤트를 받아주는)로 사용하기 충분한 스펙을 가지고 있습니다.

네트워크로 확장시, 액터는 Netty에 기반한 고성능 TCP 프로토콜을 사용하며,Netty 자체는 단일서버 160만tps의 성능을 낼수 있습니다.

Akka Remote의 추상화로 인해 TPS 저하는 일어날수 있지만, 당장 더 빠른 모듈을 찾기는 어려워 보입니다.

Netty 참고 성능표 : https://github.com/ronenhamias/netty-perf-testing/wiki/Netty-3-Throughput-test


Akka를 사용하지 않는 기존 시스템은 변경없이, 도메인 이벤트 카운팅 모니터링 기능만을 빌트인해보겠습니다.

액터 모니터링 시스템 탑재하기

using Akka.Monitoring;
using Akka.Monitoring.ApplicationInsights;
using Akka.Monitoring.Datadog;
using Akka.Monitoring.PerformanceCounters;
using Akka.Monitoring.Prometheus;

var MonitorTool = Environment.GetEnvironmentVariable("MonitorTool");
var MonitorToolCon = Environment.GetEnvironmentVariable("MonitorToolCon");

switch (MonitorTool)
{
	case "win":
		var win = ActorMonitoringExtension.RegisterMonitor(actorSystem,
			new ActorPerformanceCountersMonitor(
				new CustomMetrics
				{
					Counters = { "akka.custom.metric1", "akkacore.message" },
					Gauges = { "akka.messageboxsize" },
					Timers = { "akka.handlertime" }
				}));
		break;
	case "azure":
		var azure = ActorMonitoringExtension.RegisterMonitor(actorSystem, new ActorAppInsightsMonitor(appConfig.MonitorToolCon));
		break;
	case "prometheus":
		// prometheusMonotor 를 사용하기위해서, MerticServer를 켠다...(수집형 모니터,Agent탑재)
		// http://localhost:10250/metrics  - 여기서 제공되는 metrics의 포맺과 호환되는 여러종류의 데시보드들과 연동하여 시각화가능합니다.
		metricServer = new MetricServer(10250);
		metricServer.Start();
		var prometheus = ActorMonitoringExtension.RegisterMonitor(actorSystem, new ActorPrometheusMonitor(actorSystem));
		break;
	case "datadog":
		var statsdConfig = new StatsdConfig
		{
			StatsdServerName = MonitorToolCon
		};
		var dataDog = ActorMonitoringExtension.
			RegisterMonitor(actorSystem, new ActorDatadogMonitor(statsdConfig));
		break;
}

대표적인 매트릭스 기반 모니터링 시스템인, 윈도우 성능 프로파일러 / 애져 AppInsight / Promethes /DataDog 3가지 모두 연동가능하며 

다양한 연동 라이브러리는 누겟에 지속적으로 추가됩니다.

  • 윈도우 성능 프로파일러 : 로컬에서 극단적인 퍼포먼스 검증시 활용( 물론 개발장비가 윈도우여야함)
  • Azure AppinSight : 성능 프로파일을 Azure 클라우드 데시보드로 통합하고자 할때
  • Phomethes : 오픈 진영의 성능 프로파일러 데시보드와 연동을 할때 ( Grafana , DataDog등과 연동이 가능해집니다.)


기존 액터 시스템에 모니터링 툴을 탑재함으로, 모든 구현된 기존 액터 객체(모니터링 액터)들은 모니터링 기능을 탑재하게 됩니다.

카운팅 이벤트 발생

// 사용부 : 10만 이벤트 발생
for (int i = 0; i < 100000; i++)
    MonitorActor.Tell(value);

// 구현부 : 카운팅 이벤트를 발생할수 있음
ReceiveAsync<string>(async msg =>
{
    int auto_delay = random.Next(1, 100);  //1 이벤트를 임의로 지연 ( 특정 도메인기능 수행한다고 가정 )
    await Task.Delay(auto_delay);
    Context.IncrementCounter("akka.custom.metric1");  // 1단위로 증가
    Context.IncrementCounter("akka.custom.metric2",100); // 특정 단위로 증가(만약 100개 벌크 처리받았다고 하면 100카운팅 증가를 한번에할수 있습니다.)
});

특정 네임스페이스("akka.custom.metri1") 에 이벤트가 발생할때마다, 카운팅을 추가할수 있습니다.

본 샘플 프로젝트에서는, 10만 이벤트를 1분이내에 처리하도록 구현되었으며

100만 이벤트도 3분이내에 유실없이 측정 가능함을 테스트가 되었습니다.


이벤트 하나에 대응을 바로하여도 액터 메시징 큐는 충분한 성능을 가지고 있으나

모니터링 시스템이 일반적으로 10초주기로 증분값을 수집하기 때문에, 이벤트마다 매번 메모리값을(IncrementCount) 증가할 필요는 없습니다.

조금더 고성능을 위해 특정 시간이내에 집계된 카운팅을 증가하겠다고 하면 

FSM(상태머신)액터를 활용하여 카운팅 증가,빈도를 조절할 수있습니다. 샘플은 배치처리에대한 예시이지만, 다양하게 응용가능하며

카운팅 보고가 API단위로 이루어지고 보고 시점을 직접해야하는 경우라고하면 유용할수 있습니다.

카운팅 측정및 모니터링하기

본 샘플 프로젝트에서, 백만건 이상의 원격 메시지를 유실없이 초당 TPS를 조절( 1000 ,2000,3000) 해 가며 테스트를 하였습니다.

유실없는것은 최종 이벤트 카운트로도 가능하지만, TPS의 측정은 모니터링 툴의 도움을 받아야하며

여기서는 플랫폼 제약없이 다양한 모니터링툴로 검증을 하였습니다.

윈도우 성능 카운터 추가

이벤트가 한번이라도 발생하면 AKKA라는 수집대상 그룹이 추가됩니다.

여기서는 윈도우 성능 모니터링을 사용하였으며, 매트릭스 기반 성능 모니터링은 

이벤트가 발생하였다고하면, 수집요소가 자동으로 추가되어 표시가 됩니다. 

수집대상을 결정하는것이 아니기 때문에 유연하게 추가가 가능합니다.

로컬 1PC측정시 유용합니다.



클라우드 기반의 매트릭스 기반 솔류션을 사용한다고 해도 ,성능 매트릭스에대한  기본 컨셉은 동일합니다.

애져에서 매트릭 추가하기

각 객체(액터)가 가진 성능을 분리하여 측정가능합니다.

여기서 설명되는 방식은,Azure AppInsight 뿐만아니라, 다양한 오픈 플랫폼 데시보드와도 연동가능합니다. ( 매트릭스기반의 Grafana,DataDog등....)



모니터링을 위해 도메인 기능이 포함된, 기존 코드를 액터 모델로 전환할 필요가 없으며 

액터는 대용량 처리 메시지를 충분히 커버함으로 실시간  측정및/모니터링 용도로 액터를 기존코드에 간단하게 추가할수 있습니다.

MonitorActor.Tell(value);  와같이 이벤트가 발생하는 시점에서 단순하게 Tell을 하는것만으로 고성능 비동기 처리가 가능하기 때문입니다.

데시보드로 측정하기

윈도우 성능 프러파일러

표: 시간별로 메시지처리가 증가함에따라 CPU변화량을 같이 비교할수 있습니다. (메시징 배율 0.0001,10000을곱하면 메시지수) 

표:TPS와 유실이 없는지 실시간으로 확인이 가능합니다.


Azure ApplicationInsight

표 : 분산처리된 실시간 메시징의 합계를 구하기

Data Dog



윈도우 성능 프로파일러가 주로 단일장비 스케일업을 위해 튜닝할때 사용된다라고 하면

통합된 수집가능한 데시보드툴에서는  각각의 인스턴스가 자신의 카운팅을 측정하여 보고하고, 통합 데시보드에서는 분산된 어플리케이션 객체에대한 총합을 측정할수 있습니다.

분산처리 스케일 아웃에대한 성능 지표를 측정할때 활용할수 있습니다.


실시간 메시징에대한 유닛테스트 방법, 메시징을 측정하는 방법을 살펴 보았습니다.

다음 장에서는, 도메인 처리에 관련된 실시간 메시징을 분산처리할수 있는 클러스터 메시징에 대해 알아보겠습니다.


추가 자료

APM을 위한 Akka.net 분산액터메시지 분산추적하는 툴을 제공합니다.

액터의 활용이 높아 개수가 많을시 유용하게 활용할수 있습니다.

링크 : https://petabridge.com/blog/phobos-2.0-otel/?fbclid=IwAR2d3ZKv16_frBmfGKjftya_yL7zQzH4j6BoaeTFv3xlV0csaXl9iVPTskA


참고링크:



  • No labels