Akka는 오픈 소스 툴킷으로, JVM(SCALA,JAVA) 에서 동시성및 분산 처리를 단순화하는 런타임(툴킷)이다.
.Net 버전으로 포팅된것이 Akka.net 이며, MS는 이러한 컨셉을 다시 재창조하여 Orleans 으로 정립을 하였습니다.
이 공간은 닷넷 Core Api 3.x 에서 Akka를 활용하는 다양한 변종 실험을 하는 공간입니다.
참고 Links :
- https://github.com/psmon/AkkaForNetCore : .net core 3.x 에서 호환가능한 유용한기능작동 검증을 먼저한후,
이 공간에서 문서화가되고 있습니다. 코드는 지속 개선되고 있음으로, 실제 활용시 Git을 참조하는것이 권장됩니다. - https://www.slideshare.net/sangmanpark1/akka-play-with-netcore : Akka.net 소개
- https://github.com/psmon/AkkaDotModule : 실험이 완료된 AKKA의 기능을 , NetCore에서 사용성이 쉽게 모듈화를 하고 있습니다.
AKKA를 이해하기 위한 사전 요구 지식
목차및 Preview
AKKASYSTEM
주요특성
|
---|
Development Environment for AkkaNetCore
AkkaNetCore(본 프로젝트명)의 개발환경은 다양한 활용 오픈스택(mysql,kafka등)을 도커로 정리하였으며
듀토리얼은 유닛테스트화 되어 있어, 코드로 작동방법을 설명하고 셀프 검증합니다.
로컬 개발환경은 Visual Studio IDE에서 벗어날 필요가 없습니다.
Actor Pattern
액터는 매우 가벼운 동시성 엔터티들이다. event-driven receive loop를 이용하여 비동기적 메시지를 처리한다.
동시 처리성을 높이려면 Dispatcher 를이용 ,분산처리 확장은 Cluster가 활용될수 있으며 로컬용으로 작성된 개발방법이 크게 달라지지 않습니다.
AKKA는 액터를 전반적으로 활용하기때문에 액터패턴에 대한 컨셉을 먼저 살펴보겠습니다.
AKKA Setting For NetCore
.NET Core 3.1 API 에 Akka.net을 탑재하여 기본적인 액터를 생성하여
메시지 전송을 해보겠습니다. 액터의 라이프 사이클관리는
Core DI 를 활용하여 단순하게 사용 할수도 있으나, Akka는 Top-Level Architecture로 훨씬더 진보될수 있습니다.
First Actor
이장에서 추가적으로 알게되는것
- 단순한 문자열이 아닌 객체를 전송하는 방법 ( 자동 시리얼라이즈가 됩니다. )
- 액터를 스레드프로그래밍없이 확장하고 분배하는방법 ( 대표적인 라운드 로빈풀을 샘플로 사용하였으며,다양한 라우터를 활용할수 있습니다.)
ActorSelection
이 장을 통해 추가적으로 알수 있는것
- 액터를 선택하고 통신을 할수 있는 방법 ( actor ref vs actor selection)
- 결과처리를 기달려야하는 경우와 아닌 경우 ( tell or ask)
Performance with router
이장을 통해 알수 있는것
- 라우터와 라우티의 차이
- 그룹과 풀의 차이
MailBox
Actor메시지는 일반적으로 보낸순서에의한 순서가 보장이 되지만 MailBox의 경우 동시에 보낸 메시지중
우선으로 처리해야할 메시지에대해 정의가 가능합니다.
덜바쁜 녀석에게 작업을 분배한다던지, 메시지 자체에 우선순위를 높일수 있습니다.
AtLeastOnceDelivery
메시지 전송은 성공 여부체크와 재전송여부에 따라 한번만전송,적어도한번만전송,정확하게 한번만 전송
3가지로 분류할수 있습니다. 정확하게 한번전송은 프로토콜이 책임지지 않으며 개발자가 직접 설계에 반영해야합니다.
여기서는 적어도 한번만 전송하는 제공된 액터를 활용하여, 정확하게 한번 전송을 하려고 노력하는 메시지 액터를 설계해봅니다.
EventSourcing
메시지가 발생할때 명령의 이벤트 목록을 생성하고 저장을 합니다.
이 계획은 이벤트만이 저장소에 추가되고 아무것도 변이되지 않는 점이며
이를 통해 이벤트 스트림의 소비자를 완벽하게 복제하고 확장할수 있습니다.
Dispatcher Vs Thread
이장을 통해 알게되는것
- 액터의 성능 전략을 다르게 할수있으며, 코드의 변경없이 설정(튜닝)만으로 가능
- 성능을 위한 스레드풀 선택
- Using Dispacher
이장을 통해 추가적으로 알게 되는것
- 액터에 고급 스레드 프로그래밍에서 사용되는 튜닝 옵션 사용하기
- 액터의 성능을 각각 다르게 설정하기
UnitTest For Actor Message
언어와 상관없이 모던한 개발 프레임워크 템플릿들은 유닛테스트를 기본적으로 포함하고 있습니다.
자신이 작성한 서비스 코드에 대한 유닛테스트가 없다고하면 , Nunit/xUnit 중 적합한 유닛테스트를 먼저 선택을 해야하며
OOP가 반환하는 값을 블락킹하여 검사하것이 아닌, 다양한 경로로 흘러가는 비동기 메시징을 검사하는 새로운 패턴을 알아보겠습니다.
Real time performance counters
어플리케이션에서 생성하는 정보를 분석하고,모니터링 하기 위해서 다음과 같은 방법을 가장 많이 사용합니다.
- 로그를 적재한다. ( Nlog,Log4j등등 모듈)
- 로그를 통합한다. ( 엘라서틱 로그 스태쉬)
RemoteActor
지금까지 로컬에서 액터를 만드는 연습을 하였다고 하면, 이번 장에서는
자신의 로컬 객체가 어떻게 코드변경을 최소화하고 두개의 분리된 어플리케이션이 액터를 통하여 고성능 통신을 할수 있는가 살펴보겠습니다.
리모트 객체만으로도 액터는 휼륭한 기능들을 수행하지만, 클러스터로 가기위한 워밍업을 위해 리모트 객체의 이해는 필수입니다.
Cluster with Actor
Akka에서의 분산처리 클러스터의 최종 목표는, 외부 클러스터 시스템을 이용만 하는것이 아닌
단일지점 병목지점이 없는 확장가능한 시스템을 직접 구현하는것입니다.
외부 시스템을 그냥 사용하는것이 때로는 효율적일수 있지만, 직접 구현해보는것은 클러스터 시스템을 이용하는데 있어서 도움이 될것입니다.
- SingleTon Cluster Actor
시스템내에 유일한 단일 객체로 제약을 걸때 싱글톤은 유용하게 사용 되어왔습니다.
분산처리 컴퓨팅에서 싱글톤이란, 여러가지 클러스터로 구성된 동등한 어플리케이션에서
클러스터내에 단 하나만 필요한 기능만 수행할수 있습니다.
- BulkInsert with ORM
앞장에서 싱글톤 클러스터를 이용하여, 무수히 발생하는 이벤트를 액터 메시지로 모아서 데이터 인입에 성능 효율을 올려보았습니다.
데이터 인입 성능 효율을 위해 사용된 ORM 벌크 인서트를 자세하게 살펴보겠습니다.
벌크 인서트는 10만개의 데이터를 단 5초이내에 인입을 할것입니다.
- BulkInsert with ORM
Stream - ThrottleActor
오늘날 우리가 인터넷에서 서비스를 사용하는 방식은 데이터 전송을 비롯한 많은 스트리밍 데이터 인스턴스를 포함하고 있습니다.
그것이 다운로드 서비스이든,영화스트리밍 서비스이든 대용량의 데이터를 우리의 어플리케이션이 가진 메모리와 네트워크대역으로는
순간적으로 처리할수가 없습니다. 스트리밍은 항상 생산자와 소비자로 구분되어 있으며 어떻게 생산자와 소비자의 다양한 속도차이를
- Kafka with Stream
AkkaStream의 조절기를 통해 유입량 조절을 하는것을 앞장에서 살펴보았습니다.
이 Stream장치에 Kafka의 입출력(생산,소비)을 연결이 가능하며 Reactive Stream을 준수합니다.
스트림 처리는 블락이 없어야하며, 유연하게 흘러야 하기때문에 그에 준하는 스트림 시스템에 연결하는것이 효과적입니다.
Fault Tolerance
장애허용 시스템은 시스템을 구성하는 부품의 일부가 결함이있을때 정상혹은 부분적으로 작동가능한 시스템이다.
예외처리방식에서 사용하는 복구방법과 어떻게 다른지? 액터의 감독자(SupervisorStrategy)기능을 통해 살펴보자
Link : 장애허용시스템
LoadTest
분산처리가능한 API호출을 하는 로드 테스트기를 만들어보자클러스터의 이해가 없어도, API호출 구현체만 작성하면 바로 활용가능하며
로드테스트 팀이있고, 툴을 구매할수 있으면 LoadRunner같은 전문 퍼포먼스 툴사용이 권장되나
이 문서의 목적은, 그럭저럭 쓸만한 분산처리 가능 심플 로드 테스트기를 직접 설계하고 구현해보는것입니다.
ActorUtils
- ActorScheduler By Quartz
스케쥴러에의해 특정 액터용 메시지가 반복발생 시킬수 있는
트리거 장치를 알아보겠습니다.
기본 액터 스케줄러
EventBus
메시지 처리패턴의 한가지인 이벤트버스는, 다양한 메시지 큐시스템이 대부분 지원하며
채널별 메시지 발행(Publish)/구독(SubScribe) 기능을 가지고 있습니다.
Akka에서는 EventStream을 활용한 EventBus 유틸리티를 통해