-
언제 끝날지 모르는 goroutine 금지golang 2024. 11. 12. 17:58
golang 에서 비동기 처리에 goroutine 을 사용하곤 한다.
다른 언어를 깊게 사용해 보진 않아서, 분명 더 쉽게 비동기 처리를 할 수 있는 언어도 있겠지만
goroutine 은 상당히 간단하고 강력하다.
백엔드 서버에서도 사용하고 있고, 클러스터 지표 수집기에서도 잘 사용하고 있다.
근데 문제가 발생하는데..!
클러스터 지표 수집기쪽에서 문제가 생겼는지 그라파나에서 그래프가 일직선으로 나타나기 시작했다.
처음엔 그라파나 문제인가 싶어서 보는데, 문제가 없었고 지표 수집기를 다시 실행해 보면서 로그를 확인해 보니 문제를 찾을 수 있었다.
데이터 노드 jmx 로 보낸 요청 응답이 오지 않아 그랬던 것이었다.
(jmx 에 타임아웃이 설정되어 있지 않나? 아님 서버 자체가 죽어서 그랬던 것이었을 수도 있다.)
흠, 근데 지금 생각해 보면 내가 타임 아웃을 걸면 되는데 왜 안걸었을까.
커버로스 인증이 필요해서 http 라이브러리를 쓰지 않고 직접 커맨드를 exec 로 실행해서 그랬던 것 같은데
이제 찾아보니 curl 에도 타임 아웃을 걸 수 있는 옵션이 있다. 바보 같은 나.
어쨌든 이렇게 http 요청에 타임아웃을 걸수도 있지만, goroutine 자체에 timeout 을 걸수도 있다.
context with Timeout 을 하나 만들어서 넘겨준 다음에, 받은 쪽에서 ctx.Done 으로 타임 아웃을 체크 하면 된다.
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() ds.GetNodeStatusWithTimeout(ctx, fqdn, checkKerberos)
그니까 위처럼 ctx 만들고 타임아웃 걸 함수에 넘겨준 다음에
select { case <-ctx.Done(): // 타임아웃 발생 시 처리 return 0, false case result := <-resultChan: // 작업이 완료되면 결과 반환 return result.usage, result.check }
함수 안에서 이렇게 처리하면 된다.
'golang' 카테고리의 다른 글
http.ListenAndServe 와 http.Server 차이 (0) 2024.11.14