우리는 이전 포스트에서 로컬 스토리지 snapshot을 사용했다. 하지만 이번 포스트에서는 Cassandra를 사용하는 법을 정리해놓으려고 한다.
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이다.
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번 포트는 카산드라 쿼리 언어를 사용하는 포트이다.
cassandraDemo {
akka.persistence.journal.plugin = "cassandra-journal"
akka.persistence.snapshot-store.plugin = "cassandra-snapshot-store"
}
config명을 설정하고 중괄호를 열고 위와 같은 akka.persistence.hournal.plugin
과 akka.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
에 제대로 저장되었는지 확인해보자.
터미널에서 ./cqlsh.sh
를 사용하여 카산드라 쿼리를 연다.
위와 같이 cqlsh
로 바뀌었다면 다음과 같은 쿼리를 입력하면 저장된 데이터들을 볼 수 있다.
SELECT * FROM AKKA.MESSAGES;
위의 쿼리문을 실행하면 이렇게 데이터가 뜬다.
persistentId
를 보면 PersistentActor
내의 persistentId
명인 "simple-persistent-actor"가 들어가 있는 것이 보인다. 그렇다면 스냅샷 데이터는 위의 컬럼들 중에서 무엇일까?
위의 밑줄 친 데이터가 스냅샷으로 저장된 데이터이다. 그렇다면 의문이 들것이다. 분명 코드에서는 "[숫자] I love akka"라는 데이터가 나와야할 것이지만 왜 저런 16진수 데이터가 되는 것일까? 직렬화가 자동으로 진행되었기 때문이다.
따라서 hex to string 페이지에서 위의 데이터를 입력해보면 다음과 같이 나온다.
따라서 스냅샷이 카산드라에 잘 저장된 것을 확인할 수 있다.
Akka
의 직렬화는 Java의 Serialization을 디폴트로 가지지만, 아카에서 커스텀으로 직렬화할 수 있다. 이는 다음 포스트에서 정리하려고 한다.