Programing/Akka

Akka Distributed Publish Subscribe in Cluster #1.Subscribe/Publish

BUST 2018. 8. 9. 22:51

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