{"id":39216,"date":"2023-07-31T13:50:33","date_gmt":"2023-07-31T04:50:33","guid":{"rendered":"https:\/\/8gfg.shop\/blog\/?p=39216"},"modified":"2023-07-31T13:50:33","modified_gmt":"2023-07-31T04:50:33","slug":"fault-tolerance-of-web-backend-services-strategies-for-resiliency","status":"publish","type":"post","link":"https:\/\/8gfg.shop\/blog\/development\/fault-tolerance-of-web-backend-services-strategies-for-resiliency","title":{"rendered":"\uc6f9 \ubc31\uc5d4\ub4dc \uc11c\ube44\uc2a4\uc758 \uacb0\ud568 \ud5c8\uc6a9: \ud0c4\ub825\uc131 \ud655\ubcf4\ub97c \uc704\ud55c \uc804\ub7b5"},"content":{"rendered":"

\uc6f9 \ubc31\uc5d4\ub4dc \uc11c\ube44\uc2a4\uc758 \uacb0\ud568 \ud5c8\uc6a9<\/h1>\n

\uc6f9 \ubc31\uc5d4\ub4dc \uc11c\ube44\uc2a4\uc758 \uacb0\ud568 \ud5c8\uc6a9\uc740 \ubaa8\ub4e0 \uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0 \uc788\uc5b4\uc11c \uc911\uc694\ud55c \uc774\uc288 \uc911 \ud558\ub098\uc785\ub2c8\ub2e4. \uc644\ubcbd\ud55c \uc2dc\uc2a4\ud15c\uc740 \uc874\uc7ac\ud558\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \uc2dc\uc2a4\ud15c\uc758 \uacb0\ud568\uc744 \ubbf8\ub9ac \uc608\uce21\ud558\uace0, \uadf8 \uacb0\ud568\uc744 \ud5c8\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \uc2dc\uc2a4\ud15c\uc758 \ud0c4\ub825\uc131\uc744 \ud655\ubcf4\ud558\uace0, \uc11c\ube44\uc2a4\uc758 \uc9c0\uc18d\uc801\uc778 \uac00\uc6a9\uc131\uc744 \ubcf4\uc7a5\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n

\ud0c4\ub825\uc131 \ud655\ubcf4\ub97c \uc704\ud55c \uc804\ub7b5<\/h2>\n

\ud0c4\ub825\uc131\uc740 \uc2dc\uc2a4\ud15c\uc774 \uace0\uc7a5, \uc7a5\uc560, \ubd80\ud558 \ub4f1\uc758 \uc0c1\ud669\uc5d0\uc11c\ub3c4 \uc815\uc0c1\uc801\uc73c\ub85c \ub3d9\uc791\ud560 \uc218 \uc788\ub294 \ub2a5\ub825\uc744 \ub9d0\ud569\ub2c8\ub2e4. \uacb0\ud568 \ud5c8\uc6a9\uc740 \uc2dc\uc2a4\ud15c\uc758 \ud0c4\ub825\uc131\uc744 \ud655\ubcf4\ud558\uae30 \uc704\ud55c \uc804\ub7b5 \uc911 \ud558\ub098\uc785\ub2c8\ub2e4. \uacb0\ud568 \ud5c8\uc6a9\uc744 \ud1b5\ud574 \uc2dc\uc2a4\ud15c\uc740 \ubd80\ud558\ub098 \uace0\uc7a5 \ub4f1\uc758 \uc0c1\ud669\uc5d0\uc11c\ub3c4 \uc77c\ubd80 \ub610\ub294 \uc804\uccb4 \uae30\ub2a5\uc744 \uacc4\uc18d \uc81c\uacf5\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n

\uc774\ub97c \uc704\ud574 \uacb0\ud568 \ud5c8\uc6a9 \uc804\ub7b5\uc740 \uc11c\ube44\uc2a4\uc758 \uac00\uc6a9\uc131, \ud655\uc7a5\uc131, \ubcf5\uad6c\uc131, \uc548\uc815\uc131 \ub4f1\uc744 \uace0\ub824\ud558\uc5ec \uc124\uacc4\ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4. \uacb0\ud568 \ud5c8\uc6a9 \uc804\ub7b5\uc740 \uc2dc\uc2a4\ud15c\uc758 \uad6c\uc870, \uc544\ud0a4\ud14d\ucc98, \ud504\ub85c\uc138\uc2a4 \ub4f1\uc5d0 \ub300\ud55c \uc804\ubc18\uc801\uc778 \uc774\ud574\uac00 \ud544\uc694\ud569\ub2c8\ub2e4.<\/p>\n

\uacb0\ud568 \ud5c8\uc6a9\uc758 \uac1c\ub150\uacfc \uc774\uc810<\/h2>\n

\uacb0\ud568 \ud5c8\uc6a9\uc740 \uc2dc\uc2a4\ud15c\uc758 \uacb0\ud568\uc744 \ubbf8\ub9ac \uc608\uce21\ud558\uace0, \uadf8 \uacb0\ud568\uc744 \uc77c\ubd80 \ub610\ub294 \uc804\ubd80 \ud5c8\uc6a9\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. \uacb0\ud568 \ud5c8\uc6a9\uc740 \uc2dc\uc2a4\ud15c\uc758 \uac00\uc6a9\uc131, \ud655\uc7a5\uc131, \ubcf5\uad6c\uc131, \uc548\uc815\uc131 \ub4f1\uc758 \uc774\uc810\uc744 \uac00\uc9d1\ub2c8\ub2e4.<\/p>\n

\uccab\uc9f8, \uac00\uc6a9\uc131: \uacb0\ud568 \ud5c8\uc6a9\uc744 \ud1b5\ud574 \uc2dc\uc2a4\ud15c\uc740 \uc77c\ubd80 \ub610\ub294 \uc804\uccb4 \uae30\ub2a5\uc744 \uacc4\uc18d \uc81c\uacf5\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \uc11c\ube44\uc2a4\uc758 \uac00\uc6a9\uc131\uc744 \ud655\ubcf4\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n

\ub458\uc9f8, \ud655\uc7a5\uc131: \uacb0\ud568 \ud5c8\uc6a9\uc744 \ud1b5\ud574 \uc2dc\uc2a4\ud15c\uc740 \ubd80\ud558\ub098 \uace0\uc7a5 \ub4f1\uc758 \uc0c1\ud669\uc5d0\uc11c\ub3c4 \uc815\uc0c1\uc801\uc73c\ub85c \ub3d9\uc791\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \uc11c\ube44\uc2a4\uc758 \ud655\uc7a5\uc131\uc744 \ubcf4\uc7a5\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n

\uc14b\uc9f8, \ubcf5\uad6c\uc131: \uacb0\ud568 \ud5c8\uc6a9\uc744 \ud1b5\ud574 \uc2dc\uc2a4\ud15c\uc740 \uace0\uc7a5\uc744 \ub300\uc751\ud558\uace0 \ub370\uc774\ud130\ub97c \ubcf5\uad6c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \uc11c\ube44\uc2a4\uc758 \ubcf5\uad6c\uc131\uc744 \ubcf4\uc7a5\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n

\ub137\uc9f8, \uc548\uc815\uc131: \uacb0\ud568 \ud5c8\uc6a9\uc744 \ud1b5\ud574 \uc2dc\uc2a4\ud15c\uc740 \uc548\uc815\uc801\uc73c\ub85c \ub3d9\uc791\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \uc11c\ube44\uc2a4\uc758 \uc548\uc815\uc131\uc744 \ubcf4\uc7a5\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n

\uacb0\ud568 \ud5c8\uc6a9 \ubc29\ubc95\uacfc \uad6c\ud604 \ubc29\uc548<\/h2>\n

\uacb0\ud568 \ud5c8\uc6a9 \ubc29\ubc95\uc740 \ub2e4\uc591\ud569\ub2c8\ub2e4. \uc774\ubc88\uc5d0\ub294 \uba87 \uac00\uc9c0 \ub300\ud45c\uc801\uc778 \uacb0\ud568 \ud5c8\uc6a9 \ubc29\ubc95\uacfc \uadf8 \uad6c\ud604 \ubc29\uc548\uc5d0 \ub300\ud574 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n

1. Circuit Breaker<\/h3>\n

Circuit Breaker\ub294 \uc11c\ube44\uc2a4 \uac04\uc758 \ud638\ucd9c\uc5d0\uc11c \ubc1c\uc0dd\ud560 \uc218 \uc788\ub294 \ubb38\uc81c\ub97c \uc608\uce21\ud558\uace0, \uc774\ub97c \ucc98\ub9ac\ud558\ub294 \ud328\ud134\uc785\ub2c8\ub2e4. Circuit Breaker\ub294 \ub2e4\ub978 \uc11c\ube44\uc2a4\uc640\uc758 \uc5f0\ub3d9\uc5d0\uc11c \uc7a5\uc560 \ubc1c\uc0dd \uc2dc \uc790\ub3d9\uc73c\ub85c \uadf8 \uc11c\ube44\uc2a4\uc5d0 \ub300\ud55c \ud638\ucd9c\uc744 \ub04a\uc5b4\ubc84\ub9ac\uace0, \uc7a5\uc560\uac00 \ud574\uacb0\ub420 \ub54c\uae4c\uc9c0 \ub2e4\uc2dc \uc774\ub97c \ud638\ucd9c\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \uc11c\ube44\uc2a4\uc758 \uc548\uc815\uc131\uc744 \ud655\ubcf4\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n

public class CircuitBreaker {\n  private int failureThreshold;\n  private int failureCount;\n\n  public CircuitBreaker(int threshold) {\n    this.failureThreshold = threshold;\n    this.failureCount = 0;\n  }\n\n  public void execute(Runnable task) {\n    try {\n      \/\/ \uc11c\ube44\uc2a4 \ud638\ucd9c\n      task.run();\n      \/\/ \uc11c\ube44\uc2a4 \ud638\ucd9c \uc131\uacf5\n      failureCount = 0;\n    } catch (Exception e) {\n      \/\/ \uc11c\ube44\uc2a4 \ud638\ucd9c \uc2e4\ud328\n      failureCount++;\n      if (failureCount >= failureThreshold) {\n        \/\/ Circuit Breaker \uc791\ub3d9\n        throw new RuntimeException(\"Circuit Breaker is Open\");\n      }\n    }\n  }\n}<\/code><\/pre>\n

2. Fallback<\/h3>\n

Fallback\uc740 \uc11c\ube44\uc2a4 \ud638\ucd9c \uc2dc \uc7a5\uc560\uac00 \ubc1c\uc0dd\ud558\uba74 \ub300\uccb4 \ub85c\uc9c1\uc73c\ub85c \ub300\uc751\ud558\ub294 \ud328\ud134\uc785\ub2c8\ub2e4. Fallback\uc740 \ubcf4\ud1b5 \uae30\ubcf8\uac12, \uce90\uc2f1, \ub2e4\ub978 \uc11c\ube44\uc2a4\uc758 \ud638\ucd9c \ub4f1\uc73c\ub85c \ub300\uccb4 \ub85c\uc9c1\uc744 \ucc98\ub9ac\ud569\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \uc11c\ube44\uc2a4\uc758 \uac00\uc6a9\uc131\uc744 \ud655\ubcf4\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n

public class Fallback {\n  public String execute() {\n    try {\n      \/\/ \uc11c\ube44\uc2a4 \ud638\ucd9c\n      return invokeService();\n    } catch (Exception e) {\n      \/\/ \uc11c\ube44\uc2a4 \ud638\ucd9c \uc2e4\ud328 \uc2dc \ub300\uccb4 \ub85c\uc9c1 \uc2e4\ud589\n      return fallback();\n    }\n  }\n\n  private String invokeService() throws Exception {\n    \/\/ \uc11c\ube44\uc2a4 \ud638\ucd9c\n    return \"normal response\";\n  }\n\n  private String fallback() {\n    \/\/ \ub300\uccb4 \ub85c\uc9c1 \uc2e4\ud589\n    return \"fallback response\";\n  }\n}<\/code><\/pre>\n

3. Graceful degradation<\/h3>\n

Graceful degradation\uc740 \uc11c\ube44\uc2a4\uc758 \ubd80\ud558\uac00 \uc99d\uac00\ud560 \ub54c \uc77c\uc2dc\uc801\uc73c\ub85c \uae30\ub2a5\uc774 \uc81c\ud55c\ub428\uc73c\ub85c\uc368 \uc804\uccb4\uc801\uc778 \uc11c\ube44\uc2a4\uc758 \uc548\uc815\uc131\uc744 \ud655\ubcf4\ud558\ub294 \ud328\ud134\uc785\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \uc804\uccb4\uc801\uc778 \uc11c\ube44\uc2a4\uc758 \uc131\ub2a5\uc774 \ub5a8\uc5b4\uc9c8 \ub54c\ub294 \uc77c\ubd80 \uae30\ub2a5\uc744 \uc81c\ud55c\ud558\uac70\ub098 \uac04\uc18c\ud654\ud558\uc5ec \uc11c\ube44\uc2a4\uc758 \uc548\uc815\uc131\uc744 \uc720\uc9c0\ud569\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \uc11c\ube44\uc2a4\uc758 \ud0c4\ub825\uc131\uc744 \ud655\ubcf4\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n

public class GracefulDegradation {\n  public String execute() {\n    try {\n      if (isOverloaded()) {\n        \/\/ \uc77c\ubd80 \uae30\ub2a5 \uc81c\ud55c\n        return \"limited response\";\n      } else {\n        \/\/ \uc11c\ube44\uc2a4 \ud638\ucd9c\n        return invokeService();\n      }\n    } catch (Exception e) {\n      \/\/ \uc11c\ube44\uc2a4 \ud638\ucd9c \uc2e4\ud328 \uc2dc \ub300\uccb4 \ub85c\uc9c1 \uc2e4\ud589\n      return fallback();\n    }\n  }\n\n  private String invokeService() throws Exception {\n    \/\/ \uc11c\ube44\uc2a4 \ud638\ucd9c\n    return \"normal response\";\n  }\n\n  private String fallback() {\n    \/\/ \ub300\uccb4 \ub85c\uc9c1 \uc2e4\ud589\n    return \"fallback response\";\n  }\n\n  private boolean isOverloaded() {\n    \/\/ \ubd80\ud558 \uce21\uc815\n    return true;\n  }\n}<\/code><\/pre>\n

\uacb0\ub860<\/h2>\n

\uacb0\ud568 \ud5c8\uc6a9\uc740 \uc6f9 \ubc31\uc5d4\ub4dc \uc11c\ube44\uc2a4\uc5d0\uc11c \uc911\uc694\ud55c \uc774\uc288 \uc911 \ud558\ub098\uc785\ub2c8\ub2e4. \uacb0\ud568 \ud5c8\uc6a9\uc744 \ud1b5\ud574 \uc2dc\uc2a4\ud15c\uc758 \ud0c4\ub825\uc131\uc744 \ud655\ubcf4\ud558\uace0, \uc11c\ube44\uc2a4\uc758 \uc9c0\uc18d\uc801\uc778 \uac00\uc6a9\uc131\uc744 \ubcf4\uc7a5\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uacb0\ud568 \ud5c8\uc6a9 \uc804\ub7b5\uc740 \uc11c\ube44\uc2a4\uc758 \uac00\uc6a9\uc131, \ud655\uc7a5\uc131, \ubcf5\uad6c\uc131, \uc548\uc815\uc131 \ub4f1\uc744 \uace0\ub824\ud558\uc5ec \uc124\uacc4\ub418\uc5b4\uc57c \ud558\uba70, Circuit Breaker, Fallback, Graceful degradation \ub4f1\uc758 \ud328\ud134\uc744 \ud65c\uc6a9\ud558\uc5ec \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \uc6f9 \ubc31\uc5d4\ub4dc \uc11c\ube44\uc2a4\uc758 \uc548\uc815\uc131\uacfc \ud0c4\ub825\uc131\uc744 \ubcf4\uc7a5\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <\/p>\n

\"Web<\/p>\n","protected":false},"excerpt":{"rendered":"

\uc6f9 \ubc31\uc5d4\ub4dc \uc11c\ube44\uc2a4\uc758 \uacb0\ud568 \ud5c8\uc6a9: \ud0c4\ub825\uc131 \ud655\ubcf4\ub97c \uc704\ud55c \uc804\ub7b5<\/p>\n","protected":false},"author":1,"featured_media":12882,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1957],"tags":[5898,2105,6171,425,2188,2555,5979],"class_list":["post-39216","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development","tag-backend","tag-java","tag-msa","tag-open","tag-public","tag-task","tag-5979"],"acf":[],"_links":{"self":[{"href":"https:\/\/8gfg.shop\/blog\/wp-json\/wp\/v2\/posts\/39216","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/8gfg.shop\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/8gfg.shop\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/8gfg.shop\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/8gfg.shop\/blog\/wp-json\/wp\/v2\/comments?post=39216"}],"version-history":[{"count":1,"href":"https:\/\/8gfg.shop\/blog\/wp-json\/wp\/v2\/posts\/39216\/revisions"}],"predecessor-version":[{"id":39241,"href":"https:\/\/8gfg.shop\/blog\/wp-json\/wp\/v2\/posts\/39216\/revisions\/39241"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/8gfg.shop\/blog\/wp-json\/wp\/v2\/media\/12882"}],"wp:attachment":[{"href":"https:\/\/8gfg.shop\/blog\/wp-json\/wp\/v2\/media?parent=39216"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/8gfg.shop\/blog\/wp-json\/wp\/v2\/categories?post=39216"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/8gfg.shop\/blog\/wp-json\/wp\/v2\/tags?post=39216"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}