본문 바로가기
프로그래밍/golang

concurrency in go(4)

by 나도한강뷰 2023. 1. 6.

5장. 확장에서의 동시성

더 큰 사이즈의 확장된 시스템에서의 동시성을 잘 활용하기 위해서는 다음과 같은 부분을 신경쓸필요가 있다.

  1. 에러전파
  2. 시간 초과 및 취소
  3. 하트비트
  4. 복제된 요청
  5. 속도 제한
  6. 비정상 고루틴의 치료

1.에러전파

  • 분산시스템은 문제가 발생하기 쉽고, 문제의 원인을 쉽게 파악하기 어렵다.
  • 그렇기 때문에 동시성 프로그램에서의 에러전파는 중요한 문제이다.
  • go의 특성상 사용자가 호출 스택의 모든 프레임에서 에러를 처리하도록 강제하고있다.
  • 에러에 들어가야될 정보
    • 발생한 사건: 에러의 유형 정보
    • 발생한 장소 및 시점: 에러의 발생 장소 및 시간
    • 사용자 친화적인 메세지: 위의 2가지정보를 간략하면서도 유의미하게 표현
    • 사용자가 추가적인 정보를 얻을 수 있는 방법: 로그에 상호 참조될수 있는 id등을 제공
  • 이러한 정보없이 전달되는 에러는 실수이며 버그이다.
    • 버그는 정의하지 않은 에러 또는 raw상태의 에러이다.
  • 하위구성요소부터 상위로 올라가면서 적절하게 에러를 감싸야된다.
    • 왜냐면 하위구성요소에서는 충분한 설명이 상위에서는 충분하지 않은 에러의 정보가 될 수 있기 때문이다.
    • 에러를 감싸면서 중요하지 않은 저수준의 세부 정보를 숨기는것도 행위에 포함될 수 있다.
  • todo 예제코드 분석

2.시간 초과 및 취소

  • 동시성 작업시 timeout이나 cancellation이 자주 발생한다.
  • 시간초과의 발생의 이유
    • 시스템 포화:
      • 대기중인 요청이 오랜시간 후에 처리되는 것보다 시간 초과되는 것을 원할 수 도 있다.
      • 시간초과 되어도 요청이 반복될 가능성이 낮은경우
      • 리소스가 부족한 경우
      • 시간이 지날수록 전송중인 데이터의 필요성이 낮아지는 경우
    • 오래된 데이터:
      • 데이터에 처리되어야만 하는 시간이 있는경우
      • context.withdeadline, context.withtimout으로 제어하면 좋음
    • 데드락을 막으려는 시도:
      • 무조건 재부팅을 통해서만 시스템을 복구하는 데드락보다 복구가 가능한 라이브락이 낫다.
  • 취소의 발생의 이유
    • 시간 초과:
    • 사용자 개입:
      • 사용자가 시작한 작업을 취소할 수 있도록 허용하는 것
    • 부모 프로세스의 취소:
      • 부모가 멈추면 자식은 취소가 된다.
    • 복제된 요청:
      • 여러개의 복제된 요청일 경우, 최초의 응답이 돌아오면 나머지 프로세스를 취소하고자 한다.
  • 우리가 고려해야되는 것:
    • 동시 프로세스의 선점 가능성(preemptability)
    • 고루틴 내부에 정말 오래걸린꺼같은 작업이 있다면, 그 작업이 진행중일때는 취소 명령을 보내도 실제 취소가 될때까지 많은 시간이 걸리게 된다.
    • 그렇기때문에 동시 프로세스가 선점될 수 있는 기간을 정의하고 그보다 많은 시간이 걸리는 기능은 자체적으로 선점 가능하도록 제공해야된다.
      • 쉬운방법으로는 고루틴을 작은 조각으로 나누는 것
      • 일반적인 조언을 하는것은 어렵다.
    • 패턴 예시 todo
      • 그러나 하트비트를 쓰는게 유용하다

3.하트비트

  • 동시 프로세스가 외부로 생존 신호를 보내는 방법이다.
  • 두가지유형의 하트비트
    • 일정 시간 간격으로 발생하는 하트비트
    • 작업 단위의 시작 부분에서 발생하는 하트비트
  • 다른일이 일어날 때까지 대기중인 동시성 코드에 유용하다. (실행되고있는지 외부에서 확인가능)
  • todo 예시코드
  • 하트비트는 예상대로 작동하는 코드에서는 흥미롭지않지만, 비정상작동할때 즉각적인 알람을 준다.

4.복제된 요청

  • 동일한 것을 실행하고 빠르게 응답온것을 처리한다?

5.속도 제한

  • 시스템에 속도 제한을 도입함으로써 시스템에 대한 전체적인 공격성 클래스를 차단하는 기법
    • 공격자는 무의미한 로그 메시지로 서비스의 디스크를 마비시킬 수 있다.
  • 토큰 버킷 알고리즘을 사용
    • 리소스에 대한 접근 토큰이 있어야지만 리소스에 접근가능
    • 버킷이 맥시멈으로 가지는 토큰의 개수 d, 토큰이 보충되는 속도 r을 통해서 속도제한을 구현 할 수 있다.

6.비정상 고루틴의 치료

  • 수명이 긴 프로세스에서는 수명이 긴 고루틴의 집합을 사용하는 것이 일반적이다.
  • 근데 긴 고루틴은 외부의 도움없이 복구할 수 없는 나쁜 상태에 빠지기 쉽다.
  • 그럴때 고루틴을 다시 시작하는 과정을 고루틴의 치료라고 한다.
  • 생존 여부를 확인할때 하트비트 패턴을 사용한다.
  • 하트비트에 살아있을뿐만 아니라, 유용한 작업도 수행하고 있음을 나타내는 정보가 포함되도록 하라.

'프로그래밍 > golang' 카테고리의 다른 글

ultimate go (2)- data structure(배열/슬라이스)  (0) 2023.01.19
ultimate go (1)- syntax  (0) 2023.01.18
concurrency in go(3)  (0) 2023.01.04
concurrency in go(2)  (0) 2023.01.03
concurrency in go(1)  (0) 2022.12.31