Page History
...
draw.io Board Diagram | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
클러스터 내에서는 PubSub을 브로드캐스트 방식을 사용하지 않고도 , 정확하게 구독한 객체에게 전송이 가능하며
이것이 가능한 이유중에 하나는 클러스터내에서 P2P 전송을 지원하며 물리적 주소를 알 필요없이 Key와 같은
가장 작은단위의 메시지 전송방식은 보낼대상 지점을 통해 P2P 전송이 가능합니다.
실제 중간지점의 전송계층을 경유하지 않고 클러스터내 Node내 액터간 1:1 통신을 할수 있으며 물리적인 위치를 알필요없이 위치투명성을 이용합니다논리적으로 생성한 주소만으로 원격지의 객체에게 이벤트 전송을 할수있습니다.
클러스터 테스트 코드
Code Block | ||
---|---|---|
| ||
// A와 B는 다른 포트로 구성된 Node입니다. testKitA = ActorTestKit.create("ClusterSystem",cluster1) testKitB = ActorTestKit.create("ClusterSystem",cluster2) @Test fun testClusterRouter(){ //테스트를 위한 준비코드 val probeA = testKitB.createTestProbe<Receptionist.Listing>() val probeB = testKitB.createTestProbe<HelloActorAResponse>() var list = testKitB.system().receptionist() list.tell(Receptionist.find(ClusterHelloActorA.ClusterHelloActorAKey, probeA.ref)) val listing = probeA.receiveMessage() //실제 활용되는 코드 val router = listing.getServiceInstances(ClusterHelloActorA.ClusterHelloActorAKey) router.forEach { it.tell(HelloA("Hello", probeB.ref)) probeB.expectMessage(HelloAResponse("Kotlin")) } } |
- val router : 위치 투명성이 있는 객체로 클러스터를 접근하는 논리적인 키만 알고 있으면 시스템내에 생성이 가능하며 논리적인 키를 보유한 원격지 액터에게 전송이 가능합니다.
- ClusterHelloActorAKey 라는 논리적 키로
- ClusterHelloActorA.ClusterHelloActorAKey 라는 논리적 주소만으로, B 시스템에서 A 시스템에 구성된 액터에게 이벤트를 보내고 응답을 받는 샘플입니다.
...
가장 작은단위의 전송인 PointToPoint 전송을 기본으로 지원하게되면 Topic단위 또는 이벤트 버스를 구현할때도 최소 전송단위가 존재하기때문에 나머지는 논리적인 구성을 효과적으로 할수 있게됩니다존재하기때문에 브로드캐스트를 효율적인 전송을 위해 활용해 수신처에서 필터기법을 사용할수도 있지만
필수적으로 필요로 하지는 않게됩니다.
Pub/Sub 시스템에서 상태없는 서비스와 상태있는 액터 모델을 사용했을 때의 메시지 전송 빈도 효율을 비교해 보겠습니다. 특히, 이벤트 생성 시마다 브로드캐스트가 필요하지 않도록 효율적 설계하는 방법도 다뤄보겠습니다.
...
따라서 이벤트 발생 빈도가 높거나 구독자가 많은 시스템에서는 상태있는 액터 모델을 사용하는 것이 효율적이며, 브로드캐스트 빈도를 줄여 네트워크와 시스템 리소스를 절약할 수 있습니다.
가정 및 설정 추가
- 스케일아웃을 위한 중간 장치 10대: 각 장치는 필터링을 통해 수신한 이벤트 중 일부만 최종 사용자에게 전송할 수 있습니다.
- 상태없는 Pub/Sub: 모든 이벤트가 모든 사용자에게 전송되므로, 중간 장치들은 단순히 이벤트를 전달하는 역할만 수행한다고 가정합니다.
- 상태있는 액터 클러스터와 Akka 분산 Pub/Sub: 중간 장치가 이벤트 필터링을 추가적으로 수행하여, 각 장치가 받은 이벤트 중 10%만 최종 사용자에게 전송한다고 가정합니다.
...
이를 바탕으로 단위별 비교 표를 작성하겠습니다.
이벤트 수 | 상태없는 Pub/Sub 전송 수 | 상태있는 액터 클러스터 전송 수 | Akka 분산 Pub/Sub 전송 수 |
---|---|---|---|
1 | 10,010 | 1,010 | 51 |
10 | 100,100 | 10,100 | 510 |
100 | 1,001,000 | 101,000 | 5,100 |
1,000 | 10,010,000 | 1,010,000 | 51,000 |
10,000 | 100,100,000 | 10,100,000 | 510,000 |
100,000 | 1,001,000,000 | 101,000,000 | 5,100,000 |
분석 및 결론
- 상태없는 Pub/Sub는 여전히 모든 이벤트를 모든 사용자에게 브로드캐스트하기 때문에 네트워크 트래픽이 매우 높습니다. 중간 장치가 있더라도, 단순한 중계 역할만 하기 때문에 네트워크 전송 수에 큰 영향을 주지 않습니다.
- 상태있는 액터 클러스터는 상태 기반 필터링을 통해 전체 이벤트의 약 10%만 최종 사용자에게 전달되므로, 상태없는 Pub/Sub에 비해 네트워크 전송 수가 크게 줄어듭니다.
- Akka 분산 Pub/Sub는 필터링과 구독 그룹을 통해 추가적으로 10배의 네트워크 트래픽 절감 효과가 있으며, 중간 장치에서도 필터링이 적용되므로 네트워크 전송 수가 가장 낮습니다.
...