Versions Compared

Key

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

...

  • actor.privider = cluster : 해당 액터들을 클러스터로 사용하겠다.
  • cluster-roundrobin.cluster.user-role = akkanet : 라운드로빈방식으로 akkanet 을 가지면 롤이름 : 라운드 로빈방식으로, 롤 이름으로 지정된 노드에서 작동됨
  • cluster.seed-nodes : 등대역활 지정
  • cluster.roles : 자신이 가져야할 롤 지정(복수개지정가능)


로컬액터 클러스터액터로 전환

Code Block
protected Cluster Cluster = Akka.Cluster.Cluster.Get(Context.System);
private bool ClusterMode = true;

protected override void PreStart()
{
	// subscribe to IMemberEvent and UnreachableMember events
	if (ClusterMode)
	{
		Cluster.Subscribe(Self, ClusterEvent.InitialStateAsEvents,
		new[] { typeof(ClusterEvent.IMemberEvent), typeof(ClusterEvent.UnreachableMember) });
	}
}

protected override void PostStop()
{
	if (ClusterMode) Cluster.Unsubscribe(Self);	
}
// src : https://github.com/psmon/AkkaForNetCore/blob/master/AkkaNetCore/Actors/ClusterMsgActor.cs

기존 로컬전용 액터에, 잡담(Gossip) 기능을 추가하는것으로 클러스터 기능 작동준비가 완료됩니다.

도메인 메시지를 처리하는 Received에는 코드변화가 없습니다.


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

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);
}




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

Image Added

클러스터 개발의 난제는, 로컬에 구성요소를 N개를 뛰우고 디버깅이 가능한가인데, 도커가 없을 시절

멀티노드를 뛰우는것은 상당히 불편한 과정에 하나였습니다. 

요즘 대부분의 IDE들은 Docker(+Compose,+쿠버네틱)개발환경을 지원하고 있음으로

운영과 비슷한 조건의 노드 구성을 하고 구동시킬수 있으며 디버깅지원은 보너스입니다.

샘플에서는 추가로 DataDog(https://www.datadoghq.com/) 매트릭스 연동하였습니다. ( 클러스터에 발생하는 메시지에대한 모니터링)

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"




Links : 

...