Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

액터를 사용한 신뢰성있는 메시지 전송 전략


Info

수많은 노드로 규모를 확장하는것이, AKKA 메시지의 궁극적인 목표입니다.

여러분의 로컬에서만 실행되는 코드를 하나도 바꾸지 않고 분산시스템에서 실행되게 할수 있을까요?

짧게 답하면 '아니오' 입니다. 로컬과 원격의 환경차이를 그냥 추상화해서 없애 버릴수는 없습니다.

다음과 같은 무시할수 없는 네 영역이 있기때문입니다.

  • 지연시간: 노드사이의 네트워크를 통해 전송되는 지연시간을 예측할수 없습니다.
  • 부분실패: 분산 시스템을 이루는 각 부분을 항상 감시할수없으며, 각 부분이 제대로 작동하는지 알아내기가 어렵습니다.
  • 메모리접근: 로컬에서는 메모리 객체에대한 참조를 항상 얻을수 있지만, 원격 노드의 원격객체에대한 참조를 얻는 것은 어럽습니다.
  • 동시성: 원격노드를 조정하는 모든 권한을 가지는 주인이 없으며, 연산순서를 보장받기가 어렵습니다.


Local전송 Vs Remote 전송

 Actor는 Local처리(전송)과 Remote 전송하는 사용방법이 거의 동일합니다.

...

  • Remote의 경우 처리 대역폭에따라 네트워크 지연발생할수 있음
  • Local에서는 제한없는 메시지 크기가 Remote에서는 크기제한 필요
  • Remote의 경우 전송성능을 위해 TCP처리모듈, 바이너리데이터 해석을위해 Serialization 등의 모듈이 선택이가능합니다.(옵션선택사항)
  • Local에서의 전송장애는 실제 네트워크사용은 없기때문에 메모리(메모리풀)문제로 인해 발생할수 있으며, Remote의 경우는 네트워크 단절(Disconnect)에의해 발생할수 있습니다. 


Image resultImage RemovedImage Added


네트워크 전송을 위해서는 전송에서는 Serialization/Deserializtion 과정이 필요 과정을 통해 Object를 복원합니다. ( Object → Btyes → Object ) 

이기종간 개발 플래폼간에 메시지 클래스/구조체를 변환,복원하는 과정을 마샬링이라고도 합니다.


대표적 전송방법

  • at-most-once delivery ( 한번에 한번씩 배달 )
  • message ordering per sender - recceiver pair  ( 메시지 순서를 고려하여 작은단위 지속적 배달 )

...

이것은  Erlang에서 크게 성공을 거둔 기법입니다. ( http://erlang.org/faq/academic.html#idp32880720  - 10.9)

그림으로 살펴본 메시지처리의 거짓 추상화처리

Image Removed

메시지 전송 보장을 위한 추상화된 거짓처리란? :



Higher-level abstractions

AKKA의 메시지는 강력하고 높은 수준의 추상화를 제공합니다.풍전등화 앞 제국의 운명 적군과의 일전을 앞두고, 메시지 전달 보증을 위해 가짜전령을 썩어서 보냄

메시지 전송순서(Message Ordering) 보장

...

일반 메시지와 분리된 큐에서 작동을 하기때문에 이 둘의 메시지에대해서는 순서보장이 되지 않습니다.

Higher-level abstractions

AKKA의 메시지는 강력하고 높은 수준의 추상화를 제공합니다.

Messaging Patterns

안정적 메시지 전달요구사항에 대응이 가능해야합니다.

  • 개별 메시지를 식별하여 메시지와 응답을 연관시키는법
  • 시간내에 확인되지 않으면 다시보내는 재시도 메카니즘
  • 수신기가 중복을 감지하고 버릴수 있는방법

...

이벤트 소싱(및 샤딩) 은 커다란 웹사이트를 수십억명의 사용자 규모로 확장하는 아이디어이며

이아이디어는 매우 간답합니다. 액터가 처리가 될때 명령의 이벤트 목록을 생성하고 저장을 합니다.

이 계획은 이벤트만이 저장소에 추가되고 아무것도 변이되지 않는 점이며 

이를 통해 이벤트 스트림의 소비자를 완벽하게 복제하고 확장할수 있습니다. 

구성요소의 컴퓨터가 고장이나거나 푸시로기능중 손실되는경우 , 이벤트 스트림을 재생하여 쉽게 재구성합니다.

이벤트 소싱은 Akka.net 지속성(Persistence)에서 지원됩니다.  (  참고 소스 : http://getakka.net/articles/persistence/event-sourcing.html )

Mailbox with Explicit Acknowledgement

사용자 지정 사서함 유형 구현하면, 일시적인 오류처리를위해 

메시지 처리를 다시시도할수 있음


Dead Letters(전송실패 메시지)

전송시도후 어떠한 이유로 전송이실패가 될시, 전송실패의 이유를 최선의 노력으로 

...

보낸다거나할때 DeadLetter는 이러한 사실을 감지하게 됩니다. 여러가지 문제를 제거하여

디버그 출력 선명도를 제거할수 높일수 있지만,  데드레터를 피하려고 종료된 액터로 메시지전송을 일부러 

막는것은 송신자의 코드가 복잡해질수 있음으로 신중해야합니다. 

일반적으로 액터종료가 의도되는 사항이라면, 종료처리를 통해 이사실을 알리고 전송을 중단 시켜야할것입니다.

데드레터를 원격지에서 수신받을수 있는가?

데드레터는 네트워크를 통해 전달되지 않음으로, 한위치에 수집하려면 네트워크 하나당 액터를 구독하고

포워드를 하여야합니다. 또한 수신받는 원격지또한 지점간 네트워크 장애가 발생할수 있음으로

해당 데드레터를 수신받지 못할수도 있습니다.

데드레터가 항상 나쁜것은 아니다.

Actor가 자신의 결정에의해 종료되지 않을때, 자신에게 보내는 일부 메시지가 손실될수 있습니다.

어떠한 Actor(ActorA)의 계층구조를 멈추어야할때, 부모 Actor가 소멸시 자신의 Child Actor(ActorB) 를 알수있으며

데드레터를 통해 ActorB에게 메시지를 보내는 다른 액터(ActorC) 를 멈출수가 있습니다물론 ActorC가 ActorB가 소멸될시 (종료요청) 스스로 작동을 멈출수도 있는 전략 선택의 문제입니다.