Akka Distributed Publish Subscribe in Cluster #1.Subscribe/Publish
- akka cluster 기능 중에 하나인 Akka pub/sub에 대해서 알아보자.
- cluster에 있는 actor를 알 필요없이 데이터를 전송을 할수 있다.
- 데이터는 topic 단위로 publish가 된다. subscribe은 group id를 통해 메시지가 관리 될수 있다.
- akka.cluster.pubsub.DistributedPubSubMediator 는 등록된 actor reference (actor ref)를 관리를 한다. 또한 다른 노드에 존재하는 Mediator에 해당하는 actor referfence를 복제를 한다.
Gradle
dependencies {
compile group: 'com.typesafe.akka', name: 'akka-cluster-tools_2.12', version: '2.5.14'
}
Subscribe
public class Subscriber extends AbstractActor {
LoggingAdapter log = Logging.getLogger(getContext().system(), this);
public Subscriber() {
ActorRef mediator =
DistributedPubSub.get(getContext().system()).mediator();
// topic 'content' 대해 subscribe를 등록을 한다.
mediator.tell(new DistributedPubSubMediator.Subscribe("content", getSelf()),getSelf());
}
@Override
public Receive createReceive() {
return receiveBuilder()
.match(String.class, msg ->
log.info("Got: {}", msg))
.match(DistributedPubSubMediator.SubscribeAck.class, msg ->
log.info("subscribed"))
.build();
}
}
- mediator라는 Actor를 통해 PubSub를 Subscribe/UnSubscribe 할수가 있다.
- Subscribe가 되는 경우에는 SubscribeAck 메시지가 들어온다.
- UnSubscrib가 된 경우에는 UnSubScribeAck 메시지가 들어온다.
- subscribe 할때 sendOneMessageToEachGroup 옵션과 group 옵션을 이용하여 group id 별로 메시지를 받을수가 있다.
- 같은 group id를 가진 subscribe는 데이터가 한번만 전송이 된다.
- `RoutingLogic`은 (기본값 random) 으로 설정이 되어 있따.
- cluster의 `weeklyUp` 이벤트를 받으면 cluster akka pub/sub에 등록이 되어 데이터를 받을수 있다.
Publish
public class Publisher extends AbstractActor {
// activate the extension
ActorRef mediator =
DistributedPubSub.get(getContext().system()).mediator();
@Override
public Receive createReceive() {
return receiveBuilder()
.match(String.class, in -> {
String out = in.toUpperCase();
// topic 를 통해 데이터를 전송을 할수가 있다.
mediator.tell(new DistributedPubSubMediator.Publish("content", out), getSelf());
})
.build();
}
}
Delivery Guarantee
- akka pub/sub를 at-most-once 최대 1번을 제공한다.
- at-least-once를 원한다면 kafka 등을 이용한다.
활용
- 기존 Akka Cluster Aware Router/ Actor Selection 이용하여 처리하는 것과 달리 actor의 존재를 모른다고 하더라도 cluster에 데이터를 분배를 할수 있다. (scale-out)
Reference
'Programing > Akka' 카테고리의 다른 글
Cluster Aware Router (0) | 2018.08.16 |
---|---|
Akka Actor / Stream / Cluster 을 이용한 확장 가능한 Task 단위의 시스템 (0) | 2018.08.15 |
Akka Dispatcher를 이용한 성능 튜닝 (0) | 2018.08.05 |
Akka Stream Error Handling (0) | 2018.08.01 |
Akka Http (0) | 2018.07.28 |