You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

Akka의 장애허용시스템을 이해하고 활용하기 위한 관련 자료정리~


장애허용시스템 - 위키피디아


링크 : https://ko.wikipedia.org/wiki/%EC%9E%A5%EC%95%A0_%ED%97%88%EC%9A%A9_%EC%8B%9C%EC%8A%A4%ED%85%9C

결함 감내 시스템(Fault tolerant system)은 시스템을 구성하는 부품의 일부에서 결함(fault) 또는 고장(failure)이 발생하여도 정상적 혹은 부분적으로 기능을 수행할 수 있는 시스템이다. 결함감내 시스템은 부품의 고장이 발생하면 부분적인 기능을 사용할 수 없게되며, 계속적으로 부품의 결함이나 고장이 발생하면 점진적으로 사용할 수 없는 기능이 증가하며, 치명적인 결함이나 고장이 발생하면 시스템이 정지한다. 이런 측면에서 결함감내 시스템은 graceful degradation (단계별 성능저하) 특징이 있다. 장애 허용 개념이 고려되지 않은 일반 시스템에서는 부품에서 사소한 결함이나 고장이 발생해도 시스템의 동작이 정지된다.

> 이중화(Fault-tolerance by replication) 시스템도, 장애 허용시스템 전략중 하나입니다.


예외 처리기특성


예외처리는 장애지점 개선을 위해 친절하고 우아한 로그처리기에서 중요하게 도움될수 있으며  

장애지점 파악을위해 예외처리는 중요지만 예외처리가 곧 장애처리기라는 맥락과는 다를수 있습니다. 

예외(Exception)가 모듈처리 장애를 방지하거나, 예외처리를 스마트하게 모두(실제는 모두하기 어렵습니다.)하여 장애방지에 어느정도 도움이 될수 있지만

재시도와같은 복구기능을 예외처리기를 통해 작성하게 될시 우하하지 않는 코드를 작성하게 될 가능성이 많으며, 예외처리기는  다음과 같은 한계가있습니다.

  • 호출자(일반적으로 자식노드)에게 책임을 계속 떠넘기는 콜스택 구조이며, 그 누구도 예외처리를 하지 않는다고하면 작동이 멈출수 있습니다.
  • 복구를 할수 있는 지점에는, 콜스택에의해 복구를 위한 정보가 없을 가능성이 높습니다. 복구를 위해 중요한 보안정보(DB접속정보와같은)를 예외발생 정보에 담을수 있지만 보안설계의 원칙을 깰수있습니다.


예외처리 전략 참고자료 : https://www.slideshare.net/dhrim/ss-2804901


예외처리기를 통한 복구방안은 한계가 있으며 ,  그 대안으로 관리감독 전략이 필요하다란것입니다.

관리감독(Supervisor)을 통한 복구전략은 Erlang에서 영향을 주었으며. 다음 자료(원문)를 통해 알수 있습니다.

Erlang Supervisor


https://www.erlang.org/doc/man/supervisor.html


Erlang에서 영향받은 Supervisor의 특징과 복구전략을 몇가지 살펴보겠습니다.

Supervisor 특징


  • 부모가 자식의 생성을 책임진다. - 호출자에게 책임을 떠넘기는 구조가아닌, 부모가 책임을 지는 구조입니다.
  • 자식이 잘못 되었을때, 부모 즉 감독자가 알수있다. -모니터링
  • 부모는 자식의 생성방법(생성자의 옵션)을 알고 있기때문에, 자식를 생성할수 있는 정보를 가지고 있습니다. - 계층구조 


장애처리 전략 분리


AkkaSystem의 Actor는 부모가 자식을 생성하는 , 계층(hierarchies) 구조로 자식노드의 관리감독이 가능합니다.
샘플코드 : https://getakka.net/articles/actors/fault-tolerance.html

장애복구 전략은, 도메인 기능이 정지될때 어느정도의 영향도가 있냐에 따라 각각 다른 복구 전략을 선택할수 있습니다.

OneForOne / RestForOne

AllForOne

하나가 망가져도 나머지가 그 역활을 하는경우( 또는 하나가 망가지면 그역활을 할수
있는 녀석이 없는경우)

  • 그냥 놔둔다. ( 그 역활을 할수 있는 녀석이 있는 경우 )
  • c1죽은 기능을 살리려노력한다. ( 없는 경우 )

하나라도 망가지면 완전한 역활을 못하는경우

  • c3죽은 기능을 살리려 부분 노력한다.
  • b3 하위 전체를 리셋한다.


장애처리 코드 샘플

예외의 종류에따라, 복구(재개,재시작,중지,탈출) 전략 선택가능


        protected override SupervisorStrategy SupervisorStrategy()
        {
            return new OneForOneStrategy(
                maxNrOfRetries: 10,
                withinTimeRange: TimeSpan.FromMinutes(1),
                localOnlyDecider: ex =>
                {
                    switch (ex)
                    {
                        case ArithmeticException ae:
                            return Directive.Resume;
                        case NullReferenceException nre:
                            return Directive.Restart;
                        case ArgumentException are:
                            return Directive.Stop;
                        default:
                            return Directive.Escalate;
                    }
                });
        }

더 자세한 내용 : Fault Tolerance



  • No labels