5장. 확장에서의 동시성
더 큰 사이즈의 확장된 시스템에서의 동시성을 잘 활용하기 위해서는 다음과 같은 부분을 신경쓸필요가 있다.
- 에러전파
- 시간 초과 및 취소
- 하트비트
- 복제된 요청
- 속도 제한
- 비정상 고루틴의 치료
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 |