Page History
...
- 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);
} |
클러스터 한방에 로컬에서 뛰우기
클러스터 개발의 난제는, 로컬에 구성요소를 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 :
...