{"id":431,"date":"2024-11-11T06:05:01","date_gmt":"2024-11-11T06:05:01","guid":{"rendered":"https:\/\/realstudy.net\/?p=431"},"modified":"2024-11-15T01:14:23","modified_gmt":"2024-11-15T01:14:23","slug":"nats-jetstream","status":"publish","type":"post","link":"https:\/\/realstudy.net\/?p=431&lang=ko","title":{"rendered":"NATS &#8211; JetStream"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"431\" class=\"elementor elementor-431\" data-elementor-post-type=\"post\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6c8f41d e-flex e-con-boxed e-con e-parent\" data-id=\"6c8f41d\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a926922 elementor-widget elementor-widget-text-editor\" data-id=\"a926922\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>NATS JetStream\uc740 \uace0\uae09 \uba54\uc2dc\uc9c0 \uc2a4\ud2b8\ub9ac\ubc0d \ubc0f \ub370\uc774\ud130 \uc800\uc7a5 \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\ub294 \ud655\uc7a5 \uae30\ub2a5\uc73c\ub85c, NATS\uc758 \uae30\ubcf8 \uba54\uc2dc\uc9d5 \uae30\ub2a5\uc744 \ud655\uc7a5\ud558\uc5ec \ub354 \ubcf5\uc7a1\ud55c \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc694\uad6c \uc0ac\ud56d\uc744 \ub9cc\uc871\ud560\uc218 \uc788\uac8c \ub9cc\ub4e4\uc5b4 \uc90d\ub2c8\ub2e4. JetStream\uc740 \uc8fc\ub85c <strong>\uc9c0\uc18d\uc801\uc778 \uba54\uc2dc\uc9c0 \uc800\uc7a5, \ub0b4\uad6c\uc131, \uba54\uc2dc\uc9c0 \uc7ac\ucc98\ub9ac, \uc2a4\ud2b8\ub9bc \ucc98\ub9ac<\/strong>\ub97c \uc704\ud574 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-ff8f01c e-flex e-con-boxed e-con e-parent\" data-id=\"ff8f01c\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b22c4f6 elementor-widget elementor-widget-text-editor\" data-id=\"b22c4f6\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>JetStream\uc758 \uc8fc\uc694 \uc6a9\ub3c4.<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d39e918 elementor-widget elementor-widget-text-editor\" data-id=\"d39e918\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ol><li><strong>\ub0b4\uad6c\uc131 \uc788\ub294 \uba54\uc2dc\uc9d5:<\/strong> JetStream\uc740 \uba54\uc2dc\uc9c0\ub97c \ub514\uc2a4\ud06c\uc5d0 \uc601\uad6c \uc800\uc7a5\ud558\uc5ec \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc774\ud6c4\uc5d0 \uba54\uc2dc\uc9c0\ub97c \ub2e4\uc2dc \uac00\uc838\uc62c \uc218 \uc788\ub3c4\ub85d \ud569\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \uba54\uc2dc\uc9c0\uac00 \uc190\uc2e4\ub418\uc9c0 \uc54a\uc73c\uba70, \uba54\uc2dc\uc9c0\uac00 \ubc1c\ud589\ub418\uc5c8\uc744 \ub54c \uad6c\ub3c5\uc790\uac00 \uc5f0\uacb0\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc558\ub354\ub77c\ub3c4 \ub098\uc911\uc5d0 \uc811\uadfc\ud560 \uc218 \uc788\uac8c \ud569\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uae30\ub2a5\uc740 \uc2a4\ud2b8\ub9bc\uc744 \ud1b5\ud574 \uad00\ub9ac\ub418\uba70, \uac01 \uc2a4\ud2b8\ub9bc\uc740 <strong>\uba54\uc2dc\uc9c0 \ubcf4\uc874 \ubc29\uc2dd\uc744 \uc815\uc758\ud558\uace0, \ubcf4\uc874 \uae30\uac04, \ud06c\uae30, \uad6c\ub3c5\uc790 \uad00\uc2ec\ub3c4\uc640 \uac19\uc740 \uc81c\ud55c<\/strong>\uc744 \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li><li><strong> \uba54\uc2dc\uc9c0 \uc7ac\ucc98\ub9ac:<\/strong> JetStream\uc740 \uc774\uc804\uc5d0 \uc804\uc1a1\ub41c \uba54\uc2dc\uc9c0\ub97c \uc7ac\uc0dd\ud560 \uc218 \uc788\ub294 \uae30\ub2a5\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc774\ub294 \ub370\uc774\ud130 \ubd84\uc11d\uc774\ub098 \uba54\uc2dc\uc9c0 \uc7ac\ucc98\ub9ac\uac00 \ud544\uc694\ud55c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uc720\uc6a9\ud558\uac8c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. JetStream\uc758 \uc2a4\ud2b8\ub9bc\uc740 \uc77c\ubc18\uc801\uc778 NATS \uc8fc\uc81c\ub97c \uc18c\ube44\ud558\uba70, \ud574\ub2f9 \uc8fc\uc81c\ub85c \ubc1c\ud589\ub41c \ubaa8\ub4e0 \uba54\uc2dc\uc9c0\ub97c \uc815\uc758\ub41c \uc800\uc7a5 \uc2dc\uc2a4\ud15c\uc5d0 \ucea1\ucc98\ud558\uace0 \ub098\uc911\uc5d0 \uc7ac\uc0dd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li><li><strong> \uc2a4\ud2b8\ub9bc \ucc98\ub9ac:<\/strong> JetStream\uc740 \uc5f0\uc18d\uc801\uc778 \uba54\uc2dc\uc9c0\ub97c \uc2a4\ud2b8\ub9bc\uc73c\ub85c \uad00\ub9ac\ud560 \uc218 \uc788\uac8c \ud558\uc5ec \ubcf5\uc7a1\ud55c \ub370\uc774\ud130 \ud750\ub984 \ubc0f \uc2a4\ud2b8\ub9bc \ucc98\ub9ac \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uad6c\ucd95\ud558\ub294 \ub370 \ub3c4\uc6c0\uc744 \uc90d\ub2c8\ub2e4. \uc2a4\ud2b8\ub9bc\uc740 \uba54\uc2dc\uc9c0 \ubcf4\uc874\uc744 \uc704\ud55c \uad6c\uc870\ub97c \uc81c\uacf5\ud558\uba70, \uc774\ub97c \ud1b5\ud574 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \ub300\ub7c9\uc758 \ub370\uc774\ud130\ub97c \ud6a8\uc728\uc801\uc73c\ub85c \uad00\ub9ac\ud558\uace0 \ubd84\uc11d\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li><li><strong> \uba54\uc2dc\uc9c0 \uc21c\uc11c \ubcf4\uc7a5:<\/strong> JetStream\uc740 \uba54\uc2dc\uc9c0\uc758 \uc21c\uc11c\ub97c \ubcf4\uc7a5\ud558\uc5ec, \uba54\uc2dc\uc9c0 \uc21c\uc11c \uc77c\uad00\uc131\uc774 \ud544\uc694\ud55c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uc62c\ubc14\ub974\uac8c \ucc98\ub9ac\ub420 \uc218 \uc788\ub3c4\ub85d \uc9c0\uc6d0\ud569\ub2c8\ub2e4.<\/li><li><strong>\ud655\uc778 \uc751\ub2f5\uc744 \ud1b5\ud55c \ud5a5\uc0c1\ub41c \ubc1c\ud589:<\/strong> \uc2a4\ud2b8\ub9bc\uc5d0 \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\uae30 \uc704\ud574 \uc77c\ubc18 NATS \ubc1c\ud589 \ud638\ucd9c\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc9c0\ub9cc, JetStream \uc804\uc6a9 \ubc1c\ud589 \ud638\ucd9c\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \ub354 \uc2e0\ub8b0\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ubc29\ubc95\uc740 JetStream \uc11c\ubc84\uac00 \uba54\uc2dc\uc9c0\uac00 \uc131\uacf5\uc801\uc73c\ub85c \uc800\uc7a5\ub418\uc5c8\uc74c\uc744 \ud655\uc778\ud558\ub294 \uc751\ub2f5\uc744 \uc81c\uacf5\ud558\uc5ec \ub192\uc740 \uc218\uc900\uc758 \uc804\uc1a1 \ubcf4\uc7a5\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/li><li><strong>\ud655\uc7a5\uc131 \ubc0f \uc131\ub2a5:<\/strong> JetStream\uc740 NATS\uc758 \uacbd\ub7c9 \ubc0f \ub192\uc740 \uc131\ub2a5 \ud2b9\uc131\uc744 \uc720\uc9c0\ud558\uba74\uc11c\ub3c4, \ub354 \ubcf5\uc7a1\ud55c \uc791\uc5c5\uc744 \uc9c0\uc6d0\ud558\uae30 \uc704\ud55c \ucd94\uac00 \uc800\uc7a5 \ubc0f \ucc98\ub9ac \uae30\ub2a5\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. \ubcf5\uc7a1\ud55c \ubd84\uc0b0 \uc2dc\uc2a4\ud15c\uc758 \uc694\uad6c\ub97c \ucda9\uc871\uc2dc\ud0a4\uae30 \uc704\ud574 \uc798 \ud655\uc7a5\ub418\uba70, \uc5ec\uc804\ud788 \uc800\uc9c0\uc5f0 \uba54\uc2dc\uc9d5\uc744 \ubcf4\uc7a5\ud569\ub2c8\ub2e4.<\/li><\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a926b69 elementor-widget elementor-widget-text-editor\" data-id=\"a926b69\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>\uc774\ub7ec\ud55c \uace0\uae09 \uae30\ub2a5\ub4e4\uc740 JetStream\uc744 <strong>\ub85c\uadf8 \uad00\ub9ac, \uc774\ubca4\ud2b8 \uc18c\uc2f1, \uc2a4\ud2b8\ub9ac\ubc0d \ub370\uc774\ud130 \ubd84\uc11d \ubc0f \ubd84\uc0b0 \uc2dc\uc2a4\ud15c\uc758 \uba54\uc2dc\uc9c0 \ud050<\/strong>\ub85c\uc11c \ud2b9\ud788 \uac00\uce58 \uc788\uac8c \ub9cc\ub4ed\ub2c8\ub2e4. \uba54\uc2dc\uc9c0\ub97c \uc0ac\uc6a9\uc790 \uc815\uc758\ub41c \ubcf4\uc874 \uc815\ucc45\uc73c\ub85c \uc800\uc7a5\ud558\uace0 \uc2e0\ub8b0\ud560 \uc218 \uc788\ub294 \uba54\uc2dc\uc9c0 \ud655\uc778\uc744 \uc81c\uacf5\ud558\ub294 \uae30\ub2a5\uc740 \uc911\uc694\ud55c \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc778\ud504\ub77c\uc5d0\uc11c JetStream\uc758 \uc5ed\ud560\uc744 \ub354\uc6b1 \uac15\ud654\ud569\ub2c8\ub2e4.<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-aeeee6e e-flex e-con-boxed e-con e-parent\" data-id=\"aeeee6e\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5943344 elementor-widget elementor-widget-heading\" data-id=\"5943344\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">1. NATS \uc11c\ubc84 \uc2e4\ud589<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9e44d4d elementor-widget elementor-widget-text-editor\" data-id=\"9e44d4d\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>NATS \uc11c\ubc84 \ubc14\uc774\ub108\ub9ac \ub2e4\uc6b4\ub85c\ub4dc<\/strong>: \ucd5c\uc2e0 \ubc84\uc804\uc758 NATS \uc11c\ubc84 \ubc14\uc774\ub108\ub9ac\ub97c GitHub\uc5d0\uc11c \ub2e4\uc6b4\ub85c\ub4dc\ud569\ub2c8\ub2e4.<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-91d438a elementor-widget elementor-widget-code-highlight\" data-id=\"91d438a\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-bash line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-bash\">\n\t\t\t\t\t<xmp>wget https:\/\/github.com\/nats-io\/nats-server\/releases\/download\/v2.10.2\/nats-server-v2.10.2-linux-amd64.tar.gz\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-17980e3 elementor-widget elementor-widget-text-editor\" data-id=\"17980e3\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>\uc555\ucd95 \ud574\uc81c<\/strong>: \ub2e4\uc6b4\ub85c\ub4dc\ud55c \ud30c\uc77c\uc744 \uc555\ucd95 \ud574\uc81c\ud569\ub2c8\ub2e4.<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6fe485d elementor-widget elementor-widget-code-highlight\" data-id=\"6fe485d\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-bash line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-bash\">\n\t\t\t\t\t<xmp>tar -xzf nats-server-v2.10.2-linux-amd64.tar.gz\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fdca430 elementor-widget elementor-widget-text-editor\" data-id=\"fdca430\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>\uc11c\ubc84 \uc2e4\ud589<\/strong>: NATS \uc11c\ubc84\ub97c \uae30\ubcf8 \uc124\uc815\uc73c\ub85c \uc2e4\ud589.(-js option\uc744 \uc9c0\uc815\ud574\uc57c \ud568)<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0beabf3 elementor-widget elementor-widget-code-highlight\" data-id=\"0beabf3\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-bash line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-bash\">\n\t\t\t\t\t<xmp>nats-server-v2.10.2-linux-amd64\/nats-server -js<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-9c20f7f e-flex e-con-boxed e-con e-parent\" data-id=\"9c20f7f\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ee9ce1b elementor-widget elementor-widget-heading\" data-id=\"ee9ce1b\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">2. Python \ud14c\uc2a4\ud2b8<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e0e63f2 elementor-widget elementor-widget-text-editor\" data-id=\"e0e63f2\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>\ubaa8\ub4e0 \uc608\uc81c\ub294 Python\uc758 nats-py \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4. nats-py \ub77c\uc774\ube0c\ub7ec\ub9ac\ub294 \ub2e4\uc74c \uba85\ub839\uc5b4\ub85c \uc124\uce58\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b7572d7 elementor-widget elementor-widget-code-highlight\" data-id=\"b7572d7\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-bash line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-bash\">\n\t\t\t\t\t<xmp>pip install nats-py\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-234f958 e-flex e-con-boxed e-con e-parent\" data-id=\"234f958\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0f0d92f elementor-widget elementor-widget-heading\" data-id=\"0f0d92f\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">3. JetStream<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1f6fbe2 elementor-widget elementor-widget-text-editor\" data-id=\"1f6fbe2\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>NATS JetStream\uc5d0\uc11c \uc2a4\ud2b8\ub9bc(stream)\uc740 \uae30\ubcf8 NATS \uba54\uc2dc\uc9d5 \uae30\ub2a5\uc744 \ub118\uc5b4\uc11c, \uace0\uae09 \uba54\uc2dc\uc9c0 \uc800\uc7a5 \ubc0f \uad00\ub9ac \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\ub294 \ud575\uc2ec \uac1c\ub150\uc785\ub2c8\ub2e4. \uc2a4\ud2b8\ub9bc\uc740 \ub17c\ub9ac\uc801 \uba54\uc2dc\uc9c0 \uc800\uc7a5\uc18c\ub85c\uc11c \uba54\uc2dc\uc9c0\uac00 \uc5b4\ub5bb\uac8c \ubcf4\uc874\ub418\uace0 \ucc98\ub9ac\ub418\ub294\uc9c0 \uc815\uc758\ud558\uba70, \uc774\ub97c \uc7ac\uc0ac\uc6a9\ud558\uac70\ub098 \uc7ac\ucc98\ub9ac\ud560 \uc218 \uc788\ub294 \uae30\ub2a5\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/div><div>\uc2a4\ud2b8\ub9bc\uc740 NATS JetStream\uc5d0\uc11c \ud2b9\uc815 \uc8fc\uc81c(\ud1a0\ud53d)\ub85c \ubc1c\ud589\ub41c \ubaa8\ub4e0 \uba54\uc2dc\uc9c0\ub97c \ucea1\ucc98\ud558\uace0, \uc774\ub97c \uc9c0\uc18d\uc801\uc73c\ub85c \uc800\uc7a5\ud558\uc5ec \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \ub098\uc911\uc5d0 \uc774 \uba54\uc2dc\uc9c0\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \ud558\ub294 \uba54\uc2dc\uc9c0 \uc800\uc7a5\uc18c\uc785\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 JetStream\uc740 \uc9c0\uc18d\uc801\uc774\uace0 \ub0b4\uad6c\uc131 \uc788\ub294 \uba54\uc2dc\uc9d5\uacfc \uc7ac\uc0dd \uac00\ub2a5\ud55c \uba54\uc2dc\uc9d5\uc744 \uc81c\uacf5\ud558\uc5ec, \ub354 \uc548\uc815\uc801\uc778 \uba54\uc2dc\uc9c0 \ud750\ub984\uc744 \uad00\ub9ac\ud560 \uc218 \uc788\uac8c \ud569\ub2c8\ub2e4.<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fd58e91 elementor-widget elementor-widget-text-editor\" data-id=\"fd58e91\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>\uc2a4\ud2b8\ub9bc\uc758 \uc8fc\uc694 \uae30\ub2a5<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fd0319e elementor-widget elementor-widget-text-editor\" data-id=\"fd0319e\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ol><li>\uba54\uc2dc\uc9c0 \ubcf4\uc874 :<br \/>&gt;\u00a0\uc2a4\ud2b8\ub9bc\uc740 \ud2b9\uc815 \uc8fc\uc81c\ub85c \ubc1c\ud589\ub41c \uba54\uc2dc\uc9c0\ub97c \uc800\uc7a5\ud558\uba70, \uc774\ub97c \ub098\uc911\uc5d0 <strong>\uc7ac\uc0dd<\/strong>\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br \/>&gt; <strong>\ubcf4\uc874 \uc815\ucc45<\/strong>\uc744 \uc124\uc815\ud558\uc5ec \uba54\uc2dc\uc9c0\ub97c \uc5bc\ub9c8\ub098 \uc624\ub798 \ubcf4\uc874\ud560\uc9c0 \uc815\uc758\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ubcf4\uc874 \uc815\ucc45\uc740 <strong>\uc2dc\uac04(duration)<\/strong>, <strong>\uba54\uc2dc\uc9c0 \uc218<\/strong> \ub610\ub294 <strong>\ucd1d \uc800\uc7a5 \uc6a9\ub7c9<\/strong>\uc5d0 \ub530\ub77c \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li><li>\ubcf4\uc874 \uc815\ucc45 :<br \/>&gt;\u00a0<strong>\ud55c\uacc4 \uae30\ubc18 \ubcf4\uc874<\/strong>: \uba54\uc2dc\uc9c0 \uc218, \uc2a4\ud2b8\ub9bc \ud06c\uae30 \ub4f1 \ud2b9\uc815 \ud55c\uacc4\uc5d0 \ub3c4\ub2ec\ud560 \ub54c\uae4c\uc9c0 \uba54\uc2dc\uc9c0\ub97c \ubcf4\uc874\ud569\ub2c8\ub2e4.<br \/>&gt;\u00a0<strong>\uad00\uc2ec \uae30\ubc18 \ubcf4\uc874<\/strong>: \ud65c\uc131 \uad6c\ub3c5\uc790\uac00 \uc874\uc7ac\ud558\ub294 \ub3d9\uc548 \uba54\uc2dc\uc9c0\ub97c \ubcf4\uc874\ud569\ub2c8\ub2e4.<br \/>&gt;\u00a0<strong>\uc791\uc5c5 \ub300\uae30\uc5f4 \ubcf4\uc874<\/strong>: \uba54\uc2dc\uc9c0\uac00 \uc18c\ube44\uc790\uc5d0\uac8c \uc131\uacf5\uc801\uc73c\ub85c \uc804\ub2ec\ub418\uba74 \uc0ad\uc81c\ub429\ub2c8\ub2e4.<\/li><li>\uba54\uc2dc\uc9c0 \uc21c\uc11c \ubcf4\uc7a5 :<br \/>&gt; \uc2a4\ud2b8\ub9bc\uc740 \uba54\uc2dc\uc9c0\uac00 \ubc1c\ud589\ub41c \uc21c\uc11c\ub300\ub85c \uc800\uc7a5\ub418\uba70, \uc774\ub97c \ud1b5\ud574 <strong>\uba54\uc2dc\uc9c0 \uc21c\uc11c<\/strong>\ub97c \ubcf4\uc7a5\ud569\ub2c8\ub2e4. \uc774\ub294 \uba54\uc2dc\uc9c0 \uc21c\uc11c\uac00 \uc911\uc694\ud55c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uc77c\uad00\uc131 \uc788\uac8c \ucc98\ub9ac\ub420 \uc218 \uc788\ub3c4\ub85d \uc9c0\uc6d0\ud569\ub2c8\ub2e4.<\/li><li>\uc800\uc7a5 \uc635\uc158 : \uc2a4\ud2b8\ub9bc \uc800\uc7a5\uc744 \uc704\ud55c \ub2e4\uc591\ud55c \uc800\uc7a5 \uc635\uc158\uc744 \uc81c\uacf5.<br \/>&gt;\u00a0<strong>\uba54\ubaa8\ub9ac \uc800\uc7a5<\/strong>: \uba54\uc2dc\uc9c0\ub97c \uba54\ubaa8\ub9ac\uc5d0 \uc800\uc7a5\ud558\uc5ec \ube60\ub974\uac8c \uc561\uc138\uc2a4\ud560 \uc218 \uc788\uc9c0\ub9cc, \ud718\ubc1c\uc131\uc774 \uc788\uc2b5\ub2c8\ub2e4.<br \/>&gt;\u00a0<strong>\ud30c\uc77c \uc800\uc7a5<\/strong>: \uba54\uc2dc\uc9c0\ub97c \ub514\uc2a4\ud06c\uc5d0 \uc800\uc7a5\ud558\uc5ec \ub0b4\uad6c\uc131 \ubc0f \uc9c0\uc18d\uc131\uc744 \ubcf4\uc7a5\ud569\ub2c8\ub2e4.<\/li><li>\uc8fc\uc81c(Subjects) :<br \/>&gt;\u00a0\uc2a4\ud2b8\ub9bc\uc740 \ud558\ub098 \uc774\uc0c1\uc758 <strong>\uc8fc\uc81c<\/strong>\uc640 \uc5f0\uad00\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \ud574\ub2f9 \uc8fc\uc81c\ub85c \ubc1c\ud589\ub41c \ubaa8\ub4e0 \uba54\uc2dc\uc9c0\ub294 \uc2a4\ud2b8\ub9bc\uc5d0 \uc800\uc7a5\ub429\ub2c8\ub2e4.<br \/>&gt;\u00a0\uc608\ub97c \ub4e4\uc5b4, <code>orders.*<\/code> \uc8fc\uc81c\uc5d0 \ub300\ud574 \uc2a4\ud2b8\ub9bc\uc744 \uc124\uc815\ud558\uba74 <code>orders.created<\/code>, <code>orders.updated<\/code> \ub4f1\uacfc \uac19\uc740 \uc8fc\uc81c\ub85c \ubc1c\ud589\ub41c \ubaa8\ub4e0 \uba54\uc2dc\uc9c0\uac00 \uc800\uc7a5\ub429\ub2c8\ub2e4.<\/li><li>\uc2a4\ud2b8\ub9bc \uad6c\uc131 : \uc2a4\ud2b8\ub9bc\uc744 \uc0dd\uc131\ud560 \ub54c \ub2e4\uc591\ud55c \ub9e4\uac1c\ubcc0\uc218\ub97c \uc9c0\uc815 \ud560 \uc218 \uc788\uc74c.<br \/>&gt;\u00a0<strong>\uc774\ub984(Name)<\/strong>: \uc2a4\ud2b8\ub9bc\uc758 \uace0\uc720 \uc774\ub984.<br \/>&gt;\u00a0<strong>\uc8fc\uc81c(Subjects)<\/strong>: \ucea1\ucc98\ud560 \uba54\uc2dc\uc9c0\uc758 \uc8fc\uc81c \ub610\ub294 \uc640\uc77c\ub4dc\uce74\ub4dc \ud328\ud134.<br \/>&gt; <strong>\ubcf4\uc874 \uc815\ucc45(Retention Policy)<\/strong>: \uba54\uc2dc\uc9c0\ub97c \uc5bc\ub9c8\ub098 \uc624\ub798 \ubcf4\uc874\ud560\uc9c0 \uacb0\uc815.<br \/>&gt;\u00a0<strong>\uc800\uc7a5 \uc720\ud615(Storage Type)<\/strong>: <code>memory<\/code> \ub610\ub294 <code>file<\/code> \uc800\uc7a5 \ubc29\uc2dd \uc120\ud0dd.<br \/>&gt;\u00a0<strong>\ucd5c\ub300 \ubcf4\uc874 \uc2dc\uac04(Maximum Age)<\/strong>: \uac01 \uba54\uc2dc\uc9c0\ub97c \uc5bc\ub9c8\ub098 \uc624\ub798 \ubcf4\uad00\ud560\uc9c0 \uc124\uc815.<br \/>&gt;\u00a0<strong>\ud55c\uacc4(Limits)<\/strong>: \uc2a4\ud2b8\ub9bc\uc774 \ubcf4\uad00\ud560 \uc218 \uc788\ub294 \ucd5c\ub300 \uba54\uc2dc\uc9c0 \uc218 \ub610\ub294 \uc800\uc7a5 \uc6a9\ub7c9.<\/li><\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-13cc847 elementor-widget elementor-widget-text-editor\" data-id=\"13cc847\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>\uc2a4\ud2b8\ub9bc \uc0dd\uc131<\/strong> (stream.py)<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2d471e7 elementor-widget elementor-widget-code-highlight\" data-id=\"2d471e7\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp>import asyncio\nfrom nats.aio.client import Client as NATS\nfrom nats.js.api import StreamConfig, RetentionPolicy, StorageType\n\nasync def main():\n    # Create a NATS client instance\n    nc = NATS()\n\n    # Connect to NATS server\n    await nc.connect(servers=[\"nats:\/\/localhost:4222\"])\n\n    # Create JetStream context\n    js = nc.jetstream()\n\n    stream_name = \"example_stream\"\n\n    # Check if the stream already exists\n    try:\n        stream_info = await js.stream_info(stream_name)\n        # If it exists, delete the stream\n        await js.delete_stream(stream_name)\n        print(f\"Existing stream '{stream_name}' deleted.\")\n    except Exception as e:\n        # Stream does not exist\n        print(f\"Stream '{stream_name}' does not exist. Proceeding to create a new one.\")\n\n    # Define stream configuration with correct enums and integer max_age\n    config = StreamConfig(\n        name=stream_name,                    # Stream name\n        subjects=[\"my.subject.*\"],           # Subjects to subscribe\n        retention=RetentionPolicy.LIMITS,    # Retention policy: LIMITS, INTEREST, or WORK_QUEUE\n        storage=StorageType.FILE,            # Storage type: MEMORY or FILE\n        max_age=9 * 10**9,                   # Max age in nanoseconds (9 seconds)\n        max_msgs=1000,                       # Max number of messages\n        max_bytes=10 * 1024 * 1024,          # Max storage size in bytes (10MB)\n    )\n\n    # Add stream to JetStream context\n    try:\n        await js.add_stream(config=config)\n        print(f\"Stream '{config.name}' created successfully.\")\n    except Exception as e:\n        print(f\"Error creating stream: {e}\")\n\n    # Close the NATS connection\n    await nc.close()\n\nif __name__ == '__main__':\n    asyncio.run(main())\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8984f72 elementor-widget elementor-widget-text-editor\" data-id=\"8984f72\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>\ud14c\uc2a4\ud2b8 \uc2e4\ud589<\/strong><\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-22f7830 elementor-widget elementor-widget-code-highlight\" data-id=\"22f7830\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp># Run the setup\npython stream.py<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-dcc5250 e-flex e-con-boxed e-con e-parent\" data-id=\"dcc5250\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f6b204f elementor-widget elementor-widget-heading\" data-id=\"f6b204f\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">4. Publish-Subscribe<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8a741b4 elementor-widget elementor-widget-text-editor\" data-id=\"8a741b4\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>\ubc1c\ud589\uc790<\/strong> : \ud2b9\uc815 \uc8fc\uc81c\ub85c \uba54\uc2dc\uc9c0\ub97c \ubc1c\ud589.<\/div><div><strong>\uad6c\ub3c5\uc790<\/strong> : \ud2b9\uc815 \uc8fc\uc81c\ub97c \uad6c\ub3c5\ud574\uc11c \uba54\uc2dc\uc9c0\ub97c \uc218\uc2e0.<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fb8b670 elementor-widget elementor-widget-image\" data-id=\"fb8b670\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"359\" height=\"152\" src=\"https:\/\/realstudy.net\/wp-content\/uploads\/2024\/11\/nats_pubsub.jpg\" class=\"attachment-large size-large wp-image-384\" alt=\"\" srcset=\"https:\/\/realstudy.net\/wp-content\/uploads\/2024\/11\/nats_pubsub.jpg 359w, https:\/\/realstudy.net\/wp-content\/uploads\/2024\/11\/nats_pubsub-300x127.jpg 300w\" sizes=\"(max-width: 359px) 100vw, 359px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1feb62d elementor-widget elementor-widget-text-editor\" data-id=\"1feb62d\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>\ubc1c\ud589\uc790<\/strong> (publisher.py)<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c678424 elementor-widget elementor-widget-code-highlight\" data-id=\"c678424\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp>import asyncio\nfrom nats.aio.client import Client as NATS\nfrom nats.aio.errors import ErrConnectionClosed, ErrTimeout, ErrNoServers\n\nasync def publish_messages(js, subject):\n    \"\"\"\n    Publishes a series of messages to the specified subject.\n    \"\"\"\n    try:\n        for i in range(1, 6):\n            message = f\"Message {i}\"\n            # Publish the message to the subject\n            await js.publish(subject, message.encode())\n            print(f\"Published: {message}\")\n            await asyncio.sleep(1)  # Wait for a second before sending the next message\n    except Exception as e:\n        print(f\"Error publishing message: {e}\")\n\nasync def main():\n    \"\"\"\n    Main coroutine that sets up the NATS client, connects to the server,\n    and publishes messages to a subject.\n    \"\"\"\n    nc = NATS()\n\n    try:\n        # Connect to the NATS server\n        await nc.connect(servers=[\"nats:\/\/localhost:4222\"])\n        print(\"Publisher connected to NATS server.\")\n\n        # Create JetStream context\n        js = nc.jetstream()\n\n        # Define the subject to publish to\n        subject = \"my.subject.test\"\n\n        # Publish messages\n        await publish_messages(js, subject)\n\n    except ErrNoServers as e:\n        print(f\"Could not connect to NATS server: {e}\")\n    except Exception as e:\n        print(f\"An error occurred: {e}\")\n    finally:\n        # Close the NATS connection\n        await nc.close()\n        print(\"Publisher disconnected from NATS server.\")\n\nif __name__ == '__main__':\n    asyncio.run(main())\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-309b4fd elementor-widget elementor-widget-text-editor\" data-id=\"309b4fd\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>\uad6c\ub3c5\uc790<\/strong> (subscriber.py)<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-001c13e elementor-widget elementor-widget-code-highlight\" data-id=\"001c13e\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp>import asyncio\nfrom nats.aio.client import Client as NATS\nfrom nats.aio.errors import ErrConnectionClosed, ErrTimeout, ErrNoServers\n\nasync def message_handler(msg):\n    \"\"\"\n    Callback function to handle received messages.\n    \"\"\"\n    data = msg.data.decode()\n    print(f\"Received a message on '{msg.subject}': {data}\")\n    await msg.ack()  # Acknowledge the message\n\nasync def subscribe_to_subject(js, subject):\n    \"\"\"\n    Subscribes to the specified subject and handles incoming messages.\n    \"\"\"\n    try:\n        # Subscribe to the subject without a queue group\n        await js.subscribe(subject, cb=message_handler)\n        print(f\"Subscriber is listening on '{subject}'.\")\n    except Exception as e:\n        print(f\"Error subscribing to subject: {e}\")\n\nasync def main():\n    \"\"\"\n    Main coroutine that sets up the NATS client, connects to the server,\n    and subscribes to a subject to receive messages.\n    \"\"\"\n    nc = NATS()\n\n    try:\n        # Connect to the NATS server\n        await nc.connect(servers=[\"nats:\/\/localhost:4222\"])\n        print(\"Subscriber connected to NATS server.\")\n\n        # Create JetStream context\n        js = nc.jetstream()\n\n        # Define the subject to subscribe to\n        subject = \"my.subject.*\"\n\n        # Subscribe to the subject\n        await subscribe_to_subject(js, subject)\n\n        # Keep the subscriber running to listen for incoming messages\n        print(\"Subscriber is running. Press Ctrl+C to exit.\")\n        while True:\n            await asyncio.sleep(1)\n\n    except ErrNoServers as e:\n        print(f\"Could not connect to NATS server: {e}\")\n    except asyncio.CancelledError:\n        pass  # Handle task cancellation gracefully\n    except Exception as e:\n        print(f\"An error occurred: {e}\")\n    finally:\n        # Close the NATS connection\n        await nc.close()\n        print(\"Subscriber disconnected from NATS server.\")\n\nif __name__ == '__main__':\n    try:\n        asyncio.run(main())\n    except KeyboardInterrupt:\n        print(\"\\nSubscriber stopped by user.\")\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e33a3fa elementor-widget elementor-widget-text-editor\" data-id=\"e33a3fa\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>\ud14c\uc2a4\ud2b8 \uc2e4\ud589<\/strong><\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-abd2bc9 elementor-widget elementor-widget-code-highlight\" data-id=\"abd2bc9\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp># Run multiple subscribers in several different terminals\npython subscriber.py\npython subscriber.py\npython subscriber.py\n\n# In another terminal, Run the Publisher\npython publisher.py<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-b62153a e-flex e-con-boxed e-con e-parent\" data-id=\"b62153a\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e443d4f elementor-widget elementor-widget-heading\" data-id=\"e443d4f\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">5. Request-Reply<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-af8c21f elementor-widget elementor-widget-text-editor\" data-id=\"af8c21f\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>\uc694\uccad\uc790<\/strong> : \ud2b9\uc815 \uc8fc\uc81c\ub85c \uc694\uccad \uba54\uc2dc\uc9c0\ub97c \uc1a1\uc2e0.<\/div><div><strong>\uc751\ub2f5\uc790<\/strong> : \ud2b9\uc815 \uc8fc\uc81c\ub97c \uad6c\ub3c5\ud558\uace0 \uc694\uccad\uc5d0 \uc751\ub2f5.<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4e81ca0 elementor-widget elementor-widget-image\" data-id=\"4e81ca0\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"359\" height=\"195\" src=\"https:\/\/realstudy.net\/wp-content\/uploads\/2024\/11\/nats_reqrep.jpg\" class=\"attachment-large size-large wp-image-389\" alt=\"\" srcset=\"https:\/\/realstudy.net\/wp-content\/uploads\/2024\/11\/nats_reqrep.jpg 359w, https:\/\/realstudy.net\/wp-content\/uploads\/2024\/11\/nats_reqrep-300x163.jpg 300w\" sizes=\"(max-width: 359px) 100vw, 359px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c625ae4 elementor-widget elementor-widget-text-editor\" data-id=\"c625ae4\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>\uc694\uccad\uc790<\/strong> (requester.py)<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6031b3d elementor-widget elementor-widget-code-highlight\" data-id=\"6031b3d\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp>import asyncio\nimport nats\nfrom nats.aio.msg import Msg\nimport uuid\nfrom functools import partial\n\n# Subscribe to the reply subject to receive responses from consumers\nasync def response_handler(msg: Msg, responses: list):\n    # Decode the response message\n    response = msg.data.decode()\n    print(f\"Received response: {response}\")\n    responses.append(response)\n\nasync def collect_responses(responses):\n    # Wait until the expected number of responses are received\n    expected_responses = 1  # Set this based on the number of consumers\n    while len(responses) < expected_responses:\n        await asyncio.sleep(0.1)\n    print(\"Collected all responses\")\n\nasync def main():\n    # Connect to the NATS server\n    nc = await nats.connect(\"nats:\/\/localhost:4222\")\n\n    # Create a JetStream context\n    js = nc.jetstream()\n\n    # Create a unique inbox (reply subject) for receiving responses\n    reply_subject = nc.new_inbox()\n    responses = []\n\n    # Subscribe to the reply subject\n    handler = partial(response_handler, responses=responses)\n    await nc.subscribe(reply_subject, cb=handler)\n\n    # Include the reply subject in the message headers\n    headers = {'reply-to': reply_subject}\n\n    # Publish a request message with the reply subject included in headers\n    await js.publish(\n        subject='my.subject.requests',\n        payload=b'Hello, Consumers!',\n        headers=headers\n    )\n    print(\"Published request with reply subject in headers:\", reply_subject)\n\n    # Wait for responses with a timeout\n    try:\n        await asyncio.wait_for(collect_responses(responses), timeout=5)\n    except asyncio.TimeoutError:\n        print(\"Timed out waiting for responses\")\n\n    # Print all collected responses\n    print(\"All responses:\", responses)\n\n    # Close the NATS connection\n    await nc.close()\n\nif __name__ == '__main__':\n    asyncio.run(main())\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-19a37d7 elementor-widget elementor-widget-text-editor\" data-id=\"19a37d7\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>\uc751\ub2f5\uc790<\/strong> (replier.py)<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b67ba59 elementor-widget elementor-widget-code-highlight\" data-id=\"b67ba59\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp>import asyncio\nimport nats\nfrom nats.aio.msg import Msg\nimport uuid\nfrom functools import partial\n\n# Define the message handler coroutine\nasync def message_handler(msg: Msg, consumer_name: str, nc: nats.aio.client.Client):\n    # Decode and process the message\n    request = msg.data.decode()\n    print(f\"{consumer_name} received request: {request}\")\n\n    # Extract the reply subject from the message headers\n    reply_subject = msg.header.get('reply-to') if msg.header else None\n\n    # Generate a response\n    response = f\"Response from {consumer_name} : {request.upper()}\"\n\n    # Send the response back to the reply subject if it exists\n    if reply_subject:\n        await nc.publish(reply_subject, response.encode())\n        print(f\"{consumer_name} sent response\")\n\n    # Acknowledge the message to confirm processing\n    await msg.ack()\n\nasync def main():\n    # Connect to the NATS server\n    nc = await nats.connect(\"nats:\/\/localhost:4222\")\n\n    # Create a JetStream context\n    js = nc.jetstream()\n\n    # Generate a unique durable consumer name\n    consumer_name = f'consumer_{uuid.uuid4()}'\n\n    print(f\"{consumer_name} is listening for messages...\")\n\n    # Subscribe to the 'requests' subject using push-based subscription\n    handler = partial(message_handler, consumer_name=consumer_name, nc=nc)\n    await js.subscribe(\n        subject='my.subject.requests',\n        durable=consumer_name,\n        stream='example_stream',\n        cb=handler,\n        manual_ack=True\n    )\n\n    # Keep the consumer running\n    await asyncio.Event().wait()\n\nif __name__ == '__main__':\n    asyncio.run(main())\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4c7d57c elementor-widget elementor-widget-text-editor\" data-id=\"4c7d57c\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>\ud14c\uc2a4\ud2b8 \uc2e4\ud589<\/strong><\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b67b389 elementor-widget elementor-widget-code-highlight\" data-id=\"b67b389\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp># Run the Subscriber\npython replier.py\n\n# In another terminal, Run the Publisher\npython requester.py<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-7a66462 e-flex e-con-boxed e-con e-parent\" data-id=\"7a66462\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-390ecb7 elementor-widget elementor-widget-heading\" data-id=\"390ecb7\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">6. Queue Groups (\ub85c\ub4dc \ubc38\ub7f0\uc2f1)<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-65385c4 elementor-widget elementor-widget-text-editor\" data-id=\"65385c4\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>\uc5ec\ub7ec \uc791\uc5c5\uc790(\uc6cc\ucee4)\uac00 \uac19\uc740 \ud050 \uadf8\ub8f9\uc5d0 \uac00\uc785\ud558\uc5ec \uc791\uc5c5\uc744 \ubd84\uc0b0 \ucc98\ub9ac.<\/div><div>\uba54\uc2dc\uc9c0\ub294 \ud050 \uadf8\ub8f9 \ub0b4\uc758 \ud55c \uc791\uc5c5\uc790\uc5d0\uac8c\ub9cc \uc804\ub2ec\ub428.<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e543fb7 elementor-widget elementor-widget-image\" data-id=\"e543fb7\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"385\" height=\"152\" src=\"https:\/\/realstudy.net\/wp-content\/uploads\/2024\/11\/nats_queue.jpg\" class=\"attachment-large size-large wp-image-393\" alt=\"\" srcset=\"https:\/\/realstudy.net\/wp-content\/uploads\/2024\/11\/nats_queue.jpg 385w, https:\/\/realstudy.net\/wp-content\/uploads\/2024\/11\/nats_queue-300x118.jpg 300w\" sizes=\"(max-width: 385px) 100vw, 385px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8100a40 elementor-widget elementor-widget-text-editor\" data-id=\"8100a40\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>\uc791\uc5c5 \ubc1c\ud589\uc790<\/strong> (task_publisher.py)<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1ef9e4f elementor-widget elementor-widget-code-highlight\" data-id=\"1ef9e4f\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp>import asyncio\nfrom nats.aio.client import Client as NATS\nfrom nats.aio.errors import ErrConnectionClosed, ErrTimeout, ErrNoServers\n\nasync def publish_messages(js, subject):\n    \"\"\"\n    Publishes a series of messages to the specified subject.\n    \"\"\"\n    try:\n        for i in range(1, 6):\n            message = f\"Message {i}\"\n            # Publish the message to the subject\n            await js.publish(subject, message.encode())\n            print(f\"Published: {message}\")\n            await asyncio.sleep(1)  # Wait for a second before sending the next message\n    except Exception as e:\n        print(f\"Error publishing message: {e}\")\n\nasync def main():\n    \"\"\"\n    Main coroutine that sets up the NATS client, connects to the server,\n    and publishes messages to a subject.\n    \"\"\"\n    nc = NATS()\n\n    try:\n        # Connect to the NATS server\n        await nc.connect(servers=[\"nats:\/\/localhost:4222\"])\n        print(\"Publisher connected to NATS server.\")\n\n        # Create JetStream context\n        js = nc.jetstream()\n\n        # Define the subject to publish to\n        subject = \"my.subject.test\"\n\n        # Publish messages\n        await publish_messages(js, subject)\n\n    except ErrNoServers as e:\n        print(f\"Could not connect to NATS server: {e}\")\n    except Exception as e:\n        print(f\"An error occurred: {e}\")\n    finally:\n        # Close the NATS connection\n        await nc.close()\n        print(\"Publisher disconnected from NATS server.\")\n\nif __name__ == '__main__':\n    asyncio.run(main())\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9ffeba0 elementor-widget elementor-widget-text-editor\" data-id=\"9ffeba0\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>\uc791\uc5c5\uc790<\/strong> (worker.py)<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6cc821d elementor-widget elementor-widget-code-highlight\" data-id=\"6cc821d\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp>import asyncio\nfrom nats.aio.client import Client as NATS\nfrom nats.aio.errors import ErrConnectionClosed, ErrTimeout, ErrNoServers\nfrom functools import partial\n\nasync def message_handler(msg, name):\n    \"\"\"\n    Callback function to handle received messages.\n    \"\"\"\n    data = msg.data.decode()\n    print(f\"[{name}] Received a message on '{msg.subject}': {data}\")\n    await msg.ack()  # Acknowledge the message\n\nasync def subscribe_to_subject(js, subject, queue_group, name):\n    \"\"\"\n    Subscribes to the specified subject with a given queue group and handles incoming messages.\n    \"\"\"\n    handler = partial(message_handler, name=name)\n    try:\n        # Subscribe to the subject with the specified queue group\n        await js.subscribe(subject, queue=queue_group, cb=handler)\n        print(f\"Subscriber is listening on '{subject}' with queue group '{queue_group}'.\")\n    except Exception as e:\n        print(f\"Error subscribing to subject: {e}\")\n\nasync def main(name):\n    \"\"\"\n    Main coroutine that sets up the NATS client, connects to the server,\n    and subscribes to a subject to receive messages.\n    \"\"\"\n    nc = NATS()\n\n    try:\n        # Connect to the NATS server\n        await nc.connect(servers=[\"nats:\/\/nats.nats:4222\"])\n        print(\"Subscriber connected to NATS server.\")\n\n        # Create JetStream context\n        js = nc.jetstream()\n\n        # Define the subject to subscribe to and the queue group\n        subject = \"my.subject.*\"\n        queue_group = \"workers\"\n\n        # Subscribe to the subject\n        await subscribe_to_subject(js, subject, queue_group, name)\n\n        # Keep the subscriber running to listen for incoming messages\n        print(f\"Subscriber '{name}' is running. Press Ctrl+C to exit.\")\n        while True:\n            await asyncio.sleep(1)\n\n    except ErrNoServers as e:\n        print(f\"Could not connect to NATS server: {e}\")\n    except asyncio.CancelledError:\n        pass  # Handle task cancellation gracefully\n    except Exception as e:\n        print(f\"An error occurred: {e}\")\n    finally:\n        # Close the NATS connection\n        await nc.close()\n        print(\"Subscriber disconnected from NATS server.\")\n\nif __name__ == '__main__':\n    # Define the queue group name\n    queue_group = \"order_group\"\n\n    # Create two consumer tasks in the same queue group\n    consumers = [\n        main(\"Consumer1\"),\n        main(\"Consumer2\"),\n    ]\n\n    # Run both consumers concurrently\n    loop = asyncio.get_event_loop()\n    try:\n        loop.run_until_complete(asyncio.gather(*consumers))\n    except KeyboardInterrupt:\n        print(\"Consumers are shutting down.\")\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fa30fa1 elementor-widget elementor-widget-text-editor\" data-id=\"fa30fa1\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>\ud14c\uc2a4\ud2b8 \uc2e4\ud589<\/strong><\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f9108ad elementor-widget elementor-widget-code-highlight\" data-id=\"f9108ad\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp># Start multiple workers\npython worker.py\n\n# In another terminal, Run the Task Publisher\npython task_publisher.py<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>NATS JetStream\uc740 \uace0\uae09 \uba54\uc2dc\uc9c0 \uc2a4\ud2b8\ub9ac\ubc0d \ubc0f \ub370\uc774\ud130 \uc800\uc7a5 \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\ub294 \ud655\uc7a5 \uae30\ub2a5\uc73c\ub85c, NATS\uc758 \uae30\ubcf8 \uba54\uc2dc\uc9d5 \uae30\ub2a5\uc744 \ud655\uc7a5\ud558\uc5ec \ub354 \ubcf5\uc7a1\ud55c \uc560\ud50c\ub9ac\ucf00\uc774\uc158&hellip;<\/p>\n","protected":false},"author":1,"featured_media":434,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[28],"tags":[],"class_list":["post-431","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-computer_kr"],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/realstudy.net\/wp-content\/uploads\/2024\/11\/nats_jetstream.webp","_links":{"self":[{"href":"https:\/\/realstudy.net\/index.php?rest_route=\/wp\/v2\/posts\/431","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/realstudy.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/realstudy.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/realstudy.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/realstudy.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=431"}],"version-history":[{"count":62,"href":"https:\/\/realstudy.net\/index.php?rest_route=\/wp\/v2\/posts\/431\/revisions"}],"predecessor-version":[{"id":519,"href":"https:\/\/realstudy.net\/index.php?rest_route=\/wp\/v2\/posts\/431\/revisions\/519"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/realstudy.net\/index.php?rest_route=\/wp\/v2\/media\/434"}],"wp:attachment":[{"href":"https:\/\/realstudy.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=431"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/realstudy.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=431"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/realstudy.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=431"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}