[java] Akka를 사용한 분산 메시징 시스템 개발

분산 시스템은 대용량 데이터 처리, 고가용성, 확장성 등의 요구 사항을 충족시킬 수 있는 중요한 기술입니다. Akka는 분산 애플리케이션을 구축하기 위한 강력하고 유연한 도구입니다. 이 글에서는 Akka를 사용하여 간단한 분산 메시징 시스템을 개발하는 방법에 대해 알아보겠습니다.

Akka 소개

Akka는 JVM 기반의 액터 모델을 구현한 툴킷으로, 병렬 처리, 메시징, 고가용성 등의 분산 애플리케이션 개발을 위한 일련의 라이브러리와 프레임워크를 제공합니다. 액터 모델은 상태와 메시지를 기반으로 동작하는 경량 프로세스입니다.

액터 생성

먼저, Akka 액터를 생성해보겠습니다. 액터는 ‘props’ 메서드를 사용하여 생성됩니다. 아래 예제 코드에서는 ‘HelloActor’라는 액터를 생성합니다.

import akka.actor.AbstractActor;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;

public class HelloActor extends AbstractActor {
    public static class Greeting {
        private final String message;

        public Greeting(String message) {
            this.message = message;
        }

        public String getMessage() {
            return message;
        }
    }

    @Override
    public Receive createReceive() {
        return receiveBuilder()
                .match(Greeting.class, greeting -> {
                    System.out.println("Received message: " + greeting.getMessage());
                })
                .build();
    }
    
    public static void main(String[] args) {
        // 액터 시스템 생성
        ActorSystem system = ActorSystem.create("HelloSystem");
        
        // HelloActor 생성
        ActorRef actor = system.actorOf(Props.create(HelloActor.class), "helloActor");
        
        // 메시지 전송
        actor.tell(new Greeting("Hello, Akka!"), ActorRef.noSender());
        
        // 액터 시스템 종료
        system.terminate();
    }
}

액터 간 통신

Akka는 액터 간의 통신을 위해 메시지 기반의 통신 방식을 사용합니다. 액터에게 메시지를 보내기 위해서는 ‘tell’ 메서드를 사용합니다. 아래 예제 코드에서는 액터 간의 메시지 전송을 보여주고 있습니다.

import akka.actor.AbstractActor;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;

public class SenderActor extends AbstractActor {
    @Override
    public Receive createReceive() {
        return receiveBuilder()
                .match(String.class, message -> {
                    System.out.println("Received message: " + message);

                    // 다른 액터에게 메시지 전송
                    ActorRef receiver = context().actorOf(Props.create(ReceiverActor.class));
                    receiver.tell(message, self());
                })
                .build();
    }
}

public class ReceiverActor extends AbstractActor {
    @Override
    public Receive createReceive() {
        return receiveBuilder()
                .match(String.class, message -> {
                    System.out.println("Received message: " + message);
                })
                .build();
    }
}

public class Main {
    public static void main(String[] args) {
        // 액터 시스템 생성
        ActorSystem system = ActorSystem.create("MessageSystem");
        
        // SenderActor 생성
        ActorRef senderActor = system.actorOf(Props.create(SenderActor.class), "senderActor");
        
        // 메시지 전송
        senderActor.tell("Hello, Akka!", ActorRef.noSender());
        
        // 액터 시스템 종료
        system.terminate();
    }
}

결론

Akka를 사용하여 분산 메시징 시스템을 개발하는 방법에 대해 알아보았습니다. 액터 모델을 활용하여 효율적인 메시지 통신과 고가용성을 제공하는 애플리케이션을 구축할 수 있습니다. Akka는 분산 애플리케이션 개발을 위한 강력한 도구이므로 적절하게 활용하면 좋은 성능을 얻을 수 있습니다.

References