Page History
Info |
---|
AKKA System은 수많은 Router전략을 지원하지만 L7,Haproxy 를 대체하는 솔류션및 시스템이 아닙니다. 또한 고성능 Data 메모리 처리를 위해 메모리유지 기술을 지원하지만 Redis를 대체하는 시스템도 아닙니다.. 실시간 분산처리를 위해 Cluster-샤딩을 지원하지만 하둡을 대체하는 분산 저장 기술도 아닙니다. 다양한 통신메카니즘을 사용하지만 사용자에게 제공하는 RESTAPI 를 대체하는 프로토콜도 아닙니다. 도대체 이것을 어디다 쓸고? 고민을 해보겠습니다. 자신이 설계한 API가 10노드로 구성했다고 가정했을때 DB또는 외부 API만을 통해 사용자하고만 대화를 할수 있다란것은 아주 큰 개발 제약입니다. NODE1-API 에서 발생한 일을, 자신이 설계한 NODE2-API 또는 동료가 설계한 API와 DB의존없이 실시간으로 대화 할수있는것만으로 어떠한 부분에 대해서는 새로운 서비스를 창출할수가 있습니다. 이러한것을 구현하기위해 직접 커스텀한 로직을 작성해야하며, AKKA는 어떠한 서비스도 제공해주지 않습니다. 고성능 분산서비스 개발을 지원하며 ,주로 서비스내에 특화된 분산처리를 전송 지원하는 개발툴킷입니다. 쉽게 설명하면, 기존 서비스를 처음부터 설계할수도 있지만 동일 개발 프레임워크내에서(자바/C#) 탑재가가능합니다. 그리고 결정적으로 KAKA와 같은 메시징큐 시스템을 대체하는 용도도 아닙니다. AKKA STREAM을 활용하여, 그에준하는 스트림기를 탑재하여 고성능 메시지를 내부 어플리케이션에서 더 유연(액터모델활용)하고 빠르게(논블럭) 처리하는데 그 목적이 있습니다. |
간단한 AKKA 시스템 구성도
AKKA SYSTEM이란? : Actor를 통해 대화할수 있는 Node,또는 그것이 계층적으로 표현이되는 단위
고급 API 설계
Rest Model과 연동되어, 고급(스케일 업다운/클러스터) API를 설계를한 케이스입니다.
AKKA는 클러스터/분산처리를 단순화할수 있는 툴킷이지만,
무엇을 사용하던 낮은 복잡도와 높은유연성을 동시에 유지하면서 규모를 확장하는것은 어려운 일입니다.
이것은 AKKA의 문제가 아니라, 개발팀 내부에서 이미 고려하지 않거나 이미 포기한 문제일 가능성이 높습니다.
AKKA를 가지고 성공한 플래폼으로 만드는것은 불가능한것이아니라,대용량 분산처리는 어떠한 툴킷을사용하더라도 어려울수 있습니다.
AKKA가 모든 서비스환경에서 만능 해결사가 될수없으나, 분산환경에서의 동시성 문제를 어떻게 풀려고하고 단순화 하는지?
제시한 제안 모델은 분명 좋은 모범사례가 될것입니다.
Intro
리모트,클러스터,샤딩,퍼시던트등 다양한 메시지모델및 분산처리를 AKKA를 이용하여
단순하게 개발가능 ( 단순하다고 쉽단게 아니며, 기존엔 복잡성으로 개발 접근하기 어려웠던것을 단순화 하였다는 의미입니다.)
Akka로 할수 있는것들
Rest Model과 연동되어, 조금더 풍성한 API를 설계를한 케이스입니다.
link:http://www.aaronstannard.com/markedup-akkadotnet/
Akka를 이용한 개인진행 저장소 : https://github.com/psmon/psmonSearch/blob/master/README.md
Actor란 무엇인가?
Thread VS Actor
장애처리 모델(Supervision)
try-catch는 메시지 전송및 구조적 모델에서 적합하지 않는 예외 처리모델입니다.
흐름을, 부자연스럽게 중단하기 때문이며, 실제 서비스코드의 복잡성이
증가하면 예외처리지점을 파악하기 힘들뿐더러, 예외처리코드가 서비스 코드를 역으로
복잡하게 만드는 결과를 가져옵니다.
또한 스택구조인 예외처리는 호출자(자식)에게 책임을 떠넘기는 문제가 있으며
스택의 마지막에는 중요한 정보가 없음으로 재시도할수 있는 정보가 없을수 있습니다.
Akka에서는, 장애허용이라는 몇가지 장애 처리 모델을 지원하고 있습니다.
장애처리 모델(Supervision)One-For-One Strategy vs. All-For-One Strategy
c1의 기능이 죽더라도, c2의 기능에의해 전체적인 기능에 문제가 없을시
c1을 다시 살릴지? 말지? 다시 살린다고하면 몇번을 시도할지? 설정화가 가능합니다.
c3에 문제가 있을시, b3 그룹기능에 문제가 있다고 하면.. c3를 살리려는 노력을
해야합니다. 이때 c3를 살리려는 노력이 실패로 돌아가면 b3를 재시작하는
복구전략을 설정화를 통해 복구 전략이 가능합니다. 이것이 아카에서 이야기하는
응용개발자가 복구전략을 직접 설계하게끔 하는 복구력입니다.
link : http://getakka.net/articles/concepts/supervision.html
OOP VS Actor
Remote Test
Server Config
akka {
remote {
log-remote-lifecycle-events = DEBUG
log-received-messages = on
helios.tcp {
port = 9000 #bound to a specific port
hostname = 127.0.0.1
}
}
Server Code Sample
public class MyActor : ReceiveActor
{
public MyActor()
{
Receive<string>(message => {
Console.WriteLine("Received String message: {0}", message);
Sender.Tell("re:"+message);
});
Receive<List<int>>(message => {
Console.WriteLine("Received ListCount: {0}", message.Count);
Sender.Tell("re:" + message);
});
}
}
using (ActorSystem system = ActorSystem.Create("MyServer", config))
{
system.ActorOf<MyActor>("greeter");
Console.ReadKey();
}
Client Code Sample
var greeter = system.ActorSelection("akka.tcp://MyServer@localhost:9000/user/greeter");
var result = greeter.Ask("Hi2", null).Result; //Wair For Result
Console.WriteLine(result);
List<int> tmpList = new List<int>();
greeter.Tell(tmpList); //Just Tell...
BroadCast Test
Server Code Sample
var system = ActorSystem.Create("ServiceB")
system.ActorOf<TestActor>("b1");
system.ActorOf<TestActor>("b2");
system.ActorOf<TestActor>("b3");
Client Code Sample
provider = "Akka.Remote.RemoteActorRefProvider, Akka.Remote"
deployment {
/some-group {
router = broadcast-group
routees.paths = [
"akka.tcp://ServiceB@127.0.0.1:8002/user/b1",
"akka.tcp://ServiceB@127.0.0.1:8002/user/b2",
"akka.tcp://ServiceB@127.0.0.1:8002/user/b3"]
}
}
var props = Props.Create<TestActor>().WithRouter(FromConfig.Instance);
var broadCaseActor = system.ActorOf(props, "some-group");
broadCaseActor.Tell("HI");
RoundRobin Test
Config Sample
akka.actor.deployment {
/some-pool {
router = round-robin-pool
nr-of-instances = 5
}
}
ConsistentHashRouter Test
Message Sample
public class SomeMessage : IConsistentHashable
{
public Guid GroupID { get; private set; }
public object ConsistentHashKey { get { return GroupID; } }
}
Config Sample
akka.actor.deployment {
/some-pool {
router = consistent-hashing-pool
nr-of-instances = 5
virtual-nodes-factor = 10
}
}
ScatterGatherFirstCompleted Test
Config Sample
akka.actor.deployment {
/some-pool {
router = scatter-gather-pool
nr-of-instances = 5
within = 10s
}
}
SmallestMailBox Test
Config Sample
akka.actor.deployment {
/some-pool {
router = smallest-mailbox-pool
nr-of-instances = 5
}
}
Persistence Test ( Memory DB,Local DB )
Persistence모듈은 메모리DB인 redis기능 자체를 모두포함하는 기능은아니며
다양한 라우팅 전략 사용가능
로컬에서던 원격에서든 동시성 처리를 위한 분산처리를 라우팅이라는
동일한 방식을 사용하며 멀티프로그래밍을 직접하지 않습니다.
BroadCast
RoundRobin
Persistence ( 유지성 )
메모리는 빠르지만, 저장용량의 한계와 휘발성의 문제로 중요한 서비스모델에해당하는 DATA를
오랫동안 가지고 있는상태에서 안정적으로 처리하는 모듈을 작성하기란 어렵습니다.
Persistence모듈은 고성능 유지 처리를 위해 Actor의 상태를 메모리에서 변경하고 유지하는 모듈로
메모리DB인 Redis와 목적이 유사하지만 , 단순하게 key base(NO SQL) 로 접근하고 저장하는 기술은 아닙니다.
데이터의 Actor의 상태를 좀더 추상적(FSM디자인패턴)으로 관리하고 유지함으로, 서비스특화된 고성능 메모리DB를 구현하는데 의의가 서비스 특화된 고성능 서비스 모델을 설계 할수가 있습니다.
활용사례 link : http://getakka.net/articles/persistence/persistent-fsm.html
역활별 저장 지원 모듈
In-memory journal plugin.
akka.persistence.journal.inmem {
-메모리 저장공간(고성능 Data상태 처리 목적)
In-memory snapshot store plugin.
akka.persistence.snapshot-store.inmem {
# Class name of the plugin.
class = "Akka.Persistence.Snapshot.MemorySnapshotStore, Akka.Persistence"
# Dispatcher for the plugin actor.
plugin-dispatcher = "akka.actor.default-dispatcher"
}
Local file system snapshot store plugin.
akka.persistence.snapshot-store.local {
-메모리 스냅샷을 관리(복구력)
Local file system snapshot store plugin. -메모리의 휘발성에 대비(업데이트 포함 서버다운 대응,임시백업)
Cluster-sharding
메시지를 실시간 분산처리 할수가 있습니다.
-스케일아웃을 위한 분산 메시지 전송 기술로, 클러스터 설정과, 메시지에서 분산 해시키를 지정하여 간단하게 이용가능합니다.
-맵리듀스를 통해 DB화되나? 하둡과 같은 순수 분산 저장기술이 아니며,영구적인 저장이 필요하면
로컬저장소를 작성하고 모두 설계 가능하나, DB저장기술은 AKKA의 스펙이아니며 보통 잘 연동하는데 집중하는것이 좋습니다.
참고 : https://krishnasblog.com/2012/11/11/scalatest-a-mapreduce-using-akka/
cluster-shardinglink : https://petabridge.com/blog/introduction-to-cluster-sharding-akkadotnet/
Java와 이기종통신
AKKA의 태생은 JAVA로부터 왔기때문에, .net에서 Actor기반 메시지 설계가 가능하다면
JAVA에서도 동일한 컨셉으로 구현이 가능합니다. 이기종간 Actor메시지 전송을 기대해보지만 아직 미지원으로 확인되었으며
이경우 웹소켓중간 인터페이스를 경유해 이기종 고성능 통신이 가능합니다.
플래폼 파편화에 따른 저수준의 순수한 고성능 이기종 통신이 필요하다면 JnBridge 도입 검토도 해볼 필요가 있습니다.
link : http://git.interparktour.com/N17042/AKKATEST/snippets/7
실시간 이기종통신(타 개발플래폼과 데이터교환)
AKKA는 이기종통신을 직접 지원하지 않습니다.
순수하게 동일 플랫폼에서 작성되어진 액터 메시지 전송을 통해 대부분의 문제를 해결하는게 이상적인 시나리오이나
액터에 그러한 제한은 없습니다. 액터를 외부 클라이언트 모듈과 연동을 하여, 서비스내에서는 일관된 인터페이스(메시지전송)
로 사용하시면 됩니다.
대부분 고성능 메시지 처리설계는 AKKA 자체 에서 가능 합니다. 하지만 다음과 같은 시나리오를 생각해봅시다.
- A: .net을 이용중이지만, 쓸만한 한글 형태소 분석기는 JAVA에만 있다.
- B: kafka / rabitmq 같은 메시지 처리기를 ,부가적인 기능으로 활용 사용하고 싶다.
다음과같은 방식으로 이기종간(혹은 타 플랫폼) 통신문제를 해결해야합니다.
- A: JAVA 로 직접 작성하고 웹소켓을 제공합니다. 사용처인 .net에서는 WevsocketActor 를 연결하여 형태소분석기를 사용합니다.
C#에서 한글형태소분석기를 직접 구현하는것보다, JAVA에서 어떠한 엔진을 가져오고 JAVA에서 스트리밍을 열어주는게 훨씬 이득입니다.
JAVA에서도 동일하게, 어떠한 엔진이 C#진영에만있다고하면 반대로 이용하면 됩니다. - B : 각 솔류션이 제공하는 실시간 스트리밍 클라이언트 모듈을 Actor와 연결하여 사용합니다.
- C: ReactiveStream을 준수하는 AkkaStream이 지원하는 연결기를 활용합니다. Alpaaka 의 목표는 모든 타이기종 스트림기를 Akka와 연결하는것입니다.
관련된 몇가지 참고자료
타 개발 플랫폼간 메시지 전송:
link2 :- Websocket을 Actor와 연결하여 Websocket을 제공 (
- )
- JAVA JNI를 통해 JAVA ↔ CLR 연결
- JNBridge를 Actor와 연결 (
Akka를 이용한 머신러닝으로 확장(텐서플로우 대체 플래폼은 아님)
AKKA는 텐서플로우 대체 플랫폼도 아니며 AI전용 플랫폼도아닙니다.
네트워크 라이브러리가, 어떻게 머신러닝으로 확장가능한지? 심화학습을 하는데 목적이 있습니다.
link :- )
- 또는 이기종통신에 특화된 어떠한 메시지큐 서비스를 사용함 (Kafka,RabbitMQ등)
Actor Stream을 통해 :
- kafka - http://
link : http://www.cakesolutions.net/teamblogs/lifting-machine-learning-into-akka-streams
- © 2017 GitHub, Inc.
이 문서 검색
Livesearch | ||
---|---|---|
|
인기있는 주제
Popular Labels | ||||
---|---|---|---|---|
|
특별 페이지
Content by Label | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
- doc.akka.io/docs/akka-stream-kafka/current/home.html
- rabitmq - https://blog.scalac.io/2014/06/23/akka-streams-and-rabbitmq.html
- Alpakka - https://doc.akka.io/docs/alpakka/current/index.html
필자가 SCALA로 작성한 웹소켓을 통한 형태소 분석기 서비스(with 꼬꼬마)
Akka를 머신러닝에서 활용
액터모델은 머신러닝의 파이프라인의 요소로 활용할수 있습니다.
Akka는 주로 대용량 메시징 툴킷으로 AI와는 큰 상관이없으나 액터모델,AkkaStream이
데이터 전달및 연산용도로 활용될수 있습니다.