Versions Compared

Key

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

...

Code Block
// 클러스터 액터 설정 : https://github.com/psmon/AkkaForNetCore/blob/master/AkkaNetCore/Startup.cs
services
AkkaLoad.AddActor<ClusterMsgActorProvider>((provider, actorFactory) =>
{
	var actor = actorFactoryRegisterActor(
	"clusterRoundRobin",
	actorSystem.ActorOf(Props.Create<ClusterMsgActor>(0)
			.WithDispatcher("fast-dispatcher")
			.WithRouter(FromConfig.Instance), 
			"cluster-roundrobin");
	return () => actor;
});
			

// 클러스터 액터 DI 참조 얻기및 메시지 보내기  : https://github.com/psmon/AkkaForNetCore/blob/master/AkkaNetCore/Controllers/ActorTestController.cs
			
private readonly IActorRef clusterMsgActorProviderclusterRoundbin1;
public ActorTestController(ClusterMsgActorProvider _clusterMsgActorProvider)
{            
	clusterMsgActorProviderclusterRoundbin1 = _clusterMsgActorProvider(AkkaLoad.ActorSelect("clusterRoundRobin");
}

[HttpPost("/cluster/msg/tell")]
public void ClusterMsg(string value, int count)
{
	for (int i = 0; i < count; i++)
		clusterMsgActorProviderclusterRoundbin1.Tell(value);
}

클러스터 한방에 로컬에서 뛰우기

...

Code Block
titledocker-compose.yml
collapsetrue
version: '3.4'

services:
  datadog:
    image: datadog/agent:7
    ports:
      - 8125/udp
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /proc/:/host/proc/:ro
      - /sys/fs/cgroup/:/host/sys/fs/cgroup:ro
    environment:
      DD_API_KEY: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
      DD_DOGSTATSD_NON_LOCAL_TRAFFIC: "true"

  lighthouse:
    image: ${DOCKER_REGISTRY-}lighthouse
    build:
      context: .
      dockerfile: LightHouse/Dockerfile
    environment:
      CLUSTER_IP: lighthouse
      CLUSTER_PORT: 4053
      CLUSTER_SEEDS: akka.tcp://actor-cluster@lighthouse:4053

  akkanetcore:
    image: ${DOCKER_REGISTRY-}akkanetcore
    build:
      context: .
      dockerfile: AkkaNetCore/Dockerfile
    depends_on:
     - lighthouse
    ports:
     - 8080:5000
    environment:
      ASPNETCORE_ENVIRONMENT: Development
      MonitorTool: datadog
      MonitorToolCon: datadog
      port: 5000
      akkaport: 7100
      akkaip: akkanetcore
      roles: "akkanet"
      akkaseed: "akka.tcp://actor-cluster@lighthouse:4053"

  akkanetcore2:
    image: ${DOCKER_REGISTRY-}akkanetcore
    build:
      context: .
      dockerfile: AkkaNetCore/Dockerfile
    depends_on:
     - lighthouse    
    environment:
      ASPNETCORE_ENVIRONMENT: Development
      MonitorTool: datadog
      MonitorToolCon: datadog
      port: 5000
      akkaport: 7000
      akkaip: akkanetcore2
      roles: "akkanet"
      akkaseed: "akka.tcp://actor-cluster@lighthouse:4053"

  akkanetcore3:
    image: ${DOCKER_REGISTRY-}akkanetcore
    build:
      context: .
      dockerfile: AkkaNetCore/Dockerfile
    depends_on:
     - lighthouse    
    environment:
      ASPNETCORE_ENVIRONMENT: Development
      MonitorTool: datadog
      MonitorToolCon: datadog
      port: 5000
      akkaport: 7000
      akkaip: akkanetcore3
      roles: "akkanet"
      akkaseed: "akka.tcp://actor-cluster@lighthouse:4053"

측정가능

클러스터에서 발생하는 도메인 메시지에대한 모니터링및 측정은 장애대응/성능향상등을 위해 중요한요소이며

단순하게 CPU사용량/네트워크 사용량만을 이용하지 않습니다. 설계된 메시지에대한 유연한 오브젝트 단위 카운팅이가능하며

다양한 모니터링 툴과 연동 가능합니다. ( 이전장 참고 - 실시간 메시지 성능 카운팅 )

여기서는, 3대를 클러스터로 묶은후 110만 메시지를  분산 전송하고 ,유실여부와 TPS를 측정하였습니다.

...

Image Removed

  • 단일노드 : 1700tps
  • 클러스터(3) :  5100tps

단일노드에서 1700tps정도 나오도록 설계하였으며, 3대의 노드에서 3배의 성능 향상이됨을 검증을 하였습니다.

단일노드가 기대치 이하이거나(100Tps 이하) 자신이 만든 기능에 대해  성능 측정을 할수 없다고 가정해봅시다.

...

Code Block
[2020-02-29 12:20:53.1335] .....
====== Process Total:1000000 Seconds(100):0.0155927 Msg:sdsdsd 

[2020-02-29 12:21:15.0558] .....
====== Process Total:1099900 Seconds(100):0.267527 Msg:sdsdsd 

[2020-02-29 12:21:15.9675] .....
 ====== Process Total:1100000 Seconds(100):0.9117147 Msg:sdsdsd


...

110만 메시지가 유실없이 전송됨을 검증 , 10만 처리(구간 1000000~110000)가

30초 이내에 완료됨을 자체 로깅시스템으로도 확인이 가능합니다.

클러스터 에서 발생하는 메시징의 총합계가 실시간 로깅을 통해 측정가능함을 의미하고 

멀티 스레드 컴퓨팅환경에서 로컬컴퓨터가가진 메모리의 합계를 내는것도 꽤나 골치아픈일인데

네트워크로 분리된 메시징의 총합계를 실시간으로 측정하는 마법과같은 일을 할수 있을까요?

해답은 클러스터 싱글톤이라는 컨셉이있으며, 클러스터 내에서도 단 하나만 존재하여 여러 클러스터에서발생하는

내용을 중앙 집계처리할수가 있습니다. 단일지점이기때문에 메시징빈도를 주의해야할 필요는 있으나

이 샘플에서는 빈도수 최적화를 하지 않았으며, TPS 5000 정도는 무난하게 처리가능합니다.

git : https://github.com/psmon/AkkaForNetCore/blob/master/AkkaNetCore/Actors/Study/SingleToneActor.cs

데이터 분산처리

이 샘플에서는, 메시징을 별도로 저장하지 않았으며  처리중인 메시지는 영속화를 할수가 있습니다.

...

클러스터 싱글톤을 포함하여 샤딩처리및 영속화는 다음장에 다음장 이후에 다뤄보겠습니다. 

Links : 

...