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
- CREATE: 액터가 다른 액터를 만든다.
- SEND: 액터가 다른 액터에게 메시지를 보낸다.
- BECOME: 메시지에 따라 행위가 변한다.
- 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