본문 바로가기
Concepts/Cloud Native

Timeout

by ocwokocw 2023. 11. 11.

- 개요

Timeout은 예상되는 시간내에 결과를 받지 못할 경우 오류 상황으로 간주하는 패턴이다. 사실 설명이 필요할까 싶을 정도로 널리 그리고 거의 필수적으로 사용되는 패턴이다.

 

하지만 그렇다고해서 중요하지 않은것은 아니다. 서비스들이 연쇄적으로 호출관계를 가질 때, timeout을 적용하지 않는다면 하나의 서비스만 장애가 나도 이를 연쇄적으로 호출했던 서비스들은 무한대기를 하게된다. 이때 timeout을 적용하면 하나의 서비스 장애가 전체 시스템 장애가 되는 상황을 방지할 수 있다.


- Golang example

간단한 패턴인만큼 곧바로 golang 예제를 살펴보자. 사실 golang 에서는 첫번째 인자로 권장하는 context.Context 덕분에 구현이 굉장히 용이한편이다.

func TestTimeout(t *testing.T) {
	timeoutDur := 2 * time.Second
	processDur := 10 * time.Second
	ctx, cancel := context.WithTimeout(context.Background(), timeoutDur)
	defer cancel()

	longTimeProcess := func() {
		time.Sleep(processDur)
	}

	err := func(ctx context.Context, process func()) error {
		done := make(chan struct{})
		go func() {
			defer close(done)
			process()
		}()

		select {
		case <-ctx.Done():
			return ctx.Err()
		case <-done:
			return nil
		}
	}(ctx, longTimeProcess)

	require.Error(t, err)
}

 

위의 Test 함수에서는 timeout 을 2초로 설정했고, process 를 수행하는데 10초가 걸리는 상황이 있다고 가정하였다. process가 모두 수행되면 done channel로 완료 신호를 받는다. 이때는 정상 수행되었으므로 nil을 반환한다. 반면 context가 만료되면 관련 오류인 ctx.Err()을 반환한다. 

'Concepts > Cloud Native' 카테고리의 다른 글

Sharding  (1) 2024.01.13
Fan-out, Fan-in  (0) 2023.11.12
Throttling  (0) 2023.11.04
Retry  (0) 2023.10.31
Debounce  (1) 2023.10.30

댓글