Versions Compared

Key

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

...

만약 DC의 성능은 충분하고, 각 노드의 API들의 연산이 훨씬 많다고 가정하면 분산처리라 할수 있습니다.


Warning

DC 성능이 느린구조에서, 오토스케일을 거는 것은 문제가 있을수 있습니다. API가 늘어남에 따라 성능이 향상되는것이

...

아니고

병목현상으로 더 저하가 될수 있습니다. 이 구조에서는 측정을 통한 최적화된 한계값을 찾아 고정하는것이 더 효율적입니다.

오토스케일링이 무한개의 노드를 만드는 케이스

  1. DC가 느려짐에 따라 API 요청리퀘스트가.각 노드에 쌓여 메모리에서 제거되지 않음
  2. 각 노드는 메모리 부족 현상에 따라 지속적인 GC(가비지컬렉트)활동에 의해 CPU증가

...

  1. 하는일 없이 CPU만 증가하고 결국 메모리 풀을 일으키며 노드 다운

...

  1. 오토 스케일링은 정상 서버개수를 유지하려고 무한대의 서버 증식

...


분산처리 노드를 늘려 DC가 뻗는경우

  1. 느려서 분산 노드를 늘림~
  2. 빠르게 처리되는듯 보이나, DC의 부하 한계점 도달
  3. DC가 뻗어 모두가 작동안되는 상황발생


파편화된 설정

분산처리를 위해 Type별로 복제되는 DC를 수동으로 구성하였다고 가정해봅시다.

...

클러스터로 구성된 액터에게 메시지 보내기

Code Block

// 클러스터 액터 설정 : https://github.com/psmon/AkkaForNetCore/blob/master/AkkaNetCore/Startup.cs
services.AddActor<ClusterMsgActorProvider>((provider, actorFactory) =>
{
	var actor = actorFactory.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 clusterMsgActorProvider;
public ActorTestController(ClusterMsgActorProvider _clusterMsgActorProvider)
{            
	clusterMsgActorProvider = _clusterMsgActorProvider();
}

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

...

Code Block
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"

데이터 분산처리

DC가 단일 DB라고 가정해봅시다. AKKA에는 메시지를 저장하는 영속성 기능도 지원하지만

중요 도메인 데이터에대해 RDB로 구성된것을 AKKA의 Persist 로 전환하는것은 바람직하지 않습니다.

RDB는 가장 안정적이고 검증이된 Persist역활을 하는 것중 하나이며 ,RDB의 부담을 덜어주는 방향으로

대용량 이벤트 데이터를 분산처리 하여 저장한후 RDB와 연동하는것이 추천됩니다. (이 후장에대 다룰예정)


Links : 

...