Chapter 15 SeungminLee - JAVA-JIKIMI/SPRING-IN-ACTION-5 GitHub Wiki

์‹คํŒจ์™€ ์ง€์—ฐ ์ฒ˜๋ฆฌํ•˜๊ธฐ

15.1 ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ์ดํ•ดํ•˜๊ธฐ

์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ํŒจํ„ด (circuit breaker pattern)

  • ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰์— ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋„๋ก ํ•œ๋‹ค.
  • ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค์—์„œ ๋” ๋น›์„ ๋ฐœํ•˜๋Š” ํŒจํ„ด
  • ํ•œ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค์˜ ์‹คํŒจ๊ฐ€ ๋‹ค๋ฅธ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์˜ ์—ฐ์‡„์ ์ธ ์‹คํŒจ๋กœ ํ™•์‚ฐ์ด ๋˜๋Š” ๊ฑธ ๋ฐฉ์ง€ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—.
  • ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์‹œ ์ฐจ๋‹จ๊ธฐ๋ฅผ ๋‚ด๋ ค ์ „๋ฅ˜๋ฅผ ๋ง‰๋Š” ์‹ค์ œ ํšŒ๋กœ (circuit)๊ณผ ์œ ์‚ฌํ•œ ํ˜•ํƒœ
  • ์–ด๋–ค ์ด์œ ๋กœ ๋ฉ”์„œ๋“œ์˜ ์‹คํ–‰์ด ์‹คํŒจํ•˜๋ฉด (์‹คํ–‰ํšŸ์ˆ˜๋‚˜ ์‹œ๊ฐ„ ๋“ฑ ๋ฏธ๋ฆฌ ์„ค์ •ํ•ด๋‘” ํ•œ๊ณ„๊ฐ’์„ ์ดˆ๊ณผ) ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค๊ฐ€ ๊ฐœ๋ฐฉ์ด ๋˜๊ณ (์ฐจ๋‹จ๊ธฐ๋ฅผ ๋‚ด๋ฆฌ๊ณ ) ๋” ์ด์ƒ ์‹คํŒจํ•œ ๋ฉ”์†Œ๋“œ์˜ ํ˜ธ์ถœ์ด ๋”์ด์ƒ ์ด๋ค„์ง€์ง€ ์•Š๋Š”๋‹ค.
  • ์ด๋•Œ ํ’€๋ฐฑ์„ ์ œ๊ณตํ•ด ์ž์ฒด์ ์œผ๋กœ ์‹คํŒจ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

https://drek4537l1klr.cloudfront.net/walls7/Figures/15fig01.jpg

  • closed๊ฐ€ ์„œํ‚ท์ƒํƒœ์˜ ์‹œ์ž‘. (์„œํ‚ท๋ธŒ๋ ˆ์ด์ปค๋กœ ๋ณดํ˜ธ๋˜๊ณ  ์žˆ๋Š” ๋ฉ”์„œ๋“œ)
  • ์‹คํ–‰์— ์„ฑ๊ณตํ•˜๋ฉด Success๋ผ ๋‹ซํž˜ ์ƒํƒœ๋ฅผ ์œ ์ง€
  • ์‹คํŒจํ•  ์‹œ ์ง€๊ธˆ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ์‹คํŒจํ•œ ๋ฉ”์„œ๋“œ ๋Œ€์‹  ํ’€๋ฐฑ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. ์ƒํƒœ๋Š” open์œผ๋กœ ๋ฐ”๋€๋‹ค
  • ๋งŒ์•ฝ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋Š” ๋“ฑ์˜ ์กฐ๊ฑด์œผ๋กœ ์ธํ•ด ์„œํ‚ท์ด half-open ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ์‹คํŒจํ–ˆ๋˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•ด๋ณธ๋‹ค.
  • ์„ฑ๊ณตํ•˜๋ฉด closed, ์‹คํŒจํ•˜๋ฉด ๋˜ open ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค๋ฅผ ๋” ๊ฐ•๋ ฅํ•œ ํ˜•ํƒœ์˜ try-catch ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์ข‹๋‹ค. ๋‹ซํž˜ ์ƒํƒœ๋Š”(์ž˜ ์‹คํ–‰์ด ๋จ) try์™€ ์œ ์‚ฌํ•˜๊ณ , ์‹คํŒจ ํ›„ ํ˜ธ์ถœ๋˜๋Š” ํ’€๋ฐฑ ๋ฉ”์„œ๋“œ๋Š” catch ์™€ ์œ ์‚ฌํ•œ๋‹ค. try-catch๊ฐ€ ํ•œ ๋ฒˆ์˜ ์‹คํŒจ๋กœ ์‹คํ–‰์ด ๋œ๋‹ค๋ฉด ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค๋Š” ์„ค์ •ํ•œ ํ•œ๊ณ„๊ฐ’์„ ๋„˜์–ด์„œ ์‹คํŒจํ–ˆ์„ ๊ฒฝ์šฐ ํ’€๋ฐฑ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค๋Š” ๋ฉ”์„œ๋“œ ๋‹จ์œ„๋กœ ์ ์šฉ์ด ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ํ•˜๋‚˜์˜ ๋ง˜์ดํฌ๋กœ ์„œ๋น„์Šค์— ๋งŽ์€ ์„œํ‚ค์‹œ ๋ธŒ๋ ˆ์ด์ปค๋ฅผ ๋‘˜ ์ˆ˜ ์žˆ๋‹ค. ๋•Œ๋ฌธ์— ์ฝ”๋“œ์˜ ์–ด๋””์— ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค๋ฅผ ์„ ์–ธํ• ์ง€ ๊ฒฐ์ •ํ•  ๋•Œ๋Š” ์‹คํŒจ์˜ ๋Œ€์ƒ์ด ๋˜๋Š” ๋ฉ”์„œ๋“œ(์‹คํŒจํ•  ์œ„ํ—˜์ด ์žˆ๋Š”)๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•˜๋‹ค. ํ›„๋ณด๋กœ ๋ฝ‘์„ ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋Š”

  1. REST๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ (์›๊ฒฉ ์„œ๋น„์Šค๋กœ ์ธํ•ด ์‹คํŒจ)
  2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฉ”์„œ๋“œ (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋ฌด๋ฐ˜์‘ ์ƒํƒœ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์‹คํŒจ)
  3. ๋А๋ฆฌ๊ฒŒ ์‹คํ–‰๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๋ฉ”์„œ๋“œ (ํ•„์‹œ ์‹คํŒจํ•˜๋Š” ๋ฉ”์„œ๋“œ๋Š” ์•„์ง€์ง€๋งŒ ๋„ˆ๋ฌด ์˜ค๋žซ๋™์•ˆ ์‹คํ–‰๋˜๋ฉด ๋น„์ •์ƒ์  ์ƒํƒœ๋ฅผ ๊ณ ๋ ค)

1๊ณผ 2๋Š” ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค๋กœ ์‹คํŒจ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋งˆ์ง€๋ง‰ ์œ ํ˜•์€ ๋ฉ”์„œ๋“œ์˜ ์‹คํŒจ๋ณด๋‹ค๋Š” ์ง€์—ฐ(latency)๊ฐ€ ๋ฌธ์ œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ฒฝ์šฐ์—๋„ ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค์˜ ์žฅ์ ์„ ์‚ด๋ฆด ์ˆ˜ ์žˆ๋‹ค. ์ง€์—ฐ์€ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๊ด€์ ์—์„œ๋„ ๋งค์šฐ ์ค‘์š”ํ•œ๋ฐ, ์ง€๋‚˜์น˜๊ฒŒ ๋А๋ฆฐ ๋ฉ”์„œ๋“œ๊ฐ€ ์ƒ์œ„ ์„œ๋น„์Šค์— ์—ฐ์‡„์ ์ธ ์ง€์—ฐ์„ ์œ ๋ฐœํ•˜๋ฉด ๋” ํฐ ๋ฌธ์ œ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ฑ…์—์„œ ์‚ฌ์šฉํ•  ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ํŒจํ„ด์€ NetFlix์˜ Hystrix๋กœ, ์ž๋ฐ”๋กœ ๊ตฌํ˜„์ด ๋˜์—ˆ๊ณ  ๋Œ€์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํŒจํ•  ๋•Œ ํด๋ฐฑ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋™์‹œ์— ๋Œ€์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์‹คํŒจ๋ฅผ ํ•˜๋Š”์ง€ ์ถ”์ ํ•˜๊ณ , ์‹คํŒจ์œจ์ด ํ•œ๊ณ„๊ฐ’์„ ์ดˆ๊ณผํ•˜๋ฉด ํ’€๋ฐฑ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์„œํ‚ท๋ธŒ๋ ˆ์ด์ปค๋ฅผ ์„ ์–ธํ•  ๋•Œ๋Š” @HystrixCommand ๋ฅผ ์„ ์–ธํ•˜๊ณ  ํด๋ฐฑ ๋ฉ”์„œ๋“œ๋งŒ ์ œ๊ณตํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

Netflix, Inc.

15.2 ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ์„ ์–ธํ•˜๊ธฐ

  1. pom.xl์— dependency ์ถ”๊ฐ€
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
  1. ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ ๋ฒ„์ „ ์ง€์ •.
<properties>
  ...
  <spring-cloud.version>Hoxton.SR3</spring-cloud.version>
</properties>

...

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>${spring-cloud.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>
  1. application์— Hystrix ํ™œ์„ฑํ™” ํ•ด์ฃผ๊ธฐ
@SpringBootApplication
@EnableHystrix
public class IngredientServiceApplication {
    ...
}
  1. @HystrixCommand ๋ฅผ ์‹ค์ œ ๋ฉ”์„œ๋“œ์— ์‚ฌ์šฉํ•ด๋ณด๊ธฐ
@HystrixCommand(fallbackMethod="getDefaultIngredients")
public Iterable<Ingredient> getAllIngredients() {
  ParameterizedTypeReference<List<Ingredient>> stringList =
      new ParameterizedTypeReference<List<Ingredient>>() {};
  return rest.exchange(
      "http://ingredient-service/ingredients", HttpMethod.GET,
      HttpEntity.EMPTY, stringList).getBody();
}
  • RestTemplate์„ ์‚ฌ์šฉํ•ด์„œ ์‹์ž์žฌ ์„œ๋น„์Šค๋กœ๋ถ€ํ„ฐ Ingredient ๊ฐ์ฒด๋“ค์ด ์ €์žฅ๋œ ์ปฌ๋ ‰์…˜์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์„œ๋“œ getAllIngredients์— @HystrixCommand๋ฅผ ์ ์šฉํ–ˆ๋‹ค.
  • ์‹ค์ œ๋กœ ํ†ต์‹ ์„ ํ•˜๋Š” exchange() ๊ฐ€ ํ˜ธ์ถœ ์‹คํŒจ์˜ ์ž ์žฌ์ ์ธ ์›์ธ์ด๋‹ค.
  • ์–ด๋– ํ•œ ์ด์œ ๋กœ ํ˜ธ์ถœ์ด ์‹คํŒจํ•œ๋‹ค๋ฉด RestClientException (unchecked, run-time exception)์ด ๋ฐœ์ƒํ•œ๋‹ค.
  • RestTemplate์ด try-catch๋ฅผ ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์„œ ์ง์ ‘ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค˜์•ผ ํ•˜๋Š”๋ฐ ํ˜„์žฌ๋Š” ํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ, ์ด๋Œ€๋กœ ์‹คํŒจํ•œ๋‹ค๋ฉด ํ˜ธ์ถœ ์Šคํƒ์˜ ์ƒ์œ„ ํ˜ธ์ถœ์ž๋“ค์—๊ฒŒ ๊ณ„์† ์—๋Ÿฌ๊ฐ€ ์ „๋‹ฌ์ด ๋œ๋‹ค.
  • ๊ณ„์† ์ „๋‹ฌ๋˜๋Š” Unchecked์˜ˆ์™ธ๋Š” ๊ณจ์นซ๊ฑฐ๋ฆฌ์ด๊ณ , ํŠนํžˆ ์กฐ๋ฐ€ํ•˜๊ฒŒ ์—ฐ๊ฒฐ์ด ๋˜์–ด์žˆ๋Š” ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์—์„œ ๋” ์‹ฌํ•˜๋‹ค.
  • ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์—์„œ ์ƒ๊ธด ์—๋Ÿฌ๋Š” ๋‹ค๋ฅธ ๊ณณ์— ์ „ํŒŒํ•˜์ง€ ์•Š๊ณ  ํ•ด๋‹น ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์•ˆ์— ๋‚จ๊ฒจ์•ผ ํ•œ๋‹ค(๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์˜ Vegas Rule)
  • ์ด๋•Œ getAllIngredients์— ์„œํ‚ท๋ธŒ๋ ˆ์ด์ปค๋ฅผ ์„ ์–ธํ•ด์ฃผ๋ฉด ๋ฒ ๊ฐ€์Šค ๋ฃฐ์„ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  • HystrixCommand ์–ด๋…ธํ…Œ์ด์…˜์„ ์„ ์–ธ ํ›„, fallback ๋ฉ”์„œ๋“œ๋ฅผ getDefaultIngredients๋กœ ์ง€์ •
  1. ์‹คํŒจํ•  ๋•Œ ์‹คํ–‰์ด ๋  ํด๋ฐฑ ๋ฉ”์„œ๋“œ ๋งŒ๋“ค๊ธฐ
private Iterable<Ingredient> getDefaultIngredients() {
  List<Ingredient> ingredients = new ArrayList<>();
  ingredients.add(new Ingredient(
        "FLTO", "Flour Tortilla", Ingredient.Type.WRAP));
  ingredients.add(new Ingredient(
        "GRBF", "Ground Beef", Ingredient.Type.PROTEIN));
  ingredients.add(new Ingredient(
        "CHED", "Shredded Cheddar", Ingredient.Type.CHEESE));
  return ingredients;
}
  • unchecked ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ด์„œ getAllIngredients๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ์„œํ‚ท๋ธŒ๋ ˆ์ด์ปค๊ฐ€ ๊ทธ ์˜ˆ์™ธ๋ฅผ ์ž๋ฐ”์•„์„œ getDefaultIngredients๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
  • ํด๋ฐฑ๋ฉ”์„œ๋“œ๋Š” ์›๋ž˜์˜ ์˜๋„๋Œ€๋กœ ์‹คํŒจํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰์ด ๋ถˆ๊ฐ€๋Šฅํ•  ๋•Œ ๋Œ€๋น„ํ•˜๋Š” ์˜๋„๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ œ์ผ ์ข‹๋‹ค. (stand-alone ํ˜•ํƒœ, dummy ๋ฐ์ดํ„ฐ๋ผ๋„ ์ฑ„์›Œ์„œ ์ค˜์•ผํ•œ๋‹ค)
  • ํด๋ฐฑ ๋ฉ”์„œ๋“œ๋Š” ์›๋ž˜์˜ ๋ฉ”์„œ๋“œ์™€ ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ ๊ฐ™์•„์•ผํ•œ๋‹ค. ํŒŒ๋ผ๋ฉ”ํ„ฐ ์ข…๋ฅ˜, ๊ฐฏ์ˆ˜, ๋ฆฌํ„ด๊ฐ’์ด ๊ฐ™์•„์•ผ ํ•œ๋‹ค.
  • dummy ๊ฐ’์„ ์ฑ„์›Œ์ฃผ๋Š” ์ด ๊ฒฝ์šฐ๋Š” ํด๋ฐฑ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํŒจํ•  ์ผ์ด ์—†์ง€๋งŒ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„์„ ํ•œ๋‹ค๋ฉด ์ด ๋ฉ”์„œ๋“œ ๋˜ํ•œ ์ž ์žฌ์ ์ธ ์‹คํŒจ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด๋•Œ ์ด ํด๋ฐฑ ๋ฉ”์„œ๋“œ์— HytrixCommand๋ฅผ ๋‹ฌ๊ณ  ํด๋ฐฑ ๋ฉ”์„œ๋“œ๋ฅผ ๋˜ ์ง€์ •์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค๋Š” ์—ฐ์‡„์ ์œผ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋‹จ, ํด๋ฐฑ ์Šคํƒ์˜ ์ œ์ผ ๋ฐ‘์—๋Š” ์‹คํ–‰์— ์‹คํŒจํ•˜์ง€ ์•Š์•„ ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค๊ฐ€ ํ•„์š”์—†๋Š” ํ™•์‹คํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ์ด์–ด์•ผ ํ•œ๋‹ค.

15.2.1 ์ง€์—ฐ ์‹œ๊ฐ„ ์ค„์ด๊ธฐ

์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค๋Š” ๋ฉ”์„œ๋“œ์˜ ์‹คํ–‰์ด ๋๋‚˜๊ณ  ๋ณต๊ท€ํ•˜๋Š” ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒฝ์šฐ ํƒ€์ž„์•„์›ƒ์„ ์‚ฌ์šฉํ•ด ์ง€์—ฐ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. HystrixCommand๋ฅผ ์ง€์ •ํ•˜๋ฉด ๋””ํดํŠธ๋กœ ๋ฉ”์„œ๋“œ๋Š” 1์ดˆํ›„์— ํƒ€์ž„์•„์›ƒ์ด ๋˜๊ณ  ํด๋ฐฑ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. ์ด์œ ๋ฅผ ๋ถˆ๋ฌธํ•˜๊ณ  ํƒ€์ž„์•„์›ƒ์ด ๋˜๋ฉด ๋ฌด์กฐ๊ฑด ํ’€๋ฐฑ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

1์ดˆ์˜ ํƒ€์ž„์•„์›ƒ์€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์— ๋งž๋Š” ํ•ฉ๋ฆฌ์ ์ธ ๊ฐ’์ด์ง€๋งŒ Hystrix๋Š” commandProperties๋ฅผ ํ†ตํ•ด ์†์„ฑ์„ ์ง€์ •ํ•˜์—ฌ ํƒ€์ž„์•„์›ƒ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. commandProperties๋Š” ์„ค์ •๋  ์†์„ฑ์˜ ์ด๋ฆ„๊ณผ ๊ฐ’์„ ์ง€์ •ํ•˜๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ @HystrixProperty ์–ด๋…ธํ…Œ์ด์…˜์„ ์ €์žฅํ•œ ๋ฐฐ์—ด์ด๋‹ค.

(์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•ด์„œ ๋‹ค๋ฅธ ์–ด๋…ธํ…Œ์ด์…˜์˜ ์†์„ฑ์„ ์„ค์ •ํ•œ๋‹ค๋Š” ์„ฑ๊ฒฉ์ด ๋‹ค์†Œ ํŠน์ดํ•˜๋‹ค)

@HystrixCommand(
    fallbackMethod="getDefaultIngredients",
    commandProperties={
        @HystrixProperty(
            name="execution.isolation.thread.timeoutInMilliseconds",
            value="500")
    })
public Iterable<Ingredient> getAllIngredients() {
  ...
}
@HystrixCommand(
    fallbackMethod="getDefaultIngredients",
    commandProperties={
        @HystrixProperty(
            name="execution.timeout.enabled",
            value="false")
    })
public Iterable<Ingredient> getAllIngredients() {
  ...
}
  • execution.isolation.tread.timeoutMilliseconds : ํƒ€์ž„์•„์›ƒ ์†์„ฑ ์„ค์ •, ๋ฐ€๋ฆฌ์„ธ์ปจ๋“œ๋กœ ๋˜์–ด์žˆ์–ด ํƒ€์ž„์•„์›ƒ์„ 0.5 ์ดˆ๋กœ ์ค„์ด๊ณ ์ž ํ•œ๋‹ค๋ฉด 500์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.
  • execution.timeout.enabled: ํƒ€์ž„์•„์›ƒ ์„ค์ •์ด ํ•„์š”์—†๋‹ค๋ฉด ์—ฌ๊ธฐ๋ฅผ false๋กœ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
  • ์ด์ฒ˜๋Ÿผ ํƒ€์ž„์•„์›ƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”์„œ๋“œ๊ฐ€ ์ง€์—ฐ๋˜์–ด 10๋ถ„ 30๋ถ„์ด ์ง€๋‚˜๋„ ๋จธ๋ฌผ๋Ÿฌ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ์‡„ ์ง€์—ฐ ํšจ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผํ•œ๋‹ค.

15.2.2 ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ํ•œ๊ณ„๊ฐ’ ๊ด€๋ฆฌํ•˜๊ธฐ

์„œํ‚ท๋ธŒ๋ ˆ์ด์ปค๋กœ ๊ฐ์‹ธ์ง„ ๋ฉ”์„œ๋“œ๋Š” ๊ธฐ๋ณธ์œผ๋กœ 10์ดˆ ๋™์•ˆ์— 20๋ฒˆ ์ด์ƒ ํ˜ธ์ถœ๋˜๊ณ  ์ด ์ค‘ 50%์ด์ƒ์ด ์‹คํŒจํ•˜๋ฉด ์—ด๋ฆผ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค. ์ดํ›„์˜ ๋ชจ๋“  ํ˜ธ์ถœ์€ ํด๋ฐฑ ๋ฉ”์„œ๋“œ์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋˜๋‹ค๊ฐ€ 5์ดˆํ›„์— half-open ์ƒํƒœ๊ฐ€ ๋˜์–ด ์›๋ž˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ์‹œ๋„ํ•œ๋‹ค.

@HystrixCommand(
    fallbackMethod="getDefaultIngredients",
    commandProperties={
        @HystrixProperty(
            name="circuitBreaker.requestVolumeThreshold",
            value="30"),
        @HystrixProperty(
            name="circuitBreaker.errorThresholdPercentage",
            value="25"),
        @HystrixProperty(
            name="metrics.rollingStats.timeInMilliseconds",
            value="20000")
				@HystrixProperty(
            name="circuitBreaker.sleepWindowInMilliseconds",
            value="60000")
    })
public List<Ingredient> getAllIngredients() {
  // ...
}
  • circuitBreaker.requestVolumeThreshold : ์ง€์ •๋œ ์‹œ๊ฐ„ ๋‚ด์— ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์–ด์•ผํ•˜๋Š” ํšŸ์ˆ˜
  • circuitBreaker.errorThresholdPercentage : ์ง€์ •๋œ ์‹œ๊ฐ„ ๋‚ด์— ์‹คํŒจํ•œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๋น„์œจ (%)
  • metrics.rollingStats.timeInMilliseconds : ์š”์ฒญ ํšŸ์ˆ˜์™€ ์—๋Ÿฌ ๋น„์œจ์ด ๊ณ ๋ ค๋˜๋Š” ์‹œ๊ฐ„
  • circuitBreaker.sleepWinfowInMilliseconds : half-open ์ƒํƒœ๋กœ ์ง„์ž…ํ•˜์—ฌ ์‹คํŒจํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ๋‹ค์‹œ ์‹œ๋„๋˜๊ธฐ ์ „์— ์—ด๋ฆผ ์ƒํƒœ์˜ ์„œํ‚ท์ด ์œ ์ง€๋˜๋Š” ์‹œ๊ฐ„

metrics.rollingState.timeMilliseconds์— ์ง€์ •๋œ ์‹œ๊ฐ„ ์ด๋‚ด์— circuitBreaker.requestVolumeThreshold์™€ circuitBreaker.errorThresholdPercentage ๊ฐ€ ์ดˆ๊ฐ€๋œ๋‹ค๋ฉด circuitBreaker.sleepWinfowInMilliseconds ์— ์ง€์ •๋œ ์‹œ๊ฐ„๋™์•ˆ ์—ด๋ฆผ ์ƒํƒœ์—์„œ ๋จธ๋ฌด๋ฅธ๋‹ค.

์œ„์˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์„ค์ •์„ ํ•œ๋‹ค๋ฉด 20์ดˆ ์ด๋‚ด์— ๋ฉ”์„œ๋“œ๊ฐ€ 30๋ฒˆ ์ด์ƒ ์ดˆํ’€์ด ๋˜์–ด ์ด์ค‘ 25%๊ฐ€ ์‹คํŒจ์ผ๊ฒฝ์šฐ ์„œํ‚ท์€ ์—ด๋ฆผ ์ƒํƒœ๊ฐ€ ๋˜๊ณ  1๋ถ„๊ฐ„ ํด๋ฐฑ ๋ฉ”์„œ๋“œ๊ฐ€ ์š”์ฒญ์„ ๋Œ€์‹  ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

๋ฉ”์„œ๋“œ ์‹คํŒจ์™€ ์ง€์—ฐ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ ์™ธ์— ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์žˆ๋Š” ๊ฐ ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค์˜ ๋ฉ”ํŠธ๋ฆญ๋„ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ฐœํ–‰์„ ํ•œ๋‹ค. ์•ž์œผ๋กœ๋Š” Hystrix๊ฐ€ ๋ฐœํ–‰ํ•œ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์–ดํ”Œ๋ฆฌํ…Œ์ด์…˜์˜ ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ๋‹ค.

15.3 ์‹คํŒจ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ธฐ

์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค๋กœ ๋ณดํ˜ธ๋˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ๋งค๋ฒˆ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ํ˜ธ์ถœ์— ๊ด€ํ•œ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆ˜์ง‘๋˜์–ด Hystrix ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ฐœํ–‰๋œ๋‹ค. ์•ž์—์„œ ๋งํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ด ์ŠคํŠธ๋ฆผ์€ ์‹คํ–‰์ค‘์ธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. Hystrix ์ŠคํŠธ๋ฆผ ์•ˆ์—๋Š” ์•„๋ž˜์˜ ์‚ฌํ•ญ๋“ค์ด ํฌํ•จ๋œ๋‹ค.

  • ๋ฉ”์„œ๋“œ๊ฐ€ ๋ช‡ ๋ฒˆ ํ˜ธ์ถœ๋˜๋Š”์ง€
  • ์„ฑ๊ณต์ ์œผ๋กœ ๋ช‡ ๋ฒˆ ํ˜ธ์ถœ๋˜๋Š”์ง€
  • ํ’€๋ฐฑ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ช‡ ๋ฒˆ ํ˜ธ์ถœ๋˜๋Š”์ง€
  • ๋ฉ”์„œ๋“œ๊ฐ€ ๋ช‡ ๋ฒˆ ํƒ€์ž„์•„์›ƒ๋˜๋Š”์ง€

์ด์™€ ๊ฐ™์€ Hystrix ์ŠคํŠธ๋ฆผ์„ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•

  1. pom.xml์— dependency ์ถ”๊ฐ€
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
  1. Hystrix ์•ค๋“œํฌ์ธํŠธ ๊ฒฝ๋กœ ๋…ธ์ถœ์‹œํ‚ค๊ธฐ
management:
  endpoints:
    web:
      exposure:
        include: hystrix.stream

2๋ฒˆ์„ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์— ์‚ฌ์šฉ์ด ๋˜๋Š” ๊ฐ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ application.yml ํŒŒ์ผ์— ์ถ”๊ฐ€์‹œ์ผœ์ฃผ๋ฉด ๊ตฌ์„ฑ ์„œ๋ฒ„์˜ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ ์„œ๋น„์Šค๊ฐ€ ์ด ์†์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด์ œ Hystrix ์ŠคํŠธ๋ฆผ์ด ๋…ธ์ถœ๋˜์–ด ์–ด๋–ค REST ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๋ƒฅ Hystrix ์ŠคํŠธ๋ฆผ์˜ ๊ฐ ํ•ญ๋ชฉ์€ ๊ฐ–์€ JSON ๋ฐ์ดํ„ฐ๋กœ ๊ตฌ์„ฑ์ด ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์ด์–ธํŠธ ์ธก์˜ ๋งŽ์€ ์ž‘์—…์„ ์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด Hystrix ๋Œ€์‹œ๋ณด๋“œ์˜ ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•ด๋ณด์ž.

https://howtodoinjava.com/wp-content/uploads/2017/07/HystrixStream.jpg

15.3.1 Hystrix ๋Œ€์‹œ๋ณด๋“œ ๊ฐœ์š”

(์ƒˆ๋กœ์šด ์Šคํ”„๋ง๋ถ€ํŠธ ํ”„๋กœ์ ํŠธ๋กœ ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค)

  1. pom.xml dependency ์ถ”๊ฐ€
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
  1. application์—์„œ ํ™œ์„ฑํ™”๋ฅผ ์œ„ํ•ด @EnableHysritxDashboard ์ถ”๊ฐ€
@SpringBootApplication
@EnableHystrixDashboard
public class HystrixDashboardApplication {
  public static void main(String[] args) {
    SpringApplication.run(HystrixDashboardApplication.class, args);
  }
}
  1. ํฌํŠธ ์ถฉ๋Œ ์˜ˆ๋ฐฉ์„ ์œ„ํ•œ ์„œ๋ฒ„ ํฌํŠธ ์ง€์ • (๊ฐœ๋ฐœ์‹œ ๋กœ์ปฌ์—์„œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์„œ๋ฒ„๋ฅผ ๋Œ๋ฆฌ๊ณ  ์žˆ์„ ๊ฒฝ์šฐ)
server:
  port: 7979
  1. localhost:7979/hystrix ์— ์ ‘์†

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/554fc09d-e717-4902-96cc-7b625911ea68/Untitled.png

  • Hystrix ๋ฅผ ๊ตฌํ˜„ํ•ด ์ŠคํŠธ๋ฆผ์„ ๋ฐ›์•„์˜ค๋Š” ์„œ๋น„์Šค ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ŠคํŠธ๋ฆผ์„ ๋ณด๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ณ ์Šด๋„์น˜ ๋ฐ‘์— ์žˆ๋Š” ์ฐฝ์— ํ•ด๋‹น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํฌํŠธ์™€ strem url์„ ์จ์ฃผ๋ฉด ๋œ๋‹ค. localhost:8080/hystrix.stream (์•„๊นŒhystrix์˜ ์•ค๋“œํฌ์ธํŠธ๋ฅผ hystrix.stream์œผ๋กœ ์„ค์ •)
  • Delay: ํด๋ง ๊ฐ„๊ฒฉ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ๊ธฐ๋ณธ๊ฐ’์€ 2์ดˆ. ๊ฒฐ๊ตญ hystrix.stream ์•ค๋“œํฌ์ธํŠธ๋กœ๋ถ€ํ„ฐ 2์ดˆ์— ํ•œ๋ฒˆ์”ฉ Hystrix ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์˜จ๋‹ค
  • Title: ๋ชจ๋‹ˆํ„ฐ ํŽ˜์ด์ง€ ์ œ๋ชฉ

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/d1604529-5cae-4943-ac4c-c8bf5990b67a/Untitled.png

  • getAllIngredients์— ๋Œ€ํ•œ ๋ชจ๋‹ˆํ„ฐ๋งํ™”๋ฉด (์œ ์ผํ•œ ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค)
  • ๋งŒ์•ฝ Loding์ด๋ผ๋Š” ๋‹จ์–ด๋งŒ ๋ณด์ธ๋‹ค๋ฉด ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค๋กœ ๋ณดํ˜ธ๋œ ๋ฉ”์„œ๋“œ์˜ ํ˜ธ์ถœ์ด ์•„์ง ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๋Œ€์‹œ๋ณด๋“œ์— ๊ฐ’์„ ํ‘œํ˜„ํ•˜๊ณ  ์‹ถ์œผ๋ฉด ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.

https://drek4537l1klr.cloudfront.net/walls7/Figures/15fig04_alt.jpg

(๋” ์ž์„ธํ•œ ๋Œ€์‹œ๋ณด๋“œ)

  • ์™ผ์ชฝ ์œ„ ๋ชจ์„œ๋ฆฌ์˜ ๊ทธ๋ž˜ํ”„: ์ง€์ •๋œ ๋ฉ”์„œ๋“œ์˜ ์ง€๋‚œ 2๋ถ„ ๋™์•ˆ์˜ ํŠธ๋ž˜ํ”ฝ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๋ฉ”์„œ๋“œ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋ฐ”์˜๊ฒŒ ์‹คํ–‰๋˜์—ˆ๋Š”์ง€ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  • ์ƒ‰๊น”์ด ์ž…ํ˜€์ง„ ์›: ์›์˜ ํฌ๊ธฐ๋Š” ํ˜„์žฌ์˜ ํŠธ๋ž˜ํ”ฝ ์ˆ˜๋Ÿ‰์ด๋ฉฐ ์›์˜ ์ƒ‰์ƒ์€ ํ•ด๋‹น ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. (์ดˆ๋ก: ์ข‹์Œ, ๋…ธ๋ž‘: ๊ฐ€๋” ์‹คํŒจ, ๋นจ๊ฐ•: ์‹คํŒจ)
  • ์˜ค๋ฅธ์ชฝ ์œ„ ์ฒซ์งธ ์—ด: (์•„๋ž˜์ชฝ์œผ๋กœ ์ฝ๊ธฐ) ์ฒซ๋ฒˆ์งธ: ํ˜„์žฌ ์„ฑ๊ณตํ•œ ํ˜ธ์ถœ ํšŸ์ˆ˜, ๋‘๋ฒˆ์งธ: short circuited ์š”์ฒญ ํšŸ์ˆ˜, ๋งˆ์ง€๋ง‰: ์ž˜๋ชป๋œ ์š”์ฒญ์˜ ํšŸ์ˆ˜
  • ๋‘๋ฒˆ์งธ ์—ด: ํƒ€์ž„ ์•„์›ƒ๋œ ์š”์ฒญ ํšŸ์ˆ˜/์Šค๋ ˆ๋“œ ํ’€์ด ๊ฑฐ๋ถ€ํ•œ ํšŸ์ˆ˜/์‹คํŒจํ•œ ์š”์ฒญ ํšŸ์ˆ˜
  • ์„ธ๋ฒˆ์งธ ์—ด: ์ง€๋‚œ 10์ดˆ๊ฐ„์˜ ์—๋Ÿฌ ๋น„์œต
  • Host์™€ Cluster์˜ ์ดˆ๋‹น ์š”์ฒญ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆซ์ž ๋‘๊ฐœ, ๊ทธ ์•„๋ž˜๋กœ๋Š” ํ•ด๋‹น ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค์˜ ์ƒํƒœ.
  • ์ œ์ผ ์•„๋ž˜: ์ง€์—ฐ์‹œ๊ฐ„์˜ ์ค‘๊ฐ„๊ฐ’๊ณผ ํ‰๊ท ์น˜, ๋ฐฑ๋ถ„์œ„ ์ˆ˜ ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ๋‹ค.

15.3.2 Hystrix ์Šค๋ ˆ๋“œ ํ’€ ์ดํ•ดํ•˜๊ธฐ

๋„ˆ๋ฌด ์ˆ˜ํ–‰์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ๋ฉ”์„œ๋“œ โ†’ ๋‹ค๋ฅธ ์„œ๋น„์Šค์— Http ์š”์ฒญ์„ ํ•˜๊ณ  ์žˆ๋Š”๋ฐ ํ•ด๋‹น ์„œ๋น„์Šค์˜ ์‘๋‹ต์ด ๋А๋ฆผโ†’ ์ด๋Ÿฐ ๊ฒฝ์šฐ Hystrix๋Š” ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ๋ฉด์„œ ๊ด€๋ จ ์Šค๋ ˆ๋“œ๋ฅผ ๋ธ”๋กœํ‚นํ•œ๋‹ค.

์ด๋Ÿฐ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ์ž์™€ ๊ฐ™์€ ์Šค๋ ˆ๋“œ์˜ ์ปจํ…์ŠคํŠธ์—์„œ ์‹คํ–‰ ์ค‘์ด๋ผ๋ฉด ํ˜ธ์ถœ์ž๋Š” ์˜ค๋ž˜ ์‹คํ–‰๋˜๋Š” ๋ฉ”์„œ๋“œ๋กœ๋ถ€ํ„ฐ ๋ฒ—์–ด๋‚  ๊ธฐํšŒ๊ฐ€ ์—†๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ๋ธ”๋กœํ‚น๋œ ์Šค๋ ˆ๋“œ๊ฐ€ ์ œํ•œ๋œ ์ˆ˜์˜ ์Šค๋ ˆ๋“œ ์ค‘ ํ•˜๋‚˜์ธ๋ฐ ๋ฌธ์ œ๊ฐ€ ๊ณ„์† ์ƒ๊ธด๋‹ค๋ฉด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ํฌํ™” ์ƒํƒœ๊ฐ€ ๋˜์–ด ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋œ๋‹ค.

์ด๋Ÿฐ ์ƒํ™ฉ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Hystrix๋Š” ๊ฐ ์˜์กด์„ฑ ๋ชจ๋“ˆ์˜ ์Šค๋ ˆ๋“œ ํ’€์„ ํ• ๋‹นํ•œ๋‹ค. (ํ•˜๋‚˜ ์ด์ƒ์˜ Hystrix ๋ช…๋ น ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ–๋Š” ๊ฐ ์Šคํ”„๋ง ๋นˆ์„ ์œ„ํ•ด)

โ†’ Hystrix ๋ช…๋ น ๋ฉ”์„œ๋“œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์ด ๋ฉ”์„œ๋“œ๋Š” Hystrix๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์Šค๋ ˆ๋“œ ํ’€์˜ ์Šค๋ ˆ๋“œ(ํ˜ธ์ถœ ์Šค๋ ˆ๋“œ์™€๋Š” ๋ณ„๋„) ์—์„œ ์‹คํ–‰์ด ๋œ๋‹ค.

โ†’ ๋”ฐ๋ผ์„œ ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค๋ฉด ํ˜ธ์ถœ ์Šค๋ ˆ๋“œ๋Š” ํ•ด๋‹น ํ˜ธ์ถœ์„ ํฌ๊ธฐํ•˜๊ณ  ๋ฒ—์–ด๋‚˜๋ฉฐ, ์ž ์žฌ์ ์ธ ์Šค๋ ˆ๋“œ ํฌํ™”๋ฅผ Hystrix๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์Šค๋ ˆ๋“œ ํ’€์— ๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋‹ค.

https://drek4537l1klr.cloudfront.net/walls7/Figures/15fig05_alt.jpg

(์“ฐ๋ ˆ๋“œ ํ’€์— ์ค‘์ ์„ ๋‘” ๋Œ€์‹œ๋ณด๋“œ, ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ๋ชจ๋‹ˆํ„ฐ์™€ ํก์‚ฌํ•œ ํ˜•ํƒœ)

  • ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์›์ด ์žˆ๋Š” ๊ฒƒ์€ ๋™์ผํ•˜๋‚˜ ์ง€๋‚œ ๋ช‡ ๋ถ„ ๋™์•ˆ์˜ ์Šค๋ ˆ๋“œ ํ’€ ํ™œ๋™์„ ๋‚˜ํƒ€๋‚ด๋Š” ์„  ๊ทธ๋ž˜ํ”„๋Š” ์—†๋‹ค.
  • ์Šค๋ ˆ๋“œ ํ’€์˜ ์ด๋ฆ„: ingredientServiceImpl
  • ์™ผ์ชฝ ์•„๋ž˜ ๋ชจ์„œ๋ฆฌ : ํ™œ์„ฑ ์Šค๋ ˆ๋“œ์˜ ํ˜„์žฌ ๊ฐœ์ˆ˜/ํ˜„์žฌ ํ์— ์žˆ๋Š” ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜(๊ธฐ๋ณธ์ ์œผ๋กœ ํ๊ฐ€ ๋น„ํ™œ์„ฑํ™” ๋˜์–ด์žˆ์–ด์„œ ๊ฐ’์€ ํ•ญ์ƒ 0)/์Šค๋ ˆ๋“œ ํ’€์— ์žˆ๋Š” ์Šค๋ ˆ๋“œ์˜ ๊ฐœ์ˆ˜
  • ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ๋ชจ์„œ๋ฆฌ: ์ƒ˜ํ”Œ๋ง ์‹œ๊ฐ„๋™์•ˆ ์ตœ๋Œ€ํ™œ์„ฑ ์Šค๋ ˆ๋“œ ์นด์šดํŠธ/Hystrix ์‹คํ–‰์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์Šค๋ ˆ๋“œ ํ’€์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ ํšŸ์ˆ˜/์Šค๋ ˆ๋“œ ํ’€ ์Šˆ์˜ ํฌ๊ธฐ(๊ธฐ๋ณธ ๋น„ํ™œ์„ฑ)

15.4 ๋‹ค์ˆ˜์˜ Hystrix ์ŠคํŠธ๋ฆผ ์ข…ํ•ฉํ•˜๊ธฐ

์›๋ž˜ Hystrix ๋Œ€์‹œ๋ณด๋“œ๋Š” ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ Hystrix ์ŠคํŠธ๋ฆผ์„ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Netflix์˜ Turbine ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐœํ–‰ํ•˜๋Š” ์ŠคํŠธ๋ฆผ์„ ํ•˜๋‚˜๋กœ ์ข…ํ•ฉํ•ด์ค€๋‹ค.

(์ƒˆ๋กœ์šด ์ŠคํŠธ๋ง๋ถ€ํŠธ ํ”„๋กœ์ ํŠธ์— ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

  1. pom.xml์— dependency ์ถ”๊ฐ€
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-turbine</artifactId>
</dependency>
  1. application์— ํ™œ์„ฑํ™”๋ฅผ ์œ„ํ•ด @EnableTurbine ์ถ”๊ฐ€
@SpringBootApplication
@EnableTurbine
public class TurbineServerApplication {
  public static void main(String[] args) {
    SpringApplication.run(TurbineServerApplication.class, args);
  }
}
  1. ์„œ๋น„์Šค ํฌํŠธ ์ถฉ๋Œ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„ ํฌํŠธ ์„ค์ •
server:
  port: 8989

์ด์ œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋กœ๋ถ€ํ„ฐ Hystrix ์ŠคํŠธ๋ฆผ์ด ์ƒ์„ฑ๋˜๋ฉด ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ๋ฉ”ํŠธ๋ฆญ๋“ค์ด Turbine์— ์˜ํ•ด ํ•˜๋‚˜์˜ Hystrix ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ข…ํ•ฉ์ด ๋œ๋‹ค. Trubine์€ ์œ ๋ ˆ์นด์˜ ํด๋ผ์ด์–ธํŠธ๋กœ ์ž‘๋™ํ•˜๋ฏ€๋กœ Hystrix ์ŠคํŠธ๋ฆผ์„ ์ข…ํ•ฉํ•  ์„œ๋น„์Šค๋“ค์„ ์œ ๋ ˆ์นด์— ์ฐพ๋Š”๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ชจ๋“  ์„œ๋น„์Šค์˜ ์ŠคํŠธ๋ฆผ์„ ์ข…ํ•ฉํ•˜์ง€๋Š” ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ์„ค์ •์„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

  1. turbine.app-config ์†์„ฑ์„ ์‚ฌ์šฉํ•ด Hystrix ์ŠคํŠธ๋ฆผ ์ข…ํ•ฉ ์„ค์ •ํ•˜๊ธฐ
turbine:
  app-config: ingredient-service,taco-service,order-service,user-service
  cluster-name-expression: "'default'"
  • ์œ ๋ ˆ์นด์—์„œ ์ฐพ์„ ์„œ๋น„์Šค ์ด๋ฆ„๋“ค์„ ์„ค์ •ํ•œ๋‹ค.
  • ์ด๋ฆ„์ด default์ธ ํด๋Ÿฌ์Šคํ„ฐ์— ์žˆ๋Š” ๋ชจ๋“  ์ข…ํ•ฉ๋  ์ŠคํŠธ๋ฆผ์„ Turbine์ด ์ˆ˜์ง‘ํ•œ๋‹ค(cluster0name-expression)
  • ๋งŒ์•ฝ ์ด๋ฆ„์„ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ง€์ •๋œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค๋กœ๋ถ€ํ„ฐ ์ข…ํ•ฉ๋  ์–ด๋–ค ์ŠคํŠธ๋ฆผ ๋ฐ์ดํ„ฐ๋„ Turbine ์ŠคํŠธ๋ฆผ์— ํฌํ•จ์ด ์•ˆ๋œ๋‹ค.
  1. localhost:8989/turbine.stream ๋ฅผ ๋Œ€์‹œ๋ณด๋“œ์— ์ž…๋ ฅ

https://drek4537l1klr.cloudfront.net/walls7/Figures/15fig06_alt.jpg

์š”์•ฝ

  • ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ํŒจํ„ด์€ ์œ ์—ฐํ•œ ์‹คํŒจ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Hystrix๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰์— ์‹คํŒจํ•˜๊ฑฐ๋‚˜ ๋„ˆ๋ฌด ๋А๋ฆด ๋•Œ ํด๋ฐฑ ์ฒ˜๋ฆฌ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ํŒจํ„ด์„ ๊ตฌํ˜„ํ•œ๋‹ค
  • Hystrix๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ฐ ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ๋ชฉ์ ์œผ๋กœ Hystrix ์ŠคํŠธ๋ฆผ ๋งคํŠธ๋ฆญ์Šค๋ฅผ ๋ฐœํ–‰ํ•œ๋‹ค.
  • Hystrix ์ŠคํŠธ๋ฆผ์€ Hystrix ๋Œ€์‹œ๋ณด๋“œ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. Hystrix ๋Œ€์‹œ๋ณด๋“œ๋Š” ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ๋งคํŠธ๋ฆญ์Šค๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‹ค.
  • Turbine์„ ์‚ฌ์šฉํ•˜๋ฉด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค์—์„œ ๋ฐœํ–‰์ด ๋˜๋Š” ์ŠคํŠธ๋ฆผ์„ ํ•˜๋‚˜๋กœ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ 

  1. Hystrix ํŒจํ„ด์— ๋Œ€ํ•œ ๋” ์ž์„ธํ•œ ์„ค๋ช…

(Spring Cloud) Hystrix

  1. Hystrix ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ ์šฐ์•„ํ•œ ํ˜•์ œ๋“ค์˜ ์‹ค์ œ ๊ฐœ๋ฐœ ์‚ฌ๋ก€

Hystrix! API Gateway๋ฅผ ๋„์™€์ค˜! - ์šฐ์•„ํ•œํ˜•์ œ๋“ค ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ

  1. ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” Hystrix ๊ตฌํ˜„ ์˜ˆ์ œ

Hystrix Circuit Breaker Pattern - Spring Cloud - HowToDoInJava

โš ๏ธ **GitHub.com Fallback** โš ๏ธ