Akka 맛보기

Akka는 무엇인가

  • 스칼라로 개발된 비동기 서버
  • Actor System을 위한 툴셋
  • JAR 파일 패키징된 모듈로 구성

왜 Akka 인가

비동기 처리를 위한 작업은 Akka 서버가 담당

개발자는 필요한 로직 구현에 집중

 

Akka 액터 모듈은 Scala 표준 라이브러리만 있으면 동작한다.

Akka Use cases

  • 요청에 대한 병렬 처리
  • 서비스와 클라이언트 간에 동시처리
  • 비동기 처리에 대한 대응
  • 이벤트 기반 프로그래밍

개발자가 걱정하지 않아도 되는 것들

  • 공유 데이터를 보호하기 위한 락(lock) 관리
  • 멀티 쓰레드에 의해 발생할수 있는 데드락(deadlocks)
  • 성능 튜닝

Akka Stack (from Akka in Action)

Actor 프로그래밍 모델

Actor 모델이 쓰레드 처리같은 기존방식에 비해 Concurrency 처리를 얼마나 단순화 시켜주는가

예제: 티켓 판매 시스템

사용자는 TicketingAgents에서 이벤트 티켓을 구매할 수 있다.

Customer

Ticketing

Agent

티켓 요청

티켓 제공

티켓 매진

  • Venue: Seates, Schedule

동시에 수백만명이 티켓을 구매한다면

Customer

Ticketing

Agent

Printing

Office

  • 멀티 쓰레드를 이용한 쓰레드 풀링
    • 대기 고객의 타임아웃 이슈
    • 공유 리소스 제약
  • 티켓에이전트는 '가능한 티켓 목록'을 두고 경쟁
  • 고객은 '다른 고객이 티켓을 인쇄'하는동안 대기

Option1: Sharing State  Approach

TA대기열은 사라졌다.

  • TA 대기시간 여전히 존재
  • 프린팅 대기 시간

Option2: Message Passing  Approach

TA는 PO로부터 티켓을 받는다.

티켓은 메시지에 담겨 전달된다.

PO는 더이상 TA를 블로킹하지 않는다.

Akka로 구현하면

  • TA와 PO는 Akka Actor
  • TO와 PO는 상태를 공유하지 않는 immutable 객체
  • 티켓은 Message
  • TO와 PO는 직접 통신하지 않고 주소를 이용한다.

Falt Tolerance

  • 메시징 구조에서 Sender는 항상 메시지 전송에 성공한다.
    • 메시지는 메일박스에 저장
    • 함수 콜에서는 X
  • 주소 기반이면 액터를 대체할수 있다.
    • 크래시된 액터는 런타임에서 교체 가능
    • 메일박스 메시지가 복구된 액터에게 전달(무중단)

FT 에서 유의할 점

FT는 오류를 격리 시켜서

시스템 크래시 수준을 전체에서 일부로 낮춰

시스템이 여전히 동작하게 하는것이다.

Akka strategy: Restart, Resume, Sop, Escalate

Let't it crash

Scale Up & Out

서버에서 실행중인 TA를 늘리거나 줄일수 있을까

Scale Out

주소를 이용해 메시지를 주고 받으면 Actor와 주소를 연결하는게 이슈

Actor는 통신중인 Actor가 로컬/리모트에 있는지 몰라도 된다.

ScaleUp

머신의 CPU와 메모리를 늘리는 방식이 아닌

Dispatcher와 Mailbox가 가벼운 Actor의 조합을 이용해 성능을 높인다.

with configuration 레이어

Actor Model

  • 1973년 매우 큰 문제 해결을 위해 Carl Hewitt, Peter Bishop, Richard Steiger에 의해 소개
  • 99.9999999% 안정성을 가진 스위치 AXD301을 Erlang으로 개발
  • 고가용성을 가진 확장가능한 시스템 개발이 가능한 모델

Actor,Address,Mailbox

  • Actor: 실제로 작업을 수행하는 단위
  • Address: ActorRef, 액터에 대한 참조값
  • Mailbox: Actor가 요청을 처리할수 있도록 전달한다.

Actor URI

akka://nils@kebne.kai.se:1234/user/poffice1/kiosk3

  • nils: actorsystem
  • /user : guardian actor
  • /poffice1: top level actor
  • /kiosk3: child actor

Actor Operations

  1. CREATE: 액터가 다른 액터를 만든다.
  2. SEND: 액터가 다른 액터에게 메시지를 보낸다.
  3. BECOME: 메시지에 따라 행위가 변한다.
  4. SUPERVISE: 하위 액터를 관리하고 모니터링 한다.

Akka로 개발하기

  • Akka 어플리케이션 == Actor
  • Actor를 JAR로 만들어서 배포

Akka in Action 샘플

  • git clone https://github.com/RayRoestenburg/akka-in-action.git
  • cd akka-in-action
  • cd chapter-up-and-running
  • sbt assembly

Supervision

  • Supervisor 계층구조
    • 액터는 다른 액터를 만들수 있다.
    • 차일드 액터를 만든 부모는 supervisor
    • 액터가 살아있는 한 supervisor는 변하지 않는다.
  • 위험한 액터는 가능한 하위에 놓는다.

stop vs PoisonPill

  • stop 은 현재 처리중인 메시지만 처리하고 나면 stop 메소드가 호출된다.
  • PoisonPill은 현재 메시지와 큐에 들어있는 메시지까지 모두 처리하고 나서야 처리된다. 좀 더 graceful 에 가깝다.

http://stackoverflow.com/questions/13847963/akka-kill-vs-stop-vs-poison-pill

Supervision vs Monitoring

  • supervision은 자신이 만든 자식 액터만 수행할수 있다.
  • monitoring은 어떤 액터든지 watch 하기만 하면 가능하다.

FT Strategy

  • OneForOne: 액터 하나에만 영향을 준다.
  • AllForOne: 모든 액터에 영향을 끼친다.

What is Futures

  • Futures와 Promise는 스칼라 2.10 이후 표준 라이브러리로 제공
  • Future는 블로킹이나 웨이팅없이 함수결과를 처리할 수 있게 해준다.
  • Future는 함수 결과를 담는 placeholder, 미래 시점에 결과가 담긴다.

Future 특징

  • 읽기 전용. 외부에서 변경할수 없다.
  • 스칼라 의 Future는 Java 래퍼가 아니다.
  • 파이프라인을 만들기 쉽다. 함수의 결과가 다른 함수의 입력이 된다.

Async가 Sync보다

빠른경우

Future Use cases

  • 함수 결과를 처리하려고 블록킹 하고 싶지 않을때
  • 함수를 호출하고 결과는 나중에 처리하고 싶을때
  • 많은 함수 호출 결과를 조합하고 싶을때
  • 함수 호출이 서로 경쟁하는 상황에서 가능한 빨리 응답을 받고 싶을때
  • 함수 파이프 라인

Akka 맛보기

By k16wire

Akka 맛보기

  • 1,753