Akka는 오픈 소스 툴킷으로, JVM(SCALA,JAVA) 에서 동시성및 분산 처리를 단순화하는 런타임(툴킷)이다.
.Net 버전으로 포팅된것이 Akka.net 이며, MS는 이러한 컨셉을 다시 재창조하여  Orleans 으로 정립을 하였습니다.

이 공간은 닷넷 Core Api 3.x 에서 Akka를 활용하는 다양한 변종 실험을 하는 공간입니다.

참고 Links :


AKKA를 이해하기 위한 사전 요구 지식



목차및 Preview


AKKASYSTEM

주요특성

  • 어플리케이션은 하나의 AKKA SYSTEM을 가질수있다.

    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

    이장에서 추가적으로 알게되는것

    1. 단순한 문자열이 아닌 객체를 전송하는 방법 ( 자동 시리얼라이즈가 됩니다. )
    2. 액터를 스레드프로그래밍없이 확장하고 분배하는방법 ( 대표적인 라운드 로빈풀을 샘플로 사용하였으며,다양한 라우터를 활용할수 있습니다.)

    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초이내에 인입을 할것입니다.

    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 유틸리티를 통해


    기원

    통신 이론(Communication theory)은 통신을 효율적 하는 방법에 관한 이론이다. 정보를 오류없이 전송하는 것이 목적이다.

    언랭의 이름은 통신이론을 연구하는 덴마크 수학자 "Agner Krarup Erlang" 에서 따온것이다.

    언랭에 적용된 통신이론은 구체화되고 성공을 거두었으며( 병행성 처리를 함수형 패러다임을 성공시킨것 포함)

    AKKA를 비롯하여,Kafka의 핵심인 Message Deivery Once에도 영향을 주었다고 볼수 있습니다. 

    Akka VS Orleans


    두 스펙은 거의 유사하다고 볼수 있으며 여기서 소개되는 기능(툴)에대한 것들은, 해당 툴킷에서 먼저 고안이 된것은 아니며

    다양한 이론(언랭,이벤트중심설계,도메인주도설계,마이크로서비스설계등)의 영향을 받아

    모던한 메시징 시스템이 필요한 컨셉을 지속적으로 개선하고 추가하고 있으며

    개발자가 직접 그것을 활용하여 단순하게 구현할수 있는 툴킷을 제공 해줍니다.

    Lightbend(구.TypeSafe)라는 회사에의해

    Scala,Akka등이개발되고 유지되고 있습니다.

    제공되는 컨셉이 유사하며,라이브러리가 제공하는 컨셉과는 별개로

    오늘날 분산 처리 컴퓨팅에서 해결해야할 문제가 유사함을 알수있습니다.


    공통된 주제가, 메시지를 전송보장을 위해 어떻게 영속화 할것인가? ( Persistence )

    전통적인 CRUD 를 탈피하여 이벤트 소싱 또는 CQRS를 사용할것인가? 

    MSA에서 필요로하는 자체 메시징 시스템과, 도메인 주도 설계(DDD)에서 이야기하는 여러가지 작동가능한 구현체에 대해 살펴볼수 있습니다.

    구현체없이 아키텍트만 난무하는 클라우드 시대에 아키텍쳐 능력을 끌어올리는데 도움 될수 있습니다.

    이것은 꼭 AKKA가 아니여도 됩니다.  CLOUD-SASS를 이용하더라도 이러한 구현체에 사용되는

    OpenToolKit(OpenStack) 을 통한 구현능력은 분명 영양분이 될것입니다.






    • No labels