Hello, Freakin world!

[Zuul] 서비스 타임아웃 지정하기 본문

Spring Cloud/Gateway

[Zuul] 서비스 타임아웃 지정하기

johnna_endure 2021. 3. 11. 18:55

서비스 타임아웃은 리본과 히스트릭스 각각 지정할 수 있습니다.

기본적으로 주울은 1초 이상 걸리는 호출을 종료하고 HTTP 504 에러를 반환합니다. 이는 히스트릭스에서 걸리는 타임아웃입니다.

(유레카에 등록된 서비스는 기본적으로 이와 같이 동작하지만 그렇지 않은 경우엔 히스트릭스 설정을 따로 추가해야 됩니다.)

 

리본에서도 타임아웃을 지정할 수 있습니다. 기본값은 5000ms 입니다.

 

만약 5초 이상의 타임아웃을 지정하려면 리본의 기본값이 5초이기 때문에 리본에도 타임아웃을 새로 지정해야 합니다.

 


히스트릭스에서 타임아웃 지정

 

다음의 코드를 applicatoin.yml에 추가합니다.

hystrix:
  command:
    default:
      excution.isolation.thread.timeoutInMilliseconds: 1000

히스트릭스 타임아웃은 1초로 변경했습니다.

 

만약 서비스 별로 타임아웃을 다르게 하고 싶다면 먼저 isolation 정책을 스레드풀 방식으로 바꿔야합니다.(기본 방식은 세마포어 방식입니다.) 그리고 default 대신 서비스 id를 지정하면 됩니다.

 


리본에서의 타임아웃 지정

 

일단 서비스를 두 가지로 구분합니다.

 

1. 유레카에 등록된 서비스

2. 유레카에 등록되지 않은 서비스


1. 유레카에 등록된 서비스

 

아래의 코드를 application.yml에 추가합니다.

ribbon:
  ReadTimeout: 2000
  SocketTimeout: 2000

2. 유레카에 등록되지 않은 서비스

 

아래의 코드를 application.yml에 추가합니다.

zuul:
  host:
    connect-timeout-millis: 2000
    socket-timeout-millis: 2000

 

타임아웃을 2초로 변경했습니다.

 

참고: ReadTimeout, connect-timeout-millis이 socket-timeout-millis 뭐가 다른걸까요?

유레카에 등록된 서비스에서 ReadTimeout, SocketTimeout 둘 중 하나의 값만 있더도 제대로 동작했습니다.

하지만 유레카에 등록되지 않은 경우 connection-timeout-millis 값은 적용되지 않고, socket-timeout-millis 값만

적용됐습니다.

 

둘을 구분해서 다른 값을 주기보단 그냥 속편하게 같은 값을 모두 주고 사용하시는게 속편할 듯.

Comments