{"id":2686,"date":"2026-10-24T09:20:18","date_gmt":"2026-10-24T09:20:18","guid":{"rendered":"https:\/\/wayhope.kro.kr\/?p=2686"},"modified":"2026-10-24T09:20:41","modified_gmt":"2026-10-24T09:20:41","slug":"%eb%b6%84%ec%82%b0-%ea%b8%b0%eb%8a%a5-pub-sub-redis-streams-%eb%b6%84%ec%82%b0-%eb%9d%bd%ea%b3%bc-%ec%84%9c%eb%b2%84-%ea%b0%84-%ec%9d%b4%eb%b2%a4%ed%8a%b8-%ec%a0%84%eb%8b%ac","status":"publish","type":"post","link":"https:\/\/wayhope.kro.kr\/?p=2686","title":{"rendered":"Redis \ubd84\uc0b0 \uae30\ub2a5 #Pub\/Sub, Redis Streams, \ubd84\uc0b0 \ub77d\uacfc \uc11c\ubc84 \uac04 \uc774\ubca4\ud2b8 \uc804\ub2ec"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">\ubd84\uc0b0 \uae30\ub2a5\uc774\ub780?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e8\uc77c \uc11c\ubc84\uc5d0\uc11c\ub294 \uba54\ubaa8\ub9ac\uc640 \ud568\uc218 \ud638\ucd9c\ub9cc\uc73c\ub85c \ucc98\ub9ac\ud560 \uc218 \uc788\ub294 \uc791\uc5c5\ub3c4 \uc11c\ubc84\uac00 \uc5ec\ub7ec \ub300\ub85c \ub298\uc5b4\ub098\uba74 \ubcf5\uc7a1\ud574\uc9c4\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \uc2e4\uc2dc\uac04 \uba40\ud2f0\ud50c\ub808\uc774 \uac8c\uc784 \uc11c\ubc84\uac00 \uc5ec\ub7ec \ub300 \uc6b4\uc601\ub418\uace0 \uc788\ub2e4\uace0 \uac00\uc815\ud558\uc790. \ud55c \uc11c\ubc84\uc5d0\uc11c \ud50c\ub808\uc774\uc5b4\uac00 \uac8c\uc784\uc744 \uc885\ub8cc\ud588\uc744 \ub54c, \ub2e4\ub978 \uc11c\ubc84\uc758 \uce5c\uad6c \ubaa9\ub85d \uc11c\ube44\uc2a4\uc640 \ub85c\ube44 \uc11c\ube44\uc2a4\ub3c4 \ud574\ub2f9 \ud50c\ub808\uc774\uc5b4\uc758 \uc0c1\ud0dc \ubcc0\uacbd\uc744 \uc54c\uc544\uc57c \ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uac01 \uc11c\ubc84\ub294 \uc11c\ub85c \ub2e4\ub978 \ud504\ub85c\uc138\uc2a4\uc5d0\uc11c \uc2e4\ud589\ub418\ubbc0\ub85c \ud55c \uc11c\ubc84\uc758 \uba54\ubaa8\ub9ac\ub97c \ub2e4\ub978 \uc11c\ubc84\uac00 \uc9c1\uc811 \ucc38\uc870\ud560 \uc218 \uc5c6\ub2e4. \uc774 \ubb38\uc81c\ub97c \ud574\uacb0\ud558\ub824\uba74 \uc11c\ubc84 \uac04 \uba54\uc2dc\uc9c0 \uc804\ub2ec, \uc774\ubca4\ud2b8 \uc800\uc7a5 \ubc0f \uc7ac\ucc98\ub9ac, \ub3d9\uc2dc \uc791\uc5c5 \uc81c\uc5b4\ub97c \uc704\ud55c \ubd84\uc0b0 \uae30\ub2a5\uc774 \ud544\uc694\ud558\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub300\ud45c\uc801\uc778 \uae30\ub2a5\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Pub\/Sub<\/strong>: \uba54\uc2dc\uc9c0\ub97c \uad6c\ub3c5\uc790\uc5d0\uac8c \uc2e4\uc2dc\uac04\uc73c\ub85c \uc804\ub2ec\ud55c\ub2e4.<\/li>\n\n\n\n<li><strong>Redis Streams<\/strong>: \uba54\uc2dc\uc9c0\ub97c \uc800\uc7a5\ud558\uace0 \uc18c\ube44\uc790\uac00 \uc77d\uac70\ub098 \uc7ac\ucc98\ub9ac\ud560 \uc218 \uc788\ub3c4\ub85d \ud55c\ub2e4.<\/li>\n\n\n\n<li><strong>\ubd84\uc0b0 \ub77d<\/strong>: \uc5ec\ub7ec \uc11c\ubc84\uac00 \uacf5\uc720 \uc790\uc6d0\uc5d0 \ub3d9\uc2dc\uc5d0 \uc811\uadfc\ud558\ub294 \uc0c1\ud669\uc744 \uc81c\uc5b4\ud55c\ub2e4.<\/li>\n\n\n\n<li><strong>\uc11c\ubc84 \uac04 \uc774\ubca4\ud2b8 \uc804\ub2ec<\/strong>: \uc11c\ubc84 \uac04 \uacb0\ud569\ub3c4\ub97c \ub0ae\ucd94\uace0 \uc0c1\ud0dc \ubcc0\uacbd\uc744 \uc804\ud30c\ud55c\ub2e4.<\/li>\n\n\n\n<li><strong>\uc911\ubcf5 \ucc98\ub9ac\uc640 \uc7a5\uc560 \ub300\uc751<\/strong>: \uba54\uc2dc\uc9c0 \uc7ac\uc804\ub2ec, \uc11c\ubc84 \uc7a5\uc560, \ub124\ud2b8\uc6cc\ud06c \ub2e8\uc808\uc5d0 \ub300\ube44\ud55c\ub2e4.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uae30\ub2a5\ub4e4\uc740 \uc11c\ub85c \ub300\uccb4 \uad00\uacc4\uac00 \uc544\ub2c8\ub2e4. \uac01\uac01 \ud574\uacb0\ud558\ub824\ub294 \ubb38\uc81c\uac00 \ub2e4\ub974\uba70, \uc2e4\uc81c \uc2dc\uc2a4\ud15c\uc5d0\uc11c\ub294 \uc5ec\ub7ec \uae30\ub2a5\uc744 \uc870\ud569\ud574\uc11c \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Pub\/Sub<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Pub\/Sub\uc758 \uac1c\ub150<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Pub\/Sub(Publish\/Subscribe)\ub294 \uba54\uc2dc\uc9c0\ub97c \ubc1c\ud589\ud558\ub294 \uc8fc\uccb4\uc640 \uba54\uc2dc\uc9c0\ub97c \uc218\uc2e0\ud558\ub294 \uc8fc\uccb4\ub97c \ubd84\ub9ac\ud558\ub294 \uba54\uc2dc\uc9d5 \ud328\ud134\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ubc1c\ud589\uc790\ub294 \uba54\uc2dc\uc9c0\ub97c \uc9c1\uc811 \uc218\uc2e0\uc790\uc5d0\uac8c \uc804\ub2ec\ud558\uc9c0 \uc54a\uace0 \ud2b9\uc815 \ucc44\ub110\uc5d0 \ubc1c\ud589\ud55c\ub2e4. \ud574\ub2f9 \ucc44\ub110\uc744 \uad6c\ub3c5 \uc911\uc778 \uc18c\ube44\uc790\ub294 \uba54\uc2dc\uc9c0\ub97c \uc804\ub2ec\ubc1b\ub294\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;\uac8c\uc784 \uc11c\ubc84 A]\n      |\n      | Publish\n      v\n&#91;Redis Channel]\n      |\n      +-----------&gt; &#91;\uce5c\uad6c \uc11c\ube44\uc2a4]\n      |\n      +-----------&gt; &#91;\ub85c\ube44 \uc11c\ubc84]\n      |\n      +-----------&gt; &#91;\uc54c\ub9bc \uc11c\ube44\uc2a4]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ubc1c\ud589\uc790\ub294 \uad6c\ub3c5\uc790\uac00 \uba87 \uac1c \uc874\uc7ac\ud558\ub294\uc9c0, \uac01 \uad6c\ub3c5\uc790\uac00 \uc5b4\ub5a4 \uc11c\ubc84\uc5d0\uc11c \uc2e4\ud589\ub418\ub294\uc9c0 \uc54c \ud544\uc694\uac00 \uc5c6\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uad6c\uc870\ub294 \uc11c\ubc84 \uac04 \uc758\uc874\uc131\uc744 \uc904\uc774\uace0 \uc0c8\ub85c\uc6b4 \uc18c\ube44\uc790\ub97c \ucd94\uac00\ud558\uae30 \uc27d\uac8c \ub9cc\ub4e0\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Redis Pub\/Sub \uad6c\ud604<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Redis\ub294 <code>PUBLISH<\/code>, <code>SUBSCRIBE<\/code> \uba85\ub839\uc73c\ub85c Pub\/Sub \uae30\ub2a5\uc744 \uc81c\uacf5\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Node.js\uc5d0\uc11c\ub294 <code>ioredis<\/code>\ub97c \uc0ac\uc6a9\ud574 \ub2e4\uc74c\uacfc \uac19\uc774 \uad6c\ud604\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\ubc1c\ud589\uc790<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import Redis from \"ioredis\";\n\nconst redis = new Redis(process.env.REDIS_URL);\n\nasync function publishPlayerOffline(playerId) {\n  await redis.publish(\n    \"player:offline\",\n    JSON.stringify({\n      playerId,\n      timestamp: Date.now(),\n    })\n  );\n}\n\nawait publishPlayerOffline(\"player-123\");<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uad6c\ub3c5\uc790<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import Redis from \"ioredis\";\n\nconst subscriber = new Redis(process.env.REDIS_URL);\n\nawait subscriber.subscribe(\"player:offline\");\n\nsubscriber.on(\"message\", async (channel, message) =&gt; {\n  if (channel !== \"player:offline\") {\n    return;\n  }\n\n  const event = JSON.parse(message);\n\n  console.log(\"\ud50c\ub808\uc774\uc5b4 \uc624\ud504\ub77c\uc778:\", event.playerId);\n\n  \/\/ \uce5c\uad6c \ubaa9\ub85d \ubc0f \ub85c\ube44 \uc0c1\ud0dc \uac31\uc2e0\n});<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc81c \uc6b4\uc601 \ud658\uacbd\uc5d0\uc11c\ub294 JSON \ud30c\uc2f1 \uc624\ub958, \uc774\ubca4\ud2b8 \uc2a4\ud0a4\ub9c8 \uac80\uc99d, \ube44\ub3d9\uae30 \ud578\ub4e4\ub7ec\uc758 \uc608\uc678 \ucc98\ub9ac\ub3c4 \ucd94\uac00\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Redis Pub\/Sub\uc758 \ud2b9\uc9d5<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Redis Pub\/Sub\uc740 \uad6c\ub3c5\uc790\uac00 \uc5f0\uacb0\ub418\uc5b4 \uc788\uc744 \ub54c \uba54\uc2dc\uc9c0\ub97c \uc2e4\uc2dc\uac04\uc73c\ub85c \uc804\ub2ec\ud558\ub294 \ub370 \uc801\ud569\ud558\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub7ec\ub098 <strong>\uba54\uc2dc\uc9c0 \uc804\ub2ec\uc744 \ubcf4\uc7a5\ud558\ub294 \uc601\uc18d\uc801\uc778 \ud050\ub294 \uc544\ub2c8\ub2e4.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uad6c\ub3c5\uc790\uac00 \uc5f0\uacb0\uc774 \ub04a\uae34 \ub3d9\uc548 \ubc1c\ud589\ub41c \uba54\uc2dc\uc9c0\ub294 \ub098\uc911\uc5d0 \uc7ac\uc811\uc18d\ud574\ub3c4 \ubc1b\uc744 \uc218 \uc5c6\ub2e4. \uba54\uc2dc\uc9c0\ub97c \ucc98\ub9ac\ud558\uc9c0 \ubabb\ud588\ub354\ub77c\ub3c4 Redis\uac00 \ud574\ub2f9 \uba54\uc2dc\uc9c0\ub97c \ubcf4\uad00\ud574 \uc8fc\uc9c0 \uc54a\ub294\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c \ub2e4\uc74c\uacfc \uac19\uc740 \uae30\ub2a5\uc5d0 \uc801\ud569\ud558\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc2e4\uc2dc\uac04 \ucc44\ud305 \uc54c\ub9bc<\/li>\n\n\n\n<li>\uc11c\ubc84 \uac04 \uc0c1\ud0dc \ubcc0\uacbd \ud1b5\uc9c0<\/li>\n\n\n\n<li>\ub85c\ube44 \ubaa9\ub85d \uac31\uc2e0 \uc54c\ub9bc<\/li>\n\n\n\n<li>\uc2e4\uc2dc\uac04 \ub300\uc2dc\ubcf4\ub4dc \uc5c5\ub370\uc774\ud2b8<\/li>\n\n\n\n<li>\uce90\uc2dc \ubb34\ud6a8\ud654 \ud1b5\uc9c0<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\ubc18\ub300\ub85c \uacb0\uc81c, \uc544\uc774\ud15c \uc9c0\uae09, \uac8c\uc784 \ubcf4\uc0c1 \uc815\uc0b0\ucc98\ub7fc \uba54\uc2dc\uc9c0 \uc720\uc2e4\uc774 \ud5c8\uc6a9\ub418\uc9c0 \uc54a\ub294 \uc791\uc5c5\uc5d0\ub294 Pub\/Sub\ub9cc\uc73c\ub85c \ucda9\ubd84\ud558\uc9c0 \uc54a\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Redis Streams<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Redis Streams\uc758 \uac1c\ub150<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Redis Streams\ub294 \uba54\uc2dc\uc9c0\ub97c \uc2a4\ud2b8\ub9bc\uc5d0 \uae30\ub85d\ud558\uace0, \uc18c\ube44\uc790\uac00 \ud574\ub2f9 \uba54\uc2dc\uc9c0\ub97c \uc77d\uc5b4 \ucc98\ub9ac\ud560 \uc218 \uc788\ub3c4\ub85d \ud558\ub294 \uc790\ub8cc\uad6c\uc870\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pub\/Sub\uacfc \ub2ec\ub9ac \uba54\uc2dc\uc9c0\uac00 Redis\uc5d0 \uc800\uc7a5\ub418\ubbc0\ub85c \uc18c\ube44\uc790\uac00 \uc77c\uc2dc\uc801\uc73c\ub85c \uc5f0\uacb0\ub418\uc9c0 \uc54a\uc558\ub354\ub77c\ub3c4 \uc774\ud6c4\uc5d0 \uba54\uc2dc\uc9c0\ub97c \uc77d\uc744 \uc218 \uc788\ub2e4. \ub2e8, \uba54\uc2dc\uc9c0\uac00 \uc0ad\uc81c\ub418\uac70\ub098 \ubcf4\uc874 \uc815\ucc45\uc5d0 \ub530\ub77c \uc81c\uac70\ub418\uc9c0 \uc54a\uc558\ub2e4\ub294 \uc804\uc81c\uac00 \ud544\uc694\ud558\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;\uac8c\uc784 \uc11c\ubc84]\n     |\n     | XADD\n     v\n&#91;Redis Stream]\n     |\n     +----&gt; &#91;Consumer A]\n     |\n     +----&gt; &#91;Consumer B]\n     |\n     +----&gt; &#91;Consumer Group]\n                  |\n                  +----&gt; &#91;Worker A]\n                  |\n                  +----&gt; &#91;Worker B]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Redis Streams\ub294 \uba54\uc2dc\uc9c0 ID\ub97c \uae30\uc900\uc73c\ub85c \uae30\ub85d\uc744 \uad00\ub9ac\ud55c\ub2e4. \uc18c\ube44\uc790\ub294 \ud2b9\uc815 ID \uc774\ud6c4\uc758 \uba54\uc2dc\uc9c0\ub97c \uc77d\uc744 \uc218 \uc788\uc73c\uba70, Consumer Group\uc744 \uc0ac\uc6a9\ud558\uba74 \uc5ec\ub7ec \uc6cc\ucee4\uac00 \uc791\uc5c5\uc744 \ub098\ub204\uc5b4 \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uba54\uc2dc\uc9c0 \ubc1c\ud589<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>XADD<\/code> \uba85\ub839\uc73c\ub85c \uc2a4\ud2b8\ub9bc\uc5d0 \uba54\uc2dc\uc9c0\ub97c \ucd94\uac00\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>XADD game:events * \\\n  type player_offline \\\n  playerId player-123<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>*<\/code>\ub294 Redis\uac00 \uace0\uc720\ud55c \uc2a4\ud2b8\ub9bc ID\ub97c \uc0dd\uc131\ud558\ub3c4\ub85d \uc9c0\uc815\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Node.js\uc5d0\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import Redis from \"ioredis\";\n\nconst redis = new Redis(process.env.REDIS_URL);\n\nasync function publishGameEvent(event) {\n  return redis.xadd(\n    \"game:events\",\n    \"*\",\n    \"type\", event.type,\n    \"playerId\", event.playerId,\n    \"timestamp\", String(Date.now())\n  );\n}\n\nawait publishGameEvent({\n  type: \"player_offline\",\n  playerId: \"player-123\",\n});<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Consumer Group<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Consumer Group\uc740 \uc5ec\ub7ec \uc18c\ube44\uc790\uac00 \ud558\ub098\uc758 \uc2a4\ud2b8\ub9bc\uc744 \ubd84\ub2f4\ud574 \ucc98\ub9ac\ud558\ub3c4\ub85d \uad6c\uc131\ud558\ub294 \uae30\ub2a5\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \ubcf4\uc0c1 \uc9c0\uae09 \uc791\uc5c5\uc744 \uc5ec\ub7ec \uc6cc\ucee4\uc5d0 \ubd84\uc0b0\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;game:events]\n      |\n      v\n&#91;Consumer Group: reward-workers]\n      |\n      +----&gt; &#91;Worker A]\n      |\n      +----&gt; &#91;Worker B]\n      |\n      +----&gt; &#91;Worker C]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub3d9\uc77c\ud55c Consumer Group \uc548\uc5d0\uc11c\ub294 \uc77c\ubc18\uc801\uc73c\ub85c \ud558\ub098\uc758 \uc0c8 \uba54\uc2dc\uc9c0\ub97c \ud55c \uc18c\ube44\uc790\uac00 \ud560\ub2f9\ubc1b\uc544 \ucc98\ub9ac\ud55c\ub2e4. \uc11c\ub85c \ub2e4\ub978 Consumer Group\uc740 \ub3d9\uc77c\ud55c \uc2a4\ud2b8\ub9bc\uc758 \uba54\uc2dc\uc9c0\ub97c \uac01\uc790 \ub3c5\ub9bd\uc801\uc73c\ub85c \uc18c\ube44\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 <code>reward-workers<\/code> \uadf8\ub8f9\uc740 \ubcf4\uc0c1\uc744 \uc9c0\uae09\ud558\uace0, <code>analytics-workers<\/code> \uadf8\ub8f9\uc740 \ud1b5\uacc4\ub97c \uc218\uc9d1\ud558\ub3c4\ub85d \uad6c\uc131\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uba54\uc2dc\uc9c0 \uc77d\uae30\uc640 ACK<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Consumer Group\uc5d0\uc11c\ub294 <code>XREADGROUP<\/code>\uc73c\ub85c \uba54\uc2dc\uc9c0\ub97c \uc77d\uace0, \ucc98\ub9ac\uac00 \uc644\ub8cc\ub418\uba74 <code>XACK<\/code>\uc73c\ub85c \uc644\ub8cc \uc0ac\uc2e4\uc744 \uae30\ub85d\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>XREADGROUP GROUP reward-workers worker-a\n  COUNT 10\n  BLOCK 5000\n  STREAMS game:events &gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc704 \uba85\ub839\uc740 \uadf8\ub8f9\uc5d0\uc11c \uc544\uc9c1 \uc804\ub2ec\ub418\uc9c0 \uc54a\uc740 \uc0c8 \uba54\uc2dc\uc9c0\ub97c \ucd5c\ub300 \uc5f4 \uac1c\uae4c\uc9c0 \uc77d\uace0, \uc0c8 \uba54\uc2dc\uc9c0\uac00 \uc5c6\uc73c\uba74 \ucd5c\ub300 \uba87 \ucd08\uac04 \ub300\uae30\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ucc98\ub9ac\uac00 \ub05d\ub09c \uba54\uc2dc\uc9c0\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \ud655\uc778\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>XACK game:events reward-workers 1729780000000-0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc81c \uba54\uc2dc\uc9c0 ID\ub294 \uba54\uc2dc\uc9c0\ub97c \uc77d\uc744 \ub54c \ubc18\ud658\ub41c \uac12\uc744 \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ACK\ub97c \ubcf4\ub0b4\uae30 \uc804\uc5d0 \uc18c\ube44\uc790\uac00 \uc885\ub8cc\ub418\uba74 \uba54\uc2dc\uc9c0\ub294 \ubbf8\ud655\uc778 \uc0c1\ud0dc\uc778 Pending Entries List(PEL)\uc5d0 \ub0a8\uc744 \uc218 \uc788\ub2e4. \ub2e4\ub978 \uc18c\ube44\uc790\uac00 \uc77c\uc815 \uc2dc\uac04\uc774 \uc9c0\ub09c \uba54\uc2dc\uc9c0\ub97c <code>XAUTOCLAIM<\/code> \ub4f1\uc758 \uba85\ub839\uc73c\ub85c \ud68c\uc218\ud574 \uc7ac\ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uad6c\uc870\ub294 \uc7a5\uc560 \ubcf5\uad6c\uc5d0 \uc720\ub9ac\ud558\uc9c0\ub9cc, \uba54\uc2dc\uc9c0\uac00 \ud55c \ubc88\ub9cc \ucc98\ub9ac\ub41c\ub2e4\ub294 \ub73b\uc740 \uc544\ub2c8\ub2e4. \uc791\uc5c5 \uc218\ud589 \ud6c4 ACK \uc804\uc1a1 \uc804\uc5d0 \ud504\ub85c\uc138\uc2a4\uac00 \uc885\ub8cc\ub418\uba74 \ub3d9\uc77c\ud55c \uc791\uc5c5\uc774 \ub2e4\uc2dc \uc218\ud589\ub420 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c \uc18c\ube44\uc790\ub294 \uc911\ubcf5 \uc2e4\ud589\uc744 \uacac\ub51c \uc218 \uc788\ub3c4\ub85d \uc124\uacc4\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Redis Pub\/Sub\uacfc Streams \ube44\uad50<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>\ud56d\ubaa9<\/th><th>Redis Pub\/Sub<\/th><th>Redis Streams<\/th><\/tr><tr><td>\uba54\uc2dc\uc9c0 \uc800\uc7a5<\/td><td>\uc800\uc7a5\ud558\uc9c0 \uc54a\uc74c<\/td><td>\uc2a4\ud2b8\ub9bc\uc5d0 \uc800\uc7a5<\/td><\/tr><tr><td>\uc624\ud504\ub77c\uc778 \uc18c\ube44\uc790<\/td><td>\uba54\uc2dc\uc9c0 \uc720\uc2e4 \uac00\ub2a5<\/td><td>\ubcf4\uc874\ub41c \uba54\uc2dc\uc9c0 \uc7ac\uc870\ud68c \uac00\ub2a5<\/td><\/tr><tr><td>\uc18c\ube44 \uc644\ub8cc \ud655\uc778<\/td><td>\uae30\ubcf8 \uc81c\uacf5\ud558\uc9c0 \uc54a\uc74c<\/td><td>Consumer Group ACK \uc9c0\uc6d0<\/td><\/tr><tr><td>\ubbf8\ucc98\ub9ac \uba54\uc2dc\uc9c0 \ucd94\uc801<\/td><td>\uae30\ubcf8 \uc81c\uacf5\ud558\uc9c0 \uc54a\uc74c<\/td><td>PEL \uc9c0\uc6d0<\/td><\/tr><tr><td>\uc7a5\uc560 \ud6c4 \uc7ac\ucc98\ub9ac<\/td><td>\ubcc4\ub3c4 \uad6c\ud604 \ud544\uc694<\/td><td>\uc7ac\uc870\ud68c \ubc0f \uba54\uc2dc\uc9c0 \ud68c\uc218 \uac00\ub2a5<\/td><\/tr><tr><td>\uc8fc\uc694 \uc6a9\ub3c4<\/td><td>\uc2e4\uc2dc\uac04 \ud1b5\uc9c0<\/td><td>\ube44\ub3d9\uae30 \uc791\uc5c5\uacfc \uc774\ubca4\ud2b8 \ucc98\ub9ac<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Streams\ub3c4 \ubb34\uc81c\ud55c \ubcf4\uc874\ub418\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4. \uc2a4\ud2b8\ub9bc \uae38\uc774 \uc81c\ud55c, \uba85\uc2dc\uc801 \uc0ad\uc81c, \uba54\ubaa8\ub9ac \ubd80\uc871\uc5d0 \ub530\ub978 \uc6b4\uc601 \uc815\ucc45 \ub4f1\uc73c\ub85c \uba54\uc2dc\uc9c0\uac00 \uc81c\uac70\ub420 \uc218 \uc788\ub2e4. \uc911\uc694\ud55c \uc774\ubca4\ud2b8\ub77c\uba74 \ubcf4\uc874 \uae30\uac04\uacfc \uc601\uc18d\uc131 \uc124\uc815\uae4c\uc9c0 \uc124\uacc4\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ubd84\uc0b0 \ub77d\uacfc \ud55c\uacc4<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\ubd84\uc0b0 \ub77d\uc774 \ud544\uc694\ud55c \uc774\uc720<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc77c\ubc18\uc801\uc778 \ud504\ub85c\uc138\uc2a4 \ub0b4\ubd80\uc5d0\uc11c\ub294 Mutex\ub098 Lock\uc73c\ub85c \uacf5\uc720 \uc790\uc6d0\uc5d0 \ub300\ud55c \ub3d9\uc2dc \uc811\uadfc\uc744 \uc81c\uc5b4\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud558\uc9c0\ub9cc \uc11c\ubc84\uac00 \uc5ec\ub7ec \ub300\ub77c\uba74 \uac01 \uc11c\ubc84\uc758 \uba54\ubaa8\ub9ac\uc5d0 \uc874\uc7ac\ud558\ub294 \ub77d\uc740 \uc11c\ub85c \ub3c5\ub9bd\uc801\uc774\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;\uc11c\ubc84 A]                 &#91;\uc11c\ubc84 B]\n Mutex A                  Mutex B\n    |                        |\n    +------ \uacf5\uc720 \uc790\uc6d0 --------+<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84 A\uac00 \ub77d\uc744 \ud68d\ub4dd\ud574\ub3c4 \uc11c\ubc84 B\ub294 \uc790\uc2e0\uc758 Mutex\ub97c \ud68d\ub4dd\ud560 \uc218 \uc788\ub2e4. \ub450 \uc11c\ubc84\uac00 \ub3d9\uc2dc\uc5d0 \uac19\uc740 \uc791\uc5c5\uc744 \uc218\ud589\ud560 \uc218 \uc788\ub2e4\ub294 \uc758\ubbf8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ubd84\uc0b0 \ub77d\uc740 \uc5ec\ub7ec \ud504\ub85c\uc138\uc2a4\ub098 \uc11c\ubc84\uac00 \uacf5\uc720\ud558\ub294 \uc870\uc815 \uc218\ub2e8\uc744 \ud1b5\ud574 \ud2b9\uc815 \uc791\uc5c5\uc744 \ud55c \ubc88\uc5d0 \ud55c \uc8fc\uccb4\ub9cc \uc218\ud589\ud558\ub3c4\ub85d \uc720\ub3c4\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \ub2e4\uc74c \uc791\uc5c5\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ud2b9\uc815 \uacc4\uc815\uc758 \uc815\uc0b0 \uc791\uc5c5<\/li>\n\n\n\n<li>\uc911\ubcf5\ub41c \uc2a4\ucf00\uc904 \uc791\uc5c5 \ubc29\uc9c0<\/li>\n\n\n\n<li>\ub3d9\uc77c\ud55c \ub370\uc774\ud130\uc758 \ub3d9\uc2dc \uac31\uc2e0 \uc81c\uc5b4<\/li>\n\n\n\n<li>\uc5ec\ub7ec \uc11c\ubc84\uc5d0\uc11c \uc2e4\ud589\ub418\ub294 \ubc30\uce58 \uc791\uc5c5\uc758 \uc870\uc815<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e8, \uc794\uc561 \ubcc0\uacbd\uc774\ub098 \uc544\uc774\ud15c \uad6c\ub9e4\ucc98\ub7fc \uc815\ud655\uc131\uc774 \uc911\uc694\ud55c \uc791\uc5c5\uc740 \ubd84\uc0b0 \ub77d\ub9cc\uc73c\ub85c \ubcf4\ud638\ud558\uae30\ubcf4\ub2e4 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ud2b8\ub79c\uc7ad\uc158\uacfc \uc81c\uc57d \uc870\uac74\uc744 \ud568\uaed8 \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Redis\ub97c \uc774\uc6a9\ud55c \ub77d \ud68d\ub4dd<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Redis\uc5d0\uc11c\ub294 <code>SET<\/code> \uba85\ub839\uc758 <code>NX<\/code>, <code>PX<\/code> \uc635\uc158\uc744 \uc774\uc6a9\ud574 \ub77d\uc744 \ud68d\ub4dd\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SET lock:account:123 unique-token NX PX 10000<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>NX<\/code>: \ud0a4\uac00 \uc874\uc7ac\ud558\uc9c0 \uc54a\uc744 \ub54c\ub9cc \uc124\uc815\ud55c\ub2e4.<\/li>\n\n\n\n<li><code>PX<\/code>: \ub77d\uc758 \ub9cc\ub8cc \uc2dc\uac04\uc744 \ubc00\ub9ac\ucd08 \ub2e8\uc704\ub85c \uc124\uc815\ud55c\ub2e4.<\/li>\n\n\n\n<li><code>unique-token<\/code>: \ub77d\uc744 \ud68d\ub4dd\ud55c \uc8fc\uccb4\ub97c \uc2dd\ubcc4\ud558\ub294 \uace0\uc720\ud55c \uac12\uc774\ub2e4.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\uba85\ub839\uc774 \uc131\uacf5\ud558\uba74 \ub77d\uc744 \ud68d\ub4dd\ud55c \uac83\uc774\uace0, \ud0a4\uac00 \uc774\ubbf8 \uc874\uc7ac\ud558\uba74 \ud68d\ub4dd\uc5d0 \uc2e4\ud328\ud55c \uac83\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub9cc\ub8cc \uc2dc\uac04\uc740 \ub77d \uc18c\uc720\uc790\uac00 \ube44\uc815\uc0c1 \uc885\ub8cc\ub410\uc744 \ub54c \ub77d\uc774 \uc601\uad6c\uc801\uc73c\ub85c \ub0a8\ub294 \uc0c1\ud669\uc744 \ubc29\uc9c0\ud55c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ub77d \ud574\uc81c \uc2dc \uc8fc\uc758\uc810<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e4\uc74c\uacfc \uac19\uc740 \ubc29\uc2dd\uc740 \uc548\uc804\ud558\uc9c0 \uc54a\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GET lock:account:123\nDEL lock:account:123<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub77d\uc744 \ud655\uc778\ud55c \uc2dc\uc810\uacfc \uc0ad\uc81c\ud558\ub294 \uc2dc\uc810 \uc0ac\uc774\uc5d0 \ub2e4\ub978 \ud504\ub85c\uc138\uc2a4\uac00 \ub77d\uc744 \ub2e4\uc2dc \ud68d\ub4dd\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 A\uc758 \ub77d\uc774 \ub9cc\ub8cc\ub41c \ub4a4 B\uac00 \uc0c8 \ub77d\uc744 \ud68d\ub4dd\ud588\ub294\ub370, A\uac00 \ub4a4\ub2a6\uac8c <code>DEL<\/code>\uc744 \uc2e4\ud589\ud558\uba74 B\uc758 \ub77d\uae4c\uc9c0 \uc0ad\uc81c\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c \ub77d\uc744 \ud574\uc81c\ud560 \ub54c\ub294 \ud604\uc7ac \uc800\uc7a5\ub41c \ud1a0\ud070\uacfc \uc790\uc2e0\uc758 \ud1a0\ud070\uc774 \uc77c\uce58\ud558\ub294 \uacbd\uc6b0\uc5d0\ub9cc \uc0ad\uc81c\ud574\uc57c \ud55c\ub2e4. Redis\uc5d0\uc11c\ub294 Lua \uc2a4\ud06c\ub9bd\ud2b8\ub85c \ube44\uad50\uc640 \uc0ad\uc81c\ub97c \uc6d0\uc790\uc801\uc73c\ub85c \uc218\ud589\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if redis.call(\"GET\", KEYS&#91;1]) == ARGV&#91;1] then\n    return redis.call(\"DEL\", KEYS&#91;1])\nend\n\nreturn 0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uc2a4\ud06c\ub9bd\ud2b8\ub294 \ub77d \uc18c\uc720\uad8c\uc744 \ud655\uc778\ud558\uace0 \ud574\ub2f9 \ub77d\uc744 \uc0ad\uc81c\ud558\ub294 \uc791\uc5c5\uc744 \ud558\ub098\uc758 \uc6d0\uc790\uc801 \uc5f0\uc0b0\uc73c\ub85c \ucc98\ub9ac\ud55c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ubd84\uc0b0 \ub77d\uc758 \ud55c\uacc4<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ubd84\uc0b0 \ub77d\uc744 \uc0ac\uc6a9\ud558\ub354\ub77c\ub3c4 \ub3d9\uc2dc\uc131 \ubb38\uc81c\uac00 \uc644\uc804\ud788 \uc0ac\ub77c\uc9c0\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\ub77d \ub9cc\ub8cc \uc774\ud6c4\uc5d0\ub3c4 \uae30\uc874 \uc791\uc5c5\uc774 \uc2e4\ud589\ub420 \uc218 \uc788\ub2e4.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A\uac00 \ub77d\uc744 \ud68d\ub4dd\ud558\uace0 \uae34 \uc791\uc5c5\uc744 \uc218\ud589\ud558\ub294 \ub3c4\uc911 \ub77d\uc774 \ub9cc\ub8cc\ub410\ub2e4\uace0 \uac00\uc815\ud558\uc790. B\uac00 \uc0c8 \ub77d\uc744 \ud68d\ub4dd\ud574 \uac19\uc740 \uc791\uc5c5\uc744 \uc2dc\uc791\ud560 \uc218 \uc788\ub2e4. \uc774\ub54c A\uac00 \uacc4\uc18d \uc2e4\ud589\ub41c\ub2e4\uba74 \ub450 \uc791\uc5c5\uc774 \ub3d9\uc2dc\uc5d0 \uc218\ud589\ub41c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\ub124\ud2b8\uc6cc\ud06c \ub2e8\uc808\ub85c \uc18c\uc720\uad8c \ud310\ub2e8\uc774 \uc5b4\ub824\uc6b8 \uc218 \uc788\ub2e4.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84 A\uac00 Redis\uc640 \uc5f0\uacb0\ub418\uc9c0 \uc54a\uc558\ub354\ub77c\ub3c4 \uc774\ubbf8 \uc2dc\uc791\ud55c \uc791\uc5c5\uc744 \uacc4\uc18d \uc2e4\ud589\ud560 \uc218 \uc788\ub2e4. \ub77d \uc11c\ubc84\uac00 \ub77d\uc744 \ub9cc\ub8cc\uc2dc\ucf30\ub2e4\uba74 A\uc758 \uc791\uc5c5\uacfc \uc0c8\ub85c\uc6b4 \uc18c\uc720\uc790\uc758 \uc791\uc5c5\uc774 \uacb9\uce60 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\ub77d\uc740 \ube44\uc988\ub2c8\uc2a4 \ub370\uc774\ud130\uc758 \uc815\ud569\uc131\uc744 \uc9c1\uc811 \ubcf4\uc7a5\ud558\uc9c0 \uc54a\ub294\ub2e4.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub77d\uc774 \uc62c\ubc14\ub974\uac8c \uc791\ub3d9\ud558\ub354\ub77c\ub3c4 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ud2b8\ub79c\uc7ad\uc158\uc774 \uc2e4\ud328\ud558\uac70\ub098 \uc678\ubd80 API \uc694\uccad\uc774 \uc911\ubcf5 \uc2e4\ud589\ub420 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c \uac15\ud55c \uc815\ud569\uc131\uc774 \ud544\uc694\ud558\ub2e4\uba74 \ub2e4\uc74c \uae30\ubc95\uc744 \ud568\uaed8 \uace0\ub824\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ub370\uc774\ud130\ubca0\uc774\uc2a4 \ud2b8\ub79c\uc7ad\uc158<\/li>\n\n\n\n<li>\uc720\ub2c8\ud06c \uc81c\uc57d \uc870\uac74<\/li>\n\n\n\n<li>\ub099\uad00\uc801 \ub3d9\uc2dc\uc131 \uc81c\uc5b4\uc640 \ubc84\uc804 \ubc88\ud638<\/li>\n\n\n\n<li>\uc18c\uc720\uad8c \uc138\ub300 \ubc88\ud638\ub97c \uc0ac\uc6a9\ud558\ub294 Fencing Token<\/li>\n\n\n\n<li>\uba71\ub4f1\uc131 \ud0a4\ub97c \ud1b5\ud55c \uc911\ubcf5 \uc694\uccad \ubc29\uc9c0<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\ubd84\uc0b0 \ub77d\uc740 \ub3d9\uc2dc \uc2e4\ud589\uc744 \uc904\uc774\ub294 \uc870\uc815 \ub3c4\uad6c\uc774\uc9c0, \ubaa8\ub4e0 \uc7a5\uc560 \uc0c1\ud669\uc5d0\uc11c \uc791\uc5c5\uc758 \ub2e8\uc77c \uc2e4\ud589\uc744 \ubcf4\uc7a5\ud558\ub294 \ub9cc\ub2a5 \uc7a5\uce58\uac00 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\uc11c\ubc84 \uac04 \uc774\ubca4\ud2b8 \uc804\ub2ec<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\uc774\ubca4\ud2b8 \uae30\ubc18 \uad6c\uc870<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84 \uac04 \uc774\ubca4\ud2b8 \uc804\ub2ec\uc740 \ud2b9\uc815 \uc0c1\ud0dc \ubcc0\ud654\uac00 \ubc1c\uc0dd\ud588\uc744 \ub54c \uadf8 \uc0ac\uc2e4\uc744 \uc774\ubca4\ud2b8\ub85c \ubc1c\ud589\ud558\uace0, \uad00\uc2ec \uc788\ub294 \uc11c\ube44\uc2a4\uac00 \uc774\ubca4\ud2b8\ub97c \uad6c\ub3c5\ud574 \ud6c4\uc18d \uc791\uc5c5\uc744 \uc218\ud589\ud558\ub294 \uad6c\uc870\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \ud50c\ub808\uc774\uc5b4\uac00 \uac8c\uc784\uc5d0\uc11c \ud1f4\uc7a5\ud588\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"eventId\": \"evt-10001\",\n  \"type\": \"PlayerDisconnected\",\n  \"playerId\": \"player-123\",\n  \"sessionId\": \"session-456\",\n  \"occurredAt\": \"2026-10-24T09:00:00.000Z\"\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ubca4\ud2b8\ub97c \ubc1b\uc740 \uac01 \uc11c\ube44\uc2a4\ub294 \uc790\uc2e0\uc5d0\uac8c \ud544\uc694\ud55c \uc791\uc5c5\uc744 \uc218\ud589\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;\uac8c\uc784 \uc11c\ubc84]\n     |\n     | PlayerDisconnected\n     v\n&#91;\uc774\ubca4\ud2b8 \uc804\ub2ec \uacc4\uce35]\n     |\n     +----&gt; &#91;\uce5c\uad6c \uc11c\ube44\uc2a4: \uc628\ub77c\uc778 \uc0c1\ud0dc \uac31\uc2e0]\n     |\n     +----&gt; &#91;\ub85c\ube44 \uc11c\ube44\uc2a4: \ucc38\uac00\uc790 \ubaa9\ub85d \uac31\uc2e0]\n     |\n     +----&gt; &#91;\ud1b5\uacc4 \uc11c\ube44\uc2a4: \uc811\uc18d \uae30\ub85d \uc800\uc7a5]\n     |\n     +----&gt; &#91;\uc54c\ub9bc \uc11c\ube44\uc2a4: \ud544\uc694 \uc2dc \uc54c\ub9bc \uc804\uc1a1]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uac8c\uc784 \uc11c\ubc84\ub294 \uac01 \uc11c\ube44\uc2a4\uc758 \uad6c\ud604 \uc138\ubd80 \uc0ac\ud56d\uc744 \uc54c \ud544\uc694\uac00 \uc5c6\ub2e4. \uc0c8\ub85c\uc6b4 \uae30\ub2a5\uc774 \ucd94\uac00\ub418\ub354\ub77c\ub3c4 \uae30\uc874 \uac8c\uc784 \uc11c\ubc84\ub97c \uc9c1\uc811 \uc218\uc815\ud558\uc9c0 \uc54a\uace0 \uc0c8\ub85c\uc6b4 \uc18c\ube44\uc790\ub97c \uc5f0\uacb0\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uc774\ubca4\ud2b8\uc640 \uba85\ub839\uc758 \ucc28\uc774<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ubca4\ud2b8\ub294 \uc774\ubbf8 \ubc1c\uc0dd\ud55c \uc0ac\uc2e4\uc744 \ub098\ud0c0\ub0b4\uace0, \uba85\ub839\uc740 \ud2b9\uc815 \uc791\uc5c5\uc744 \uc218\ud589\ud558\ub77c\ub294 \uc694\uccad\uc744 \ub098\ud0c0\ub0b8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>\uad6c\ubd84<\/th><th>\uc774\ubca4\ud2b8<\/th><th>\uba85\ub839<\/th><\/tr><tr><td>\uc758\ubbf8<\/td><td>\uc5b4\ub5a4 \uc77c\uc774 \ubc1c\uc0dd\ud588\ub2e4<\/td><td>\uc5b4\ub5a4 \uc77c\uc744 \uc218\ud589\ud558\ub77c<\/td><\/tr><tr><td>\uc608\uc2dc<\/td><td><code>PlayerDisconnected<\/code><\/td><td><code>RemovePlayerFromRoom<\/code><\/td><\/tr><tr><td>\uad00\uc810<\/td><td>\uacfc\uac70\uc758 \uc0ac\uc2e4<\/td><td>\uc218\ud589\ud574\uc57c \ud560 \uc791\uc5c5<\/td><\/tr><tr><td>\ucc98\ub9ac \uc8fc\uccb4<\/td><td>\uad00\uc2ec \uc788\ub294 \uc18c\ube44\uc790\ub4e4<\/td><td>\uc9c0\uc815\ub41c \ucc98\ub9ac \uc8fc\uccb4<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ubca4\ud2b8 \uc774\ub984\uc740 \uc77c\ubc18\uc801\uc73c\ub85c <code>PlayerDisconnected<\/code>, <code>RewardGranted<\/code>\ucc98\ub7fc \uc774\ubbf8 \uc77c\uc5b4\ub09c \uc77c\uc744 \ud45c\ud604\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ubca4\ud2b8\ub97c \uc124\uacc4\ud560 \ub54c\ub294 \uc774\ubca4\ud2b8 ID, \uc774\ubca4\ud2b8 \uc885\ub958, \ubc1c\uc0dd \uc2dc\uac01, \ub300\uc0c1 \uc2dd\ubcc4\uc790, \uc2a4\ud0a4\ub9c8 \ubc84\uc804\uc744 \ud3ec\ud568\ud558\ub294 \uac83\uc774 \uc88b\ub2e4. \ub2e4\ub9cc \uc778\uc99d \ud1a0\ud070\uc774\ub098 \ube44\ubc00\ubc88\ud638 \uac19\uc740 \ubbfc\uac10\ud55c \uc815\ubcf4\ub97c \uc774\ubca4\ud2b8\uc5d0 \ud3ec\ud568\ud574\uc11c\ub294 \uc548 \ub41c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uc774\ubca4\ud2b8 \uc804\ub2ec \ubc29\uc2dd \uc120\ud0dd<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ubaa8\ub4e0 \uc774\ubca4\ud2b8\uc5d0 \uac19\uc740 \uc804\ub2ec \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud560 \ud544\uc694\ub294 \uc5c6\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Redis Pub\/Sub<\/strong>: \uc720\uc2e4\ub3fc\ub3c4 \uad1c\ucc2e\uc740 \uc2e4\uc2dc\uac04 \uc54c\ub9bc<\/li>\n\n\n\n<li><strong>Redis Streams<\/strong>: \uc800\uc7a5\uacfc \uc7ac\ucc98\ub9ac\uac00 \ud544\uc694\ud55c \ube44\ub3d9\uae30 \uc774\ubca4\ud2b8<\/li>\n\n\n\n<li><strong>\uba54\uc2dc\uc9c0 \ube0c\ub85c\ucee4<\/strong>: \ub300\uaddc\ubaa8 \uc774\ubca4\ud2b8 \ub77c\uc6b0\ud305\uacfc \uc18c\ube44\uc790 \ud655\uc7a5\uc774 \ud544\uc694\ud55c \ud658\uacbd<\/li>\n\n\n\n<li><strong>\ub370\uc774\ud130\ubca0\uc774\uc2a4 \ud2b8\ub79c\uc7ad\uc158 \ubc0f Outbox \ud328\ud134<\/strong>: DB \ubcc0\uacbd\uacfc \uc774\ubca4\ud2b8 \ubc1c\ud589 \uc0ac\uc774\uc758 \uc720\uc2e4\uc744 \ubc29\uc9c0\ud574\uc57c \ud558\ub294 \ud658\uacbd<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \uac8c\uc784 \ub85c\ube44\uc758 \uc77c\uc2dc\uc801\uc778 \uc0c1\ud0dc \uac31\uc2e0\uc740 Pub\/Sub\uc73c\ub85c \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4. \ubc18\uba74 \uac8c\uc784 \uacb0\uacfc\uc5d0 \ub530\ub978 \ubcf4\uc0c1 \uc9c0\uae09\uc740 Streams\ub098 \ubcc4\ub3c4 \uba54\uc2dc\uc9c0 \ube0c\ub85c\ucee4, DB \uae30\ubc18 \uc791\uc5c5 \ud050 \ub4f1\uc744 \ud65c\uc6a9\ud574 \ubcf5\uad6c \uac00\ub2a5\ud55c \ud750\ub984\uc73c\ub85c \uc124\uacc4\ud558\ub294 \uac83\uc774 \uc801\uc808\ud558\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\uc911\ubcf5 \ucc98\ub9ac\uc640 \uc7a5\uc560 \ub300\uc751<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\uba54\uc2dc\uc9c0 \uc911\ubcf5\uc740 \uc815\uc0c1\uc801\uc778 \uc0c1\ud669\uc774\ub2e4<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ubd84\uc0b0 \uc2dc\uc2a4\ud15c\uc5d0\uc11c\ub294 \uba54\uc2dc\uc9c0\uac00 \uc911\ubcf5 \uc804\ub2ec\ub420 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \uc18c\ube44\uc790\uac00 \ubcf4\uc0c1 \uc9c0\uae09 \uc791\uc5c5\uc744 \uc644\ub8cc\ud588\uc9c0\ub9cc ACK\ub97c \ubcf4\ub0b4\uae30 \uc804\uc5d0 \ud504\ub85c\uc138\uc2a4\uac00 \uc885\ub8cc\ub410\ub2e4\uace0 \uac00\uc815\ud558\uc790. \ub2e4\ub978 \uc18c\ube44\uc790\uac00 \ubbf8\ud655\uc778 \uba54\uc2dc\uc9c0\ub97c \ud68c\uc218\ud574 \uac19\uc740 \uc791\uc5c5\uc744 \ub2e4\uc2dc \uc218\ud589\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uc0c1\ud669\uc5d0\uc11c \uba54\uc2dc\uc9c0\ub97c \ubc18\ub4dc\uc2dc \ud55c \ubc88\ub9cc \uc804\ub2ec\ud558\ub3c4\ub85d \ub9cc\ub4dc\ub294 \ub370 \uc758\uc874\ud558\uae30\ubcf4\ub2e4, \uac19\uc740 \uba54\uc2dc\uc9c0\uac00 \uc5ec\ub7ec \ubc88 \ucc98\ub9ac\ub3fc\ub3c4 \uacb0\uacfc\uac00 \ud55c \ubc88\ub9cc \ubc18\uc601\ub418\ub3c4\ub85d \uc124\uacc4\ud558\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub97c <strong>\uba71\ub4f1\uc131(Idempotency)<\/strong> \uc774\ub77c\uace0 \ud55c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uc774\ubca4\ud2b8 ID\ub97c \uc774\uc6a9\ud55c \uc911\ubcf5 \ucc98\ub9ac \ubc29\uc9c0<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uac01 \uc774\ubca4\ud2b8\uc5d0 \uace0\uc720\ud55c <code>eventId<\/code>\ub97c \ubd80\uc5ec\ud558\uace0, \ucc98\ub9ac\ud55c \uc774\ubca4\ud2b8 ID\ub97c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uae30\ub85d\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE processed_events (\n    event_id VARCHAR(100) PRIMARY KEY,\n    processed_at TIMESTAMP NOT NULL\n);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ud14c\uc774\ube14\uc758 \uae30\ubcf8\ud0a4\ub294 \ub3d9\uc77c\ud55c \uc774\ubca4\ud2b8 ID\uac00 \uc5ec\ub7ec \ubc88 \ub4f1\ub85d\ub418\ub294 \uac83\uc744 \ubc29\uc9c0\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ucc98\ub9ac \uc774\ub825 \uae30\ub85d\uacfc \uc2e4\uc81c \ube44\uc988\ub2c8\uc2a4 \ubcc0\uacbd\uc740 \uac00\ub2a5\ud55c \ud55c \uac19\uc740 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ud2b8\ub79c\uc7ad\uc158\uc73c\ub85c \ubb36\uc5b4\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BEGIN TRANSACTION\n\n- eventId \ucc98\ub9ac \uc774\ub825 \ub4f1\ub85d\n- \uc774\ubbf8 \ub4f1\ub85d\ub41c ID\ub77c\uba74 \uc911\ubcf5\uc73c\ub85c \ud310\ub2e8\n- \ube44\uc988\ub2c8\uc2a4 \ub370\uc774\ud130 \ubcc0\uacbd\n- \ud2b8\ub79c\uc7ad\uc158 \ucee4\ubc0b\n\nCOMMIT<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \ubcf4\uc0c1 \uc9c0\uae09\uc774\ub77c\uba74 \uc774\ubca4\ud2b8 \ucc98\ub9ac \uc774\ub825\uacfc \ubcf4\uc0c1 \uc9c0\uae09 \uae30\ub85d\uc744 \ud568\uaed8 \ud2b8\ub79c\uc7ad\uc158\uc73c\ub85c \uad00\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e8\uc21c\ud788 \uc774\ubca4\ud2b8\ub97c \uba3c\uc800 \ucc98\ub9ac\ud55c \ub4a4 \ubcc4\ub3c4 \ud2b8\ub79c\uc7ad\uc158\uc73c\ub85c \ucc98\ub9ac \uc774\ub825\uc744 \uae30\ub85d\ud558\uba74, \ub450 \uc791\uc5c5 \uc0ac\uc774\uc758 \uc7a5\uc560\ub85c \ubcf4\uc0c1\uc774 \uc911\ubcf5 \uc9c0\uae09\ub420 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc678\ubd80 \uacb0\uc81c API\ucc98\ub7fc \ub3d9\uc77c\ud55c \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ud2b8\ub79c\uc7ad\uc158\uc5d0 \ud3ec\ud568\ud560 \uc218 \uc5c6\ub294 \uc791\uc5c5\uc740 \uc678\ubd80 \uc2dc\uc2a4\ud15c\uc758 \uba71\ub4f1\uc131 \ud0a4, \uc7ac\uc2dc\ub3c4 \uc815\ucc45, \uacb0\uacfc \uc870\ud68c \ubc0f \ubcf4\uc0c1 \uc808\ucc28\ub97c \ud568\uaed8 \uc124\uacc4\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uc7ac\uc2dc\ub3c4\uc640 \uc2e4\ud328 \ucc98\ub9ac<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc77c\uc2dc\uc801\uc778 \ub124\ud2b8\uc6cc\ud06c \uc624\ub958\ub098 \uc11c\ube44\uc2a4 \uacfc\ubd80\ud558\uac00 \ubc1c\uc0dd\ud588\uc744 \ub54c\ub294 \uc7ac\uc2dc\ub3c4\uac00 \ud544\uc694\ud558\ub2e4. \uadf8\ub7ec\ub098 \ubb34\uc870\uac74 \uc989\uc2dc \uc7ac\uc2dc\ub3c4\ud558\uba74 \uc7a5\uc560\uac00 \ubc1c\uc0dd\ud55c \uc11c\ube44\uc2a4\uc5d0 \uc694\uccad\uc774 \uc9d1\uc911\ub418\uc5b4 \uc0c1\ud669\uc774 \uc545\ud654\ub420 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc77c\ubc18\uc801\uc778 \ub300\uc751 \uc804\ub7b5\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Exponential Backoff<\/strong>: \uc7ac\uc2dc\ub3c4 \uac04\uaca9\uc744 \uc810\uc9c4\uc801\uc73c\ub85c \ub298\ub9b0\ub2e4.<\/li>\n\n\n\n<li><strong>Jitter<\/strong>: \uc7ac\uc2dc\ub3c4 \uc2dc\uc810\uc5d0 \ubb34\uc791\uc704 \ud3b8\ucc28\ub97c \ucd94\uac00\ud574 \uc694\uccad \uc9d1\uc911\uc744 \uc644\ud654\ud55c\ub2e4.<\/li>\n\n\n\n<li><strong>\ucd5c\ub300 \uc7ac\uc2dc\ub3c4 \ud69f\uc218<\/strong>: \ubb34\ud55c \uc7ac\uc2dc\ub3c4\ub97c \ubc29\uc9c0\ud55c\ub2e4.<\/li>\n\n\n\n<li><strong>Dead Letter Queue \ub610\ub294 \ubcc4\ub3c4 \uc2e4\ud328 \uc2a4\ud2b8\ub9bc<\/strong>: \ubc18\ubcf5 \uc2e4\ud328 \uba54\uc2dc\uc9c0\ub97c \uaca9\ub9ac\ud55c\ub2e4.<\/li>\n\n\n\n<li><strong>\ubaa8\ub2c8\ud130\ub9c1\uacfc \uc54c\ub9bc<\/strong>: Pending \uba54\uc2dc\uc9c0, \ucc98\ub9ac \uc9c0\uc5f0, \uc2e4\ud328 \ud69f\uc218\ub97c \uad00\ucc30\ud55c\ub2e4.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Redis Streams\uc5d0\uc11c\ub294 Pending Entries List\ub97c \ubaa8\ub2c8\ud130\ub9c1\ud558\uace0, \uc77c\uc815 \uc2dc\uac04 \uc774\uc0c1 \ucc98\ub9ac\ub418\uc9c0 \uc54a\uc740 \uba54\uc2dc\uc9c0\ub97c \ud68c\uc218\ud560 \uc218 \uc788\ub2e4. \ubc18\ubcf5 \uc2e4\ud328\ud55c \uba54\uc2dc\uc9c0\ub294 \ubcc4\ub3c4 \uc2a4\ud2b8\ub9bc\uc73c\ub85c \uc62e\uae30\uac70\ub098 \uc2e4\ud328 \uc0c1\ud0dc\ub97c \uae30\ub85d\ud574 \uc6b4\uc601\uc790\uac00 \uc6d0\uc778\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub3c4\ub85d \ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e8, \uc2e4\ud328\ud55c \uba54\uc2dc\uc9c0\ub97c \ubb34\uc870\uac74 ACK \ucc98\ub9ac\ud558\uba74 \ubcf5\uad6c\ub418\uc9c0 \uc54a\uc740 \uc791\uc5c5\uc774 \uc720\uc2e4\ub420 \uc218 \uc788\ub2e4. \uc2e4\ud328 \uc720\ud615\uc5d0 \ub530\ub77c \uc7ac\uc2dc\ub3c4, \uaca9\ub9ac, \ubcf4\uc0c1 \ucc98\ub9ac \uc911 \uc801\uc808\ud55c \uc815\ucc45\uc744 \uc120\ud0dd\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Outbox \ud328\ud134<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ub370\uc774\ud130\ubca0\uc774\uc2a4 \ubcc0\uacbd\uacfc \uba54\uc2dc\uc9c0 \ubc1c\ud589 \uc0ac\uc774\uc5d0\ub294 \uc911\uc694\ud55c \uc7a5\uc560 \uc9c0\uc810\uc774 \uc874\uc7ac\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \uac8c\uc784 \uacb0\uacfc\ub97c DB\uc5d0 \uc800\uc7a5\ud55c \ud6c4 \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud55c\ub2e4\uace0 \uac00\uc815\ud558\uc790.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>- \uac8c\uc784 \uacb0\uacfc DB \uc800\uc7a5 \uc131\uacf5\n- \uc11c\ubc84 \ud504\ub85c\uc138\uc2a4 \uc885\ub8cc\n- \uc774\ubca4\ud2b8 \ubc1c\ud589 \uc2e4\ud328<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uacbd\uc6b0 DB\uc5d0\ub294 \uac8c\uc784 \uacb0\uacfc\uac00 \uc788\uc9c0\ub9cc \ub2e4\ub978 \uc11c\ube44\uc2a4\ub294 \uacb0\uacfc\ub97c \uc54c\uc9c0 \ubabb\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Outbox \ud328\ud134\uc740 \ube44\uc988\ub2c8\uc2a4 \ub370\uc774\ud130 \ubcc0\uacbd\uacfc \uc774\ubca4\ud2b8 \ubc1c\ud589 \ub300\uc0c1\uc744 \uac19\uc740 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ud2b8\ub79c\uc7ad\uc158\uc73c\ub85c \uc800\uc7a5\ud574 \uc774 \ubb38\uc81c\ub97c \ud574\uacb0\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BEGIN TRANSACTION\n\n- \uac8c\uc784 \uacb0\uacfc \uc800\uc7a5\n- Outbox \ud14c\uc774\ube14\uc5d0 \uc774\ubca4\ud2b8 \uc800\uc7a5\n\nCOMMIT<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ubcc4\ub3c4\uc758 \ubc1c\ud589 \uc6cc\ucee4\uac00 Outbox \ud14c\uc774\ube14\uc5d0\uc11c \ubbf8\ubc1c\ud589 \uc774\ubca4\ud2b8\ub97c \uc77d\uc5b4 Redis Streams\ub098 \uba54\uc2dc\uc9c0 \ube0c\ub85c\ucee4\ub85c \ubc1c\ud589\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;\uac8c\uc784 \uc11c\ubc84]\n     |\n     | \ub2e8\uc77c DB \ud2b8\ub79c\uc7ad\uc158\n     v\n&#91;\uac8c\uc784 \uacb0\uacfc \ud14c\uc774\ube14] + &#91;Outbox \ud14c\uc774\ube14]\n                            |\n                            v\n                      &#91;\ubc1c\ud589 \uc6cc\ucee4]\n                            |\n                            v\n                    &#91;Redis Streams]\n                            |\n                            v\n                       &#91;\uc18c\ube44\uc790]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ubc1c\ud589 \uc6cc\ucee4\uac00 \uba54\uc2dc\uc9c0\ub97c \ubc1c\ud589\ud55c \uc9c1\ud6c4 \uc644\ub8cc \uc0c1\ud0dc\ub97c \uae30\ub85d\ud558\uae30 \uc804\uc5d0 \uc885\ub8cc\ub418\uba74 \uac19\uc740 \uc774\ubca4\ud2b8\uac00 \ub2e4\uc2dc \ubc1c\ud589\ub420 \uc218 \uc788\ub2e4. \ub530\ub77c\uc11c Outbox \ud328\ud134\ub3c4 \uc911\ubcf5 \uc804\ub2ec\uc744 \uc644\uc804\ud788 \uc81c\uac70\ud558\uc9c0\ub294 \uc54a\ub294\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ubca4\ud2b8 ID\uc640 \uc18c\ube44\uc790\uc758 \uba71\ub4f1\uc131 \ucc98\ub9ac\ub97c \uacb0\ud569\ud558\uba74 DB \ubcc0\uacbd\uacfc \uc774\ubca4\ud2b8 \uc804\ub2ec \uc0ac\uc774\uc758 \uc720\uc2e4 \uc704\ud5d8\uc744 \uc904\uc774\uba74\uc11c \uc548\uc815\uc801\uc778 \ubcf5\uad6c \uad6c\uc870\ub97c \ub9cc\ub4e4 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\uc2e4\uc2dc\uac04 \uac8c\uc784 \uc11c\ubc84\uc5d0 \uc801\uc6a9\ud558\uae30<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc2dc\uac04 \uac8c\uc784\uc5d0\uc11c\ub294 \uc774\ubca4\ud2b8\uc758 \uc911\uc694\ub3c4\uc640 \ud5c8\uc6a9 \uac00\ub2a5\ud55c \uc9c0\uc5f0\uc5d0 \ub530\ub77c \uc11c\ub85c \ub2e4\ub978 \uc804\ub2ec \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>\uae30\ub2a5<\/th><th>\uad8c\uc7a5 \uc811\uadfc \ubc29\uc2dd<\/th><th>\ud575\uc2ec \uace0\ub824 \uc0ac\ud56d<\/th><\/tr><tr><td>\uc628\ub77c\uc778 \uc0c1\ud0dc \ubcc0\uacbd \ud1b5\uc9c0<\/td><td>Pub\/Sub \ub610\ub294 \uc0c1\ud0dc \uc800\uc7a5\uc18c \uae30\ubc18 \uc870\ud68c<\/td><td>\uc7ac\uc811\uc18d\uacfc \uc0c1\ud0dc \ub9cc\ub8cc<\/td><\/tr><tr><td>\ub85c\ube44 \ucc38\uac00\uc790 \ubaa9\ub85d \uac31\uc2e0<\/td><td>Pub\/Sub \ub610\ub294 Streams<\/td><td>\ucd5c\uc2e0 \uc0c1\ud0dc\uc640 \uc774\ubca4\ud2b8 \uc21c\uc11c<\/td><\/tr><tr><td>\uac8c\uc784 \uacb0\uacfc \uc800\uc7a5<\/td><td>DB \ud2b8\ub79c\uc7ad\uc158 + Outbox<\/td><td>\uacb0\uacfc\uc640 \uc774\ubca4\ud2b8 \ubc1c\ud589\uc758 \uc815\ud569\uc131<\/td><\/tr><tr><td>\ubcf4\uc0c1 \uc9c0\uae09<\/td><td>Streams \ub610\ub294 \ub0b4\uad6c\uc131 \uc788\ub294 \uba54\uc2dc\uc9c0 \ud050<\/td><td>\uba71\ub4f1\uc131, \uc7ac\uc2dc\ub3c4, \uc9c0\uae09 \uae30\ub85d<\/td><\/tr><tr><td>\ubc30\uce58 \uc791\uc5c5 \uc911\ubcf5 \uc2e4\ud589 \ubc29\uc9c0<\/td><td>\ubd84\uc0b0 \ub77d + DB \uc81c\uc57d \uc870\uac74<\/td><td>\ub77d \ub9cc\ub8cc\uc640 \ub3d9\uc2dc \uc2e4\ud589<\/td><\/tr><tr><td>\uc11c\ubc84 \uac04 \uce90\uc2dc \ubb34\ud6a8\ud654<\/td><td>Pub\/Sub<\/td><td>\uba54\uc2dc\uc9c0 \uc720\uc2e4 \uc2dc \uc7ac\ub3d9\uae30\ud654<\/td><\/tr><tr><td>\ubd84\uc11d \ubc0f \ud1b5\uacc4 \uc774\ubca4\ud2b8<\/td><td>Streams \ub610\ub294 \uba54\uc2dc\uc9c0 \ube0c\ub85c\ucee4<\/td><td>\ucc98\ub9ac\ub7c9\uacfc \ubcf4\uc874 \uc815\ucc45<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\uc628\ub77c\uc778 \uc0c1\ud0dc\ub098 \ub85c\ube44 \ubaa9\ub85d\uc740 \uc77c\uc815 \uc218\uc900\uc758 \uc9c0\uc5f0\uc774\ub098 \uc7ac\ub3d9\uae30\ud654\ub97c \ud5c8\uc6a9\ud560 \uc218 \uc788\ub2e4. \ubc18\uba74 \ubcf4\uc0c1 \uc9c0\uae09\uacfc \uacbd\uc81c \ub370\uc774\ud130 \ubcc0\uacbd\uc740 \uc911\ubcf5 \uc2e4\ud589\uc774\ub098 \uc720\uc2e4\uc774 \uc9c1\uc811\uc801\uc778 \ub370\uc774\ud130 \uc624\ub958\ub85c \uc774\uc5b4\uc9c0\ubbc0\ub85c \ub354 \uac15\ud55c \ubcf4\ud638 \uc7a5\uce58\uac00 \ud544\uc694\ud558\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc2dc\uac04 \uac8c\uc784 \uc11c\ubc84\uc5d0\uc11c\ub294 \ubaa8\ub4e0 \uc0c1\ud0dc\ub97c \uc774\ubca4\ud2b8\ub85c\ub9cc \uad00\ub9ac\ud560 \ud544\uc694\ub3c4 \uc5c6\ub2e4. \ud604\uc7ac \uc0c1\ud0dc\ub97c \uc800\uc7a5\uc18c\uc5d0\uc11c \uc870\ud68c\ud558\uace0, \uc774\ubca4\ud2b8\ub294 \uc0c1\ud0dc \ubcc0\uacbd \uc0ac\uc2e4\uc744 \ub2e4\ub978 \uc11c\ube44\uc2a4\uc5d0 \uc54c\ub9ac\ub294 \uc6a9\ub3c4\ub85c \uc0ac\uc6a9\ud558\ub294 \uad6c\uc870\uac00 \ub354 \ub2e8\uc21c\ud558\uace0 \uc548\uc815\uc801\uc77c \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\uc124\uacc4 \uc2dc \ud575\uc2ec \uc6d0\uce59<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\ubd84\uc0b0 \uae30\ub2a5\uc744 \uc124\uacc4\ud560 \ub54c\ub294 \uae30\uc220 \uc120\ud0dd\ubcf4\ub2e4 \uba3c\uc800 \uc694\uad6c\uc0ac\ud56d\uc744 \uc815\uc758\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\uba54\uc2dc\uc9c0 \uc720\uc2e4\uc774 \ud5c8\uc6a9\ub418\ub294\uac00?<\/strong> \ud5c8\uc6a9\ub41c\ub2e4\uba74 Pub\/Sub\uc774 \uc801\ud569\ud560 \uc218 \uc788\uace0, \ud5c8\uc6a9\ub418\uc9c0 \uc54a\ub294\ub2e4\uba74 \uc601\uc18d\uc801\uc778 \uba54\uc2dc\uc9c0 \uc800\uc7a5\uacfc \ubcf5\uad6c \uacbd\ub85c\uac00 \ud544\uc694\ud558\ub2e4.<\/li>\n\n\n\n<li><strong>\uc18c\ube44\uc790\uac00 \uc5ec\ub7ec \ubc88 \ucc98\ub9ac\ud574\ub3c4 \ub418\ub294\uac00?<\/strong> \uc7ac\uc2dc\ub3c4\uac00 \uac00\ub2a5\ud55c \uad6c\uc870\ub77c\uba74 \uba71\ub4f1\uc131 \ud0a4\uc640 \uc911\ubcf5 \ucc98\ub9ac \ubc29\uc9c0 \ub85c\uc9c1\uc744 \uc124\uacc4\ud55c\ub2e4.<\/li>\n\n\n\n<li><strong>\uc791\uc5c5 \uc644\ub8cc\ub97c \uc5b4\ub5bb\uac8c \ud310\ub2e8\ud558\ub294\uac00?<\/strong> \uba54\uc2dc\uc9c0 \uc218\uc2e0\uacfc \uc2e4\uc81c \ube44\uc988\ub2c8\uc2a4 \uc791\uc5c5 \uc644\ub8cc\ub97c \uad6c\ubd84\ud558\uace0 ACK \uc2dc\uc810\uc744 \uba85\ud655\ud788 \ud55c\ub2e4.<\/li>\n\n\n\n<li><strong>\uc7a5\uc560 \ubc1c\uc0dd \ud6c4 \uc5b4\ub5bb\uac8c \ubcf5\uad6c\ud558\ub294\uac00?<\/strong> Pending \uba54\uc2dc\uc9c0, \uc2e4\ud328 \uc2a4\ud2b8\ub9bc, \uc7ac\uc2dc\ub3c4 \uc815\ucc45, \uc6b4\uc601\uc790 \uac1c\uc785 \uc808\ucc28\ub97c \ub9c8\ub828\ud55c\ub2e4.<\/li>\n\n\n\n<li><strong>\ub3d9\uc2dc \uc2e4\ud589\uc744 \uc5b4\ub5bb\uac8c \uc81c\uc5b4\ud558\ub294\uac00?<\/strong> \ubd84\uc0b0 \ub77d\ubfd0 \uc544\ub2c8\ub77c DB \ud2b8\ub79c\uc7ad\uc158, \uc720\ub2c8\ud06c \uc81c\uc57d \uc870\uac74, \ubc84\uc804 \uac80\uc99d\uc744 \ud568\uaed8 \uac80\ud1a0\ud55c\ub2e4.<\/li>\n\n\n\n<li><strong>\uc774\ubca4\ud2b8 \ubc1c\ud589\uacfc DB \ubcc0\uacbd\uc774 \uc6d0\uc790\uc801\uc778\uac00?<\/strong> \ub450 \uc791\uc5c5 \uc0ac\uc774\uc758 \uc720\uc2e4\uc774 \ud5c8\uc6a9\ub418\uc9c0 \uc54a\ub294\ub2e4\uba74 Outbox \ud328\ud134\uc744 \uace0\ub824\ud55c\ub2e4.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\ubd84\uc0b0 \uae30\ub2a5\uc774\ub780? \ub2e8\uc77c \uc11c\ubc84\uc5d0\uc11c\ub294 \uba54\ubaa8\ub9ac\uc640 \ud568\uc218 \ud638\ucd9c\ub9cc\uc73c\ub85c \ucc98\ub9ac\ud560 \uc218 \uc788\ub294 \uc791\uc5c5\ub3c4 \uc11c\ubc84\uac00 \uc5ec\ub7ec \ub300\ub85c \ub298\uc5b4\ub098\uba74 \ubcf5\uc7a1\ud574\uc9c4\ub2e4. \uc608\ub97c \ub4e4\uc5b4 \uc2e4\uc2dc\uac04 \uba40\ud2f0\ud50c\ub808\uc774 \uac8c\uc784 \uc11c\ubc84\uac00 \uc5ec\ub7ec \ub300 \uc6b4\uc601\ub418\uace0 \uc788\ub2e4\uace0 \uac00\uc815\ud558\uc790. \ud55c \uc11c\ubc84\uc5d0\uc11c \ud50c\ub808\uc774\uc5b4\uac00 \uac8c\uc784\uc744 \uc885\ub8cc\ud588\uc744 \ub54c, \ub2e4\ub978 \uc11c\ubc84\uc758 \uce5c\uad6c \ubaa9\ub85d \uc11c\ube44\uc2a4\uc640 \ub85c\ube44 \uc11c\ube44\uc2a4\ub3c4 \ud574\ub2f9 \ud50c\ub808\uc774\uc5b4\uc758 \uc0c1\ud0dc \ubcc0\uacbd\uc744 \uc54c\uc544\uc57c \ud560 \uc218 \uc788\ub2e4. \uac01 \uc11c\ubc84\ub294 \uc11c\ub85c \ub2e4\ub978 \ud504\ub85c\uc138\uc2a4\uc5d0\uc11c \uc2e4\ud589\ub418\ubbc0\ub85c \ud55c [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-2686","post","type-post","status-publish","format-standard","hentry","category-dev-logs"],"_links":{"self":[{"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/posts\/2686","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2686"}],"version-history":[{"count":3,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/posts\/2686\/revisions"}],"predecessor-version":[{"id":2689,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/posts\/2686\/revisions\/2689"}],"wp:attachment":[{"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2686"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2686"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2686"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}