- Scala 2.11 기반 

- Akka 2.4.11 기반 

Learning Concurrent Programming in Scala 참고 


생성 (Hello Akka)

import akka.actor.{ ActorRef, ActorSystem, Props, Actor }
import akka.event.Logging


// 나의 액터 클래스
class Hello(val hello: String) extends Actor {
val log = Logging(context.system, this)

def receive = {
case `hello` => // 받은 메세지가 'hello' 라면
log.info(s"Received a $hello!")
case msg => // 받은 메세지가 아무것이라면
log.info(s"Unexpected message '$msg'")
context.stop(self)
}
}


object ActorsCreate extends App {

// 액터 시스템 생성 . 이름은 mysystem
val mySystem = ActorSystem("mysystem")

// 액터 시스템을 통하여 나의 Actor 생성. 이름은 greeter 타입은 ActorRef
val hiActor : ActorRef = mySystem.actorOf(Props(new Hello("hi")), name = "greeter")

// 나의 액터와 교신. 'hi' 라는 메세지를 보낸다. // Received a hi! 출력
hiActor ! "hi"
Thread.sleep(1000)

// 나의 액터와 교신. 3 이라는 메세지를 보낸다. // Unexpected message '3' 출력
hiActor ! 3
Thread.sleep(1000)

// 액터 시스템 종료
mySystem.terminate()
}

주석을 통하여 충분히 이해 가리라 본다.

액터시스템을 먼저 생성하고 그 액터 시스템에 우리가 만든 액터클래스를 객체화하여 등록시켜 사용하는것이다.액터 클래스에는 receive라는 메소드가 있는데 , 액터는 receive 를 통하여 메일박스로 부터 받은 메세지를 처리한다. receive 메소드는 PartialFunction[Any,Unit] 타입의 객체이다. Any 타입의 메세지를 받아서 처리한다.

부분함수란 ? 바로가기 

Props 객체는 액터 인스턴스를 만드는데 필요한 모든 정보를 캡슐화해 놓았다. (직렬화 가능하며, 네트워크를 통해 전송 가능)


메세지 수신

메세지 수신은 receive 메소드를 통해서 합니다.


def receive = {
case `hello` => // 받은 메세지가 'hello' 라면
log.info(s"Received a $hello!")
case msg => // 받은 메세지가 아무것이라면
log.info(s"Unexpected message '$msg'")
context.stop(self)
}

이렇게 'hello'문자열이 날라오는등 경우(case) 에 따라서 케이스 매칭 해줍니다.

아래는 케이스 클래스를 매칭 합니다. 좀 더 복잡한  receive 처리를 할 수 있겠지요.

case class ClassOne(x: Int, y: String) case class ClassTwo(a: Int, b: Option[ClassOne]) override def receive = { case ClassOne(x, y) => println(s"Received $x and $y") case ClassTwo(a, Some(ClassOne(x, y)) if a == 42 =>     // do something case ClassTwo(a, None) => case c @ ClassOne(_, "foo") => // only match if y == "foo", now c is your instance of ClassOne }


- Scala 2.11 기반  (2.13.1의 짝은 아래 2.6.3 입니다.) 

- Akka 2.4.11 기반 (2.6.3)

환경 설치 및 프로젝트 만들기


우리는 윈도우 환경에서 IntelliJ IDE 를 이용하여 AKKA 개발을 할 것입니다. 언어는 SCALA 를 사용~
Activator 를 이용한 방식도 일반적인데 그건 다른 블로그글을 참고하세요~ Activator , Play2 세팅 

1. JDK 1.8 버전 설치  

  Akka 를 하기 위해서 미리 깔려져 있어야 할것은  단지 JDK 1.8 뿐입니다.  jdk 1.8 설치하기 
  scala 나 Sbt 를 위한 것 들은 IntelliJ 에서 자체 제공합니다. (플러그인 다운로드) 
  

2. IntelliJ 설치   

  처음 시작 하려면 무조건 IntelliJ 씁시다. 편하니깐~ (내부에 대부분 준비되어 있습니다) 

 가)   IntelliJ 다운로드 받기에서 Ultimate 버전으로 다운 받습니다.

  나)   IntelliJ 를 설치합니다. (다운받은 exe 클릭)

       - next ~ next 계속해주세요. 설치위치 및 옵션들은 알아서 잡으시고요. 

  다)  설치 끝.  IntelliJ 아이콘을 클릭하여 실행 시켜 봅시다.  

2. IntelliJ 실행 

   중요포인트 :    설치하고 처음 실행 할 때 Scala 와 Sbt 에 대한 플러그인을 꼭 설치~

   출발~~~~!!

처음 IntelliJ 를 실행하면  IDE 세팅 설정을 물어보는데 처음 하는것이니 아래것 선택하고 다음~


평가판 선택하시고 다음~

 IDE 색상 선택하시고 다음 ~

 이런것들이 기본적으로 있다는 야그~ 다음~

Scala 기반의 akka 를 할 것이므로 Scala 인스톨 추가 그리고 다음~

자 이제 시작 화면이 뜨는데 프로젝트 만들기 전에 설정에서 따로 플러그인을 설치해줘야합니다.
빨강색 박스의 Configure 누르고 플러그인 선택하세요.

 Broswe repositories.. 선택 

SBT 로 검색해서 모두 설치해 줍니다.

재 시작 ~

이제 진짜 새로운 프로젝트를 만들어 보죠.

Create New Project 선택 

왼쪽 Scala 선택하시고 오른쪽에 나온 목록중에  sbt 선택해서 프로젝트를 만듭니다.

프로젝트 만들어 주시면 됩니다.

프로젝트 만들고 나서 Sbt 에 AKKA 디펜던시 추가 - 끝 -   

build.sbt 파일에 akka 디펜던시 추가 하면  끝!!

 

  1. libraryDependencies +=
  2. "com.typesafe.akka" %% "akka-actor" % "2.4.11"


이 글을 작성한지 4년지난 2020년 3월 현재, 아래와 같이 버전을 맞춰줘야 제대로 작동하더군요.

scalaVersion := "2.13.1"

libraryDependencies +=
"com.typesafe.akka" %% "akka-actor" % "2.6.3"


이 아래는 나중에 우분투에 배포할때 우분투에 있어야할 환경들입니다. 

일단 JDK 1.8 설치는 설치 되 있다고 가정합니다.

우분투 14.04 에 scala 2.11.8 및 sbt 13.11 설치

# scala  Installation

wget www.scala-lang.org/files/archive/scala-2.11.8.deb

sudo dpkg -i scala-2.11.8.deb


# sbt Installation

echo "deb https://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 642AC823

sudo apt-get update

sudo apt-get install sbt




Akka 시작하기


Akka를 광고하자면

처리율(throughput)   임백준님의 Akka 시작하기에서 발췌 

아카를 이용한 리팩토링을 끝마쳤을 때, 똑같은 컴퓨터 위에서 전과 동일한 몬테 카를로 시나리오를 수행하는데 걸리는 시간이 6시간에서 2시간으로 단축되었다. 66%의 시간이 절약된 것이다. 결과를 확인한 사람들은 깜짝 놀랐다. 단순히 자바 스레드에서 아카로 라이브러리를 바꾸었을 뿐인데 그렇게 엄청난 차이가 있을 수 있냐며 고개를 갸웃거렸다. 물론 이런 차이를 일반화할 수는 없다. 이런 결과 하나를 가지고 아카가 자바 스레 드보다 3배 빠르다고 말하는 어리석은 사람은 없을 것이다. 아카도 내부적으로 자 1 아카에 대하여 - 017 바 스레드를 사용하기 때문에 그런 비교 자체가 성립하지 않는다. 하지만 일반적 인 차원에서 짚고 넘어갈만한 부분도 있다. 이렇게 커다란 차이가 어디에서 비롯 되었는지 이해하려면 우선 암달의 법칙Amdahl’s law을 생각해볼 필요가 있다. 암달의 법칙은 이렇다. “멀티코어를 사용하는 프로그램의 속도는 프로그램 내부에 존재하는 순차적sequential 부분이 사용하는 시간에 의해서 제한된다.” Thread나 Task를 만들어서 ExecutorService에게 제출하는 식으로 동시성 코드를 작성하면 여러 개의 스레드가 동시에 작업을 수행한다. 하지만 프로그램 안에는 Thread나 Task가 포함하지 않는 코드가 존재한다. 여러 개의 스레드가 동시에 작업을 수행하더라도 synchronized 블록이나 데이터베이스, 네트워크 API 호출 등을 만날 때 다른 스레드와 나란히 줄을 서서 순차적으로 작업을 수행 해야 하는 경우도 있다. 암달의 법칙은 프로그램이 낼 수 있는 속도의 상한이 이런 순차적 코드가 사용하는 시간에 의해서 제한된다고 말하는 것이다. 이러한 순차적 코드의 또 다른 이름은 블로킹blocking 콜이다. 문제는 스레드 자체 가 아니라 스레드를 사용하면서 자기도 모르게 만들어내는 블로킹 콜이다. 조금 과장해서 말하자면 자바 개발자가 스레드를 이용해서 만들어내는 ‘동시성’ 코드는 일종의 신기루다. 사실은 코드 곳곳에 존재하는 블로킹 콜, 순차적 코드 때문에 전 체적인 프로그램의 처리율은 이미 상한이 정해져 있지만 여러 개의 스레드가 ‘동 시에’ 동작한다는 사실로부터 위안을 받을 뿐이다.

정의

Akka

위키백과, 우리 모두의 백과사전.

Akka는 오픈 소스 툴킷으로, JVM 상의 동시성과 분산 애플리케이션을 단순화하는 런타임이다. Akka는 동시성을 위한 여러 프로그래밍 모델을 지원하지만, Erlang으로부터 영향을 받아 actor 기반의 동시성이 두드러진다.

자바 스칼라 언어 모두로 작성이 가능하다. Akka는 스칼라 2.10로 작성되었으며, 스칼라 2.10의 Akka의 actor 구현은 스칼라 표준 라이브러리에 포함되어있다.[1]

역사[편집]

Philipp Haller에 의해 작성된 actor 구현은, 2006년 7월에 스칼라의 2.1.7의 일부로 릴리즈 되었다.[2] 2008년 스칼라는 복잡한 서버 애플리케이션에서의 사용에 대해 주목하였지만, 동시성은 아직도 스레드(thread)-공유 메모리(shared memory)와 락(lock)을 필수적으로 사용하여 싱크를 맞추는-를 생성하는 전형적인 방식으로 이뤄지고 있다 . 이러한 접근 방식으로 생겨나는 어려움을 인식하고 얼랭 프로그래밍 언어의 라이브러리가 지원하는 고도의 동시성 쓰기, 이벤트 주도 애플리케이션으로부터 영감을 얻어, Jonas Bonér가 스칼라와 자바에 유사한 기능을 도입하기위해 Akka를 만들었다. Bonér는 2009 년 초부터[3] Akka를 작업하기 시작했고, 그 해에 그것에 대한 그의 비전을 작성했다.[4] 첫 공식 릴리즈는 Akka 0.5로,[5] 2010년 1월에 발표되었다.[6] Akka 이제 Play 프레임워크, 스칼라 프로그래밍 언어와와 함께   Lightbend 플랫폼의 일부이다.

특징[편집]

Akka actor를 기반으로하는 애플리케이션의 구별되는 특징은 다음과 같다:

  • 동시성은 메시지 기반이며 비동기 방식으로 이루어진다: 일반적으로 변형 가능한 데이터를 공유하거나 동기화되는 primitive를 사용해서는 안됩니다: Akka는 액터 모델을 구현한다.
  • 동일한 호스트든 분산된 호스트들이든, 직접 통신하든, 몇몇 혹은 다수의 스레드 상에서 동작하는 라우팅 채널을 이용하여 통신하든, 혹은 이외의 방법으로 통신을 하든 actor들이 상호작용하는 방식은 동일하다. 이러한 세부사항들은 프로그램이 수정 없이 스케일-업(더 성능이 뛰어난 서버를 사용)하거나 스케일-아웃(더 많은 서버를 사용)하기 위해 배포 시점의 구성 메카니즘에 따라 변경할 수 있다.
  • Actor들은 프로그램의 오류를 연관성에 따라 계층적으로 분류한다. 이 오류들은 actor의 supervisor의 이벤트로 처리된다(어느 actor가 오류를 발생했다는 메시지인지를 가리지 않음). 얼랭과는 대조적으로 Akka는 parental supervision을 강조한다. 이는 각 actor가 parent actor에 의해 생성되고 감독받는 것을 의미한다.

Akka는 actor를 제공하는 코어 모듈을 포함한 모듈 구조를 띄고 있다. 다른 모듈들은 actor의 네트워크 분산, 클러스터 지원, 명령과 이벤트 소싱, 다양한 서드 파티 시스템과의 통합(예, Apache Camel, ZeroMQ), 심지어 Futures, Agents같은 다른 병렬성 모델을 지원하는 것과 같은 기능을 추가하는 것이 가능하게 한다.

하마 블로그 akka 시작전 읽어 볼만한 글  

생성자-소비자 패턴 과 액터 

Actor ? ActiveObject? Akka? 

시작하기 좋은 서적 

임백준님의 아카 시작하기를 읽어보세요.  가격도 저렴하고 간결하게 필요한 부분만 정리 되어 있습니다.
이 책 한번 읽고 아카 (akka.io)에가서 예제 하나씩 해보면 됩니다.


chapter 1 아카에 대하여 
    처리율 
    스케일 아웃 
    모듈화 
    차세대 동시성 모델 


chapter 2 핑퐁 게임 
    핑퐁액터 
    액터시스템 만들기 
    액터 만들기 
    ActorRef 
    장소 투명성 
    메시지 전송 
    메일박스 
    onReceive 
    액터 라이프사이클 


chapter 3 아카 계층구조 
    아카 계층구조 
    보내고 잊기 
    작업의 완료 
    메시지 순서 
    테크닉 
    액터의 내부 상태와 스레드 


chapter 4 고장 나도록 허용하라 
    고장 나도록 허용하라 
    SupervisorStrategy 
    Resume 
    Restart 
    Stop 
    Escalate 
    기본 감시전략 
    재귀와 연대책임 
    chapter 5 액터와 상태기계 
    액터의 상태 
    상태기계 


chapter 6 라우터 
    라우터 
    라우터와 감시전략 
    풀과 그룹 
    라우팅 알고리즘 


chapter 7 퓨처와 에이전트 
    퓨처 
    예제코드 
    블로킹 호출 
    난블로킹 호출 
    에이전트 


chapter 8 클러스터 
    클러스터 
    코드 
    구성파일 
    actor.provider 
    actor.remote 
    actor.cluster 
    deployment 

+ Recent posts