[Akka] Cassandra

smlee·2023년 10월 23일
0

Akka

목록 보기
41/50
post-thumbnail

우리는 이전 포스트에서 로컬 스토리지 snapshot을 사용했다. 하지만 이번 포스트에서는 Cassandra를 사용하는 법을 정리해놓으려고 한다.

build.sbt 설정

libraryDependencies에 다음과 같은 2가지 dependency를 추가한다.

lazy val cassandraVersion = "0.91"

"com.typesafe.akka" %% "akka-persistence-cassandra" % cassandraVersion,
"com.typesafe.akka" %% "akka-persistence-cassandra-launcher" % cassandraVersion % Test

위는 카산드라를 사용하기 위한 dependency이다.

docker-compose.yml

version: '2'

services:
  cassandra:
    image: cassandra:3
    container_name: cassandra
    ports:
      - "7000:7000"
      - "9042:9042"
    environment:
      - "CASSANDRA_CLUSTER_NAME=OUR_DOCKERIZED_CASSANDRA_SINGLE_NODE_CLUSTER"

docker-compose.yml 파일에서 설정을 작성한다. 카산드라 3 이미지로 설정해주며, 포트는 디폴트로 7000번과 9042번을 사용한다. 7000번 포트는 카산드라 클러스터 내에서 Internal node 사이의 통신을 위하여 사용하는 포트이며, 9042번 포트는 카산드라 쿼리 언어를 사용하는 포트이다.

application.conf

cassandraDemo {
    akka.persistence.journal.plugin = "cassandra-journal"
    akka.persistence.snapshot-store.plugin = "cassandra-snapshot-store"
}

config명을 설정하고 중괄호를 열고 위와 같은 akka.persistence.hournal.pluginakka.persistence.snapshot-store.plugin을 추가해준다.

위의 2가지 config를 추가해야 한다. 그 외의 것은 default로 추가 된다. 만약 관련 값들을 변경하고 싶으면 akka persistence cassandra의 reference.conf를 참고하여 변경하면 된다.

이제 이전 포스트에서 사용한 PersistentActor를 그대로 사용한 후 다음과 같은 Object를 작성한 후 실행시켜본다.

object Cassandra extends App{
  val system = ActorSystem("cassandraSystem", ConfigFactory.load().getConfig("cassandraDemo"))
  val simpleActor = system.actorOf(Props[SimplePersistentActor], "simplePersistentActor")

  (1 to 10).foreach(num => simpleActor ! s"[$num]I love Akka")
  simpleActor ! "print"
  simpleActor ! "snapshot"

  (11 to 20).foreach(num => simpleActor ! s"[$num] I love Akka")
}

위와 같이 system에서 config들을 불러오고, docker compose up 명령어를 통해 도커를 띄우고 실행해본다.


정상적으로 실행된 것을 볼 수 있다. 그리고, cassandra에 제대로 저장되었는지 확인해보자.

Cassandrad에서 확인하기

터미널에서 ./cqlsh.sh를 사용하여 카산드라 쿼리를 연다.

위와 같이 cqlsh로 바뀌었다면 다음과 같은 쿼리를 입력하면 저장된 데이터들을 볼 수 있다.

SELECT * FROM AKKA.MESSAGES;

위의 쿼리문을 실행하면 이렇게 데이터가 뜬다.

persistentId를 보면 PersistentActor 내의 persistentId명인 "simple-persistent-actor"가 들어가 있는 것이 보인다. 그렇다면 스냅샷 데이터는 위의 컬럼들 중에서 무엇일까?

위의 밑줄 친 데이터가 스냅샷으로 저장된 데이터이다. 그렇다면 의문이 들것이다. 분명 코드에서는 "[숫자] I love akka"라는 데이터가 나와야할 것이지만 왜 저런 16진수 데이터가 되는 것일까? 직렬화가 자동으로 진행되었기 때문이다.

따라서 hex to string 페이지에서 위의 데이터를 입력해보면 다음과 같이 나온다.

따라서 스냅샷이 카산드라에 잘 저장된 것을 확인할 수 있다.

Akka의 직렬화는 Java의 Serialization을 디폴트로 가지지만, 아카에서 커스텀으로 직렬화할 수 있다. 이는 다음 포스트에서 정리하려고 한다.

0개의 댓글