{"id":17870,"date":"2026-02-12T07:32:16","date_gmt":"2026-02-12T15:32:16","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=17870"},"modified":"2026-02-24T11:16:03","modified_gmt":"2026-02-24T19:16:03","slug":"build-a-rate-limiter-with-couchbase-eventing","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/ko\/build-a-rate-limiter-with-couchbase-eventing\/","title":{"rendered":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc774\ubca4\ud2b8\ub85c \uc18d\ub3c4 \uc81c\ud55c\uae30 \uad6c\ucd95\ud558\uae30"},"content":{"rendered":"<h1>\uc18c\uac1c<\/h1>\n<p>\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc11c\ubc84 8.0\uc740 \uace0\uac1d\uc774 \uc774\ubca4\ud2b8 \ud568\uc218 \ubc30\ud3ec \ub610\ub294 \uc7ac\uac1c \uc911\uc5d0 \uc678\ubd80 \ubcc0\uacbd \uc5c6\uc774\ub3c4 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \uc2e4\ud589\ud560 \uc218 \uc788\ub294 \uc0c8\ub85c\uc6b4 \uc774\ubca4\ud2b8 \ud568\uc218 \ud578\ub4e4\ub7ec\uc778 OnDeploy\ub97c \ub3c4\uc785\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\uc804\uc5d0\ub294 \uc774\ubca4\ud2b8 \uae30\ub2a5\uc744 \ubc30\ud3ec\ud558\uac70\ub098 \uc7ac\uac1c\ud558\uae30 \uc804\uc5d0 \ub85c\uc9c1\uc744 \uc2e4\ud589\ud574\uc57c \ud558\ub294 \uc0ac\uc6a9 \uc0ac\ub840\uac00 \uc788\ub294 \uace0\uac1d\uc5d0\uac8c\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uba87 \uac00\uc9c0 \uc120\ud0dd\uc9c0\uac00 \uc788\uc5c8\uc2b5\ub2c8\ub2e4:<\/p>\n<ol>\n<li>\ud544\uc694\ud55c \uc124\uc815\uc744 \uc9c1\uc811 \uc218\ub3d9\uc73c\ub85c \uc218\ud589\ud569\ub2c8\ub2e4.<\/li>\n<li>\uc774\ubca4\ud2b8 \uae30\ub2a5 \ubc30\ud3ec \ub610\ub294 \uc7ac\uc2dc\uc791\uc744 \ud2b8\ub9ac\uac70\ud558\uae30 \uc804\uc5d0 \uc678\ubd80 \uc2a4\ud06c\ub9bd\ud2b8\ub97c \ud1b5\ud574 \uc124\uc815\uc744 \uc790\ub3d9\ud654\ud558\uc138\uc694.<\/li>\n<\/ol>\n<p>\uc774 \ub450 \uac00\uc9c0 \ubc29\ubc95 \ubaa8\ub450 \ubc88\uac70\ub86d\uace0 \uc678\ubd80 \ub610\ub294 \uc218\ub3d9 \uac1c\uc785\uc5d0 \uc758\uc874\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc774\ubca4\ud2b8 \ud568\uc218 \ub77c\uc774\ud504\uc0ac\uc774\ud074\uc758 \u201c\ubc30\ud3ec\u201d \ubc0f \u201c\uc7ac\uac1c\u201d \uc774\ubca4\ud2b8\ub294 \ubcc0\uc774 \ucc98\ub9ac\ub97c \uc2dc\uc791\ud558\ub824\ub294 \uc2dc\uc810\uc744 \ud45c\uc2dc\ud569\ub2c8\ub2e4. \uc774\ub807\uac8c \ud558\uba74 <code style=\"color: #83c694\">OnDeploy<\/code> \ud578\ub4e4\ub7ec\ub294 \ub2e4\uc74c \uc791\uc5c5 \uc911 \ud558\ub098\ub97c \uc218\ud589\ud574\uc57c \ud558\ub294 \ub85c\uc9c1\uc744 \uc0bd\uc785\ud558\ub294 \ub370 \uc801\ud569\ud569\ub2c8\ub2e4:<\/p>\n<ol>\n<li>\ube44\ud589 \uc804 \uc810\uac80\uc744 \uc218\ud589\ud558\uc5ec \ud658\uacbd\uc774 \uc62c\ubc14\ub974\uac8c \uad6c\uc131\ub418\uc5c8\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4.<\/li>\n<li>\uce90\uc2dc(\uc608: \uc870\ud68c \ud14c\uc774\ube14)\ub97c \uc124\uc815\ud558\uc5ec \ud6a8\uc728\uc131\uc744 \uac1c\uc120\ud558\uc138\uc694.<\/li>\n<li>\ub2e4\uc591\ud55c Couchbase \ubc0f \uc678\ubd80 \uc11c\ube44\uc2a4\uc5d0\uc11c \ub370\uc774\ud130\ub97c \uc804\uc1a1, \uc218\uc9d1, \ucc98\ub9ac\ud569\ub2c8\ub2e4.<\/li>\n<li>\u201c\uc18c\uc2a4 \ud0a4 \uacf5\uac04\uc5d0\uc11c \ud558\ub098 \uc774\uc0c1\uc758 \ubb38\uc11c\ub97c \uc218\uc815\ud558\uc5ec \ubc30\ud3ec\/\uc7ac\uc2dc\uc791\ud55c \ud6c4 \uc774\ubca4\ud2b8 \ud568\uc218\ub97c \u201d\uc790\uccb4 \ud2b8\ub9ac\uac70'\ud569\ub2c8\ub2e4.\n<ol type=\"a\">\n<li>\uc774 \ub3cc\uc5f0\ubcc0\uc774\ub294 <code style=\"color: #83c694\">\uc628\uc5c5\ub370\uc774\ud2b8<\/code> \ubc0f\/\ub610\ub294 <code style=\"color: #83c694\">OnDelete<\/code> \ud578\ub4e4\ub7ec.<\/li>\n<li>\uc774\uac83\uc740 \uace0\uae09 \uc0ac\uc6a9 \uc0ac\ub840\uc785\ub2c8\ub2e4. <code style=\"color: #83c694\">OnDeploy<\/code> \uc65c\ub0d0\ud558\uba74 \uae30\uc874\uc5d0\ub294 \uc774\ubca4\ud2b8 \ud568\uc218 \uc2e4\ud589\uc774 \uc774\ubca4\ud2b8 \ud568\uc218 \uc790\uccb4 \ub610\ub294 \ud0c0\uc774\uba38 \ub9cc\ub8cc\uac00 \uc544\ub2cc \ub2e4\ub978 \uc5d4\ud2f0\ud2f0\uc5d0 \uc758\ud574 \uc18c\uc2a4 \ud0a4\uacf5\uac04\uc5d0 \ubcc0\uacbd\uc774 \ubc1c\uc0dd\ud560 \ub54c\ub9cc \ud2b8\ub9ac\uac70\ub418\ub3c4\ub85d \uc81c\ud55c\ub418\uc5b4 \uc788\uc5c8\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<h1>\uc18d\ub3c4 \uc81c\ud55c\uae30<\/h1>\n<p>\uc774 \uac8c\uc2dc\ubb3c\uc5d0\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \uac15\ub825\ud55c \uc18d\ub3c4 \uc81c\ud55c\uae30\ub97c \uad6c\ucd95\ud558\uaca0\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/en.wikipedia.org\/wiki\/Token_bucket\">\ud1a0\ud070 \ubc84\ud0b7 \uc54c\uace0\ub9ac\uc998<\/a> \uc640 Couchbase\uc758 Eventing \uc11c\ube44\uc2a4\ub97c \uc18c\uac1c\ud569\ub2c8\ub2e4. \uc774 \uacfc\uc815\uc5d0\uc11c \uc0c8\ub85c\uc6b4 OnDeploy \ud578\ub4e4\ub7ec\ub97c \uc9c1\uc811 \uacbd\ud5d8\ud558\uace0 Eventing\uc774 \ub2e4\ub978 Couchbase \uc11c\ube44\uc2a4\uc640\uc758 \ud1b5\ud569\uc744 \uac04\uc18c\ud654\ud558\ub294 \ubc29\ubc95\uc744 \uc54c\uc544\ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>\ub192\uc740 \uc218\uc900\uc758 \ub514\uc790\uc778<\/h2>\n<h3>\ub2e4\ucc28\uc6d0 \uc2a4\ucf00\uc77c\ub9c1<\/h3>\n<p><span style=\"font-weight: 400\">6\ub178\ub4dc \ud074\ub7ec\uc2a4\ud130\uc5d0\ub294 \ub178\ub4dc \uac04 \ub9e4\ud551\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc740 \uc11c\ube44\uc2a4\uac00 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4:<\/span><\/p>\n<table>\n<thead>\n<tr style=\"background-color: #fbce90\">\n<th>S.No.<\/th>\n<th>\ub178\ub4dc \ubc88\ud638<\/th>\n<th>\uc11c\ube44\uc2a4(\ub4e4)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr style=\"background-color: #f3f3f3\">\n<td>1.<\/td>\n<td>0<\/td>\n<td>\ub370\uc774\ud130<\/td>\n<\/tr>\n<tr>\n<td>2.<\/td>\n<td>1<\/td>\n<td>\ub370\uc774\ud130<\/td>\n<\/tr>\n<tr style=\"background-color: #f3f3f3\">\n<td>3.<\/td>\n<td>2<\/td>\n<td>\ub370\uc774\ud130<\/td>\n<\/tr>\n<tr>\n<td>4.<\/td>\n<td>3<\/td>\n<td>\uc774\ubca4\ud2b8, \ucffc\ub9ac<\/td>\n<\/tr>\n<tr style=\"background-color: #f3f3f3\">\n<td>5.<\/td>\n<td>4<\/td>\n<td>\uc774\ubca4\ud2b8, \ucffc\ub9ac<\/td>\n<\/tr>\n<tr>\n<td>6.<\/td>\n<td>5<\/td>\n<td>\uc778\ub371\uc2f1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"padding-top: 15px\">\ud074\ub7ec\uc2a4\ud130 \uc124\uc815\uc5d0 \ub300\ud574 \uba87 \uac00\uc9c0 \uc8fc\uc758\ud560 \uc810\uc774 \uc788\uc2b5\ub2c8\ub2e4:<\/p>\n<ul style=\"list-style-type: disc\">\n<li>\ub370\uc774\ud130 \ubcf5\uc81c\ub97c \ud1b5\ud574 \uc911\ubcf5\uc131\uc744 \ubcf4\uc7a5\ud558\uae30 \uc704\ud574 3\uac1c\uc758 \ub370\uc774\ud130 \uc11c\ube44\uc2a4 \ub178\ub4dc\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/li>\n<li>\uc774\ubca4\ud2b8 \uae30\ub2a5\uc758 \ubcd1\ub82c\uc131\uc744 \ub192\uc774\uae30 \uc704\ud574 2\uac1c\uc758 \ub178\ub4dc\uc5d0\uc11c \uc774\ubca4\ud2b8 \uc11c\ube44\uc2a4\ub97c \uc2e4\ud589\ud569\ub2c8\ub2e4.\n<ul style=\"list-style-type: circle;padding: 0px !important\">\n<li>\uc774\ub294 \uc774\ubca4\ud2b8 \uae30\ub2a5\uc5d0 \uc5ec\ub7ec \uba85\uc758 \uc6cc\ucee4\ub97c \ubc30\uce58\ud558\ub294 \uac83 \uc678\uc5d0\ub3c4 \uc218\ud589\ub429\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<li>\ub370\uc774\ud130 \ubc0f \uc774\ubca4\ud2b8\uc640 \uac19\uc774 CPU\ub97c \ub9ce\uc774 \uc0ac\uc6a9\ud558\ub294 \uc11c\ube44\uc2a4\ub294 \ubcc4\ub3c4\uc758 \ud074\ub7ec\uc2a4\ud130 \ub178\ub4dc\uc5d0 \ubcf4\uad00\ud574\uc57c \ud569\ub2c8\ub2e4.<\/li>\n<li>\ud0a4\uc2a4\ud398\uc774\uc2a4\uc758 \ubaa8\ub4e0 \ubb38\uc11c\ub97c \uc0ad\uc81c\ud558\ub294 \ub4f1\uc758 \ud2b9\uc815 \uc791\uc5c5\uc740 \ucffc\ub9ac \uc11c\ube44\uc2a4\ub97c \ud1b5\ud574 \ud3b8\ub9ac\ud558\uac8c \uc218\ud589\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0 \ucffc\ub9ac \uc11c\ube44\uc2a4\uac00 \ud544\uc694\ud569\ub2c8\ub2e4.<\/li>\n<li>\uc784\uc2dc \ubc84\ud0b7\uc5d0 \ub300\ud55c \uae30\ubcf8 \uc778\ub371\uc2a4\ub97c \uc0dd\uc131\ud558\ub824\uba74 \uc778\ub371\uc2f1 \uc11c\ube44\uc2a4\uac00 \ud544\uc694\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<h3>\ud0a4 \uc2a4\ud398\uc774\uc2a4<\/h3>\n<p>\ud074\ub7ec\uc2a4\ud130\uc5d0\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \ud0a4 \uc2a4\ud398\uc774\uc2a4\uac00 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4:<\/p>\n<table>\n<tbody>\n<tr>\n<th>S.No.<\/th>\n<th>\ubc84\ud0b7 \uc774\ub984<\/th>\n<th>\ubc84\ud0b7 \uc720\ud615<\/th>\n<th>\ubc94\uc704<\/th>\n<th>\uceec\ub809\uc158<\/th>\n<th>\uc124\uba85<\/th>\n<\/tr>\n<tr style=\"background-color: #f3f3f3\">\n<td>1<\/td>\n<td>\uae30\ubcf8\uac12<\/td>\n<td>\uce74\uc6b0\uce58\ubca0\uc774\uc2a4<\/td>\n<td>_\uae30\ubcf8\uac12<\/td>\n<td>_\uae30\ubcf8\uac12<\/td>\n<td>\n<ol>\n<li style=\"font-size: 14px\">\uc774\ubca4\ud2b8 \ud568\uc218\uc758 \u201c\ud568\uc218 \ubc94\uc704\u201d\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4.<\/li>\n<li style=\"font-size: 14px\">\uc774\ubca4\ud2b8 \ud568\uc218\uc758 \uba54\ud0c0\ub370\uc774\ud130\ub97c \uc800\uc7a5\ud558\ub294 \ub370 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.<\/li>\n<\/ol>\n<\/td>\n<\/tr>\n<tr style=\"background-color: #f3f3f3\">\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td>_system<\/td>\n<td>_\ubaa8\ubc14\uc77c<\/td>\n<td>-<\/td>\n<\/tr>\n<tr style=\"background-color: #f3f3f3\">\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td>_system<\/td>\n<td>_query<\/td>\n<td>-<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>\uc18d\ub3c4 \uc81c\ud55c\uae30<\/td>\n<td>\uc784\uc2dc<\/td>\n<td>_\uae30\ubcf8\uac12<\/td>\n<td>_\uae30\ubcf8\uac12<\/td>\n<td>-<\/td>\n<\/tr>\n<tr>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td>_system<\/td>\n<td>_\ubaa8\ubc14\uc77c<\/td>\n<td>-<\/td>\n<\/tr>\n<tr>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td>_system<\/td>\n<td>_query<\/td>\n<td>-<\/td>\n<\/tr>\n<tr>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td>my-llm<\/td>\n<td>\uc81c\ud55c<\/td>\n<td>\ud2f0\uc5b4 \uac04 \uc694\uae08 \ud55c\ub3c4 \ub9e4\ud551\uc774 \ud3ec\ud568\ub41c \ubb38\uc11c\ub97c \uc800\uc7a5\ud569\ub2c8\ub2e4.<\/td>\n<\/tr>\n<tr>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td>my-llm<\/td>\n<td>\ucd94\uc801\uae30<\/td>\n<td>\uce74\uc6b4\ud130 \ubb38\uc11c\ub97c \uc800\uc7a5\ud558\uc5ec \uac1c\ubcc4 \uc0ac\uc6a9\uc790\uc758 \uc0ac\uc6a9\ub7c9\uc744 \ucd94\uc801\ud558\uc138\uc694.<\/td>\n<\/tr>\n<tr style=\"background-color: #f3f3f3\">\n<td>3<\/td>\n<td>my-llm<\/td>\n<td>\uce74\uc6b0\uce58\ubca0\uc774\uc2a4<\/td>\n<td>_\uae30\ubcf8\uac12<\/td>\n<td>_\uae30\ubcf8\uac12<\/td>\n<td>-<\/td>\n<\/tr>\n<tr style=\"background-color: #f3f3f3\">\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td>_system<\/td>\n<td>_\ubaa8\ubc14\uc77c<\/td>\n<td>-<\/td>\n<\/tr>\n<tr style=\"background-color: #f3f3f3\">\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td>_system<\/td>\n<td>_query<\/td>\n<td>-<\/td>\n<\/tr>\n<tr style=\"background-color: #f3f3f3\">\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td>\uc0ac\uc6a9\uc790<\/td>\n<td>\uacc4\uc815<\/td>\n<td>\u201c\ud2f0\uc5b4'\ub97c \ud3ec\ud568\ud55c \uc0ac\uc6a9\uc790 \uacc4\uc815 \uc138\ubd80 \uc815\ubcf4\ub97c \uc800\uc7a5\ud569\ub2c8\ub2e4.<\/td>\n<\/tr>\n<tr style=\"background-color: #f3f3f3\">\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td>\uc0ac\uc6a9\uc790<\/td>\n<td>\uc774\ubca4\ud2b8<\/td>\n<td>\uc0ac\uc6a9\uc790\uc758 \u201c\ud2f0\uc5b4'\uc5d0 \ub530\ub77c \uc694\uae08\uc774 \uc81c\ud55c\ub418\uc5b4\uc57c \ud558\ub294 \uc0ac\uc6a9\uc790 \uc774\ubca4\ud2b8\ub97c \uc800\uc7a5\ud569\ub2c8\ub2e4.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"padding-bottom: 0px !important\">\ucc38\uace0:<\/p>\n<ul>\n<li>\uadf8\ub9ac\uace0 <code style=\"color: #83c694\">\uc18d\ub3c4 \uc81c\ud55c\uae30<\/code> \ubc84\ud0b7\uc740 <code style=\"color: #83c694\">\uc784\uc2dc<\/code> \ub370\uc774\ud130\ub97c \uc720\uc9c0\ud560 \ud544\uc694\uac00 \uc5c6\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4. \ud574\ub2f9 \ubc84\ud0b7\uc758 \ub370\uc774\ud130\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc0ac\uc6a9\uc790\ubcc4 \uc694\uae08 \uc81c\ud55c \uc0ac\uc6a9\ub7c9\uc744 \ucd94\uc801\ud558\uace0 \uacc4\uce35 \uac04 \uc694\uae08 \uc81c\ud55c \ub9e4\ud551\uc744 \uce90\uc2dc\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<h3>\uc678\ubd80 REST API \uc5d4\ub4dc\ud3ec\uc778\ud2b8<\/h3>\n<p>\uc774\ubca4\ud2b8 \ud568\uc218\ub294 \ub2e4\uc74c \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\ub294 \uc678\ubd80 API \uc5d4\ub4dc\ud3ec\uc778\ud2b8\uc640 \uc0c1\ud638 \uc791\uc6a9\ud569\ub2c8\ub2e4:<\/p>\n<ol>\n<li>\ucd5c\uc2e0 \ud2f0\uc5b4-\uc694\uae08 \uc81c\ud55c \ub9e4\ud551\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/li>\n<li>\ud2f0\uc5b4-\uc694\uae08 \ud55c\ub3c4 \ub9e4\ud551\uc5d0 \ub300\ud55c \uc218\uc815\uc744 \uc218\ub77d\ud569\ub2c8\ub2e4.<\/li>\n<li>\uc774\ubca4\ud2b8 \uae30\ub2a5\uc744 \ud1b5\ud574 \uc0ac\uc6a9\uc790\uc758 \uc694\uae08 \ud55c\ub3c4 \ub0b4\uc5d0\uc11c \ub4e4\uc5b4\uc624\ub294 \uc694\uccad\uc744 \uc218\ub77d\ud569\ub2c8\ub2e4.\n<ol type=\"a\">\n<li>\uc774 \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub294 \uc774\ub7ec\ud55c \uc218\uc2e0 \uc694\uccad\uc758 \uc218\ub97c \uc720\uc9c0\ud569\ub2c8\ub2e4.<br \/>\n\uc774 \uce74\uc6b4\ud2b8\ub294 \uc18d\ub3c4 \uc81c\ud55c\uae30 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \uc608\uc0c1\ub300\ub85c \uc791\ub3d9\ud558\ub294\uc9c0 \ud655\uc778\ud558\ub294 \ub370 \ub3c4\uc6c0\uc774 \ub429\ub2c8\ub2e4.<\/li>\n<\/ol>\n<\/li>\n<li>\uc774\ubca4\ud2b8 \uae30\ub2a5\uc5d0\uc11c \uc0ac\uc6a9\uc790\uc758 \uc694\uae08 \ud55c\ub3c4 \ub0b4\uc5d0 \uc788\ub294 \uac83\uc73c\ub85c \uac04\uc8fc\ud55c \uc218\uc2e0 \uc694\uccad \uc218\ub97c \uc785\ub825\ud569\ub2c8\ub2e4.<\/li>\n<\/ol>\n<p>\uc704 API \uc5d4\ub4dc\ud3ec\uc778\ud2b8\uc758 OpenAPI \uc0ac\uc591\uc5d0 \ub300\ud55c \ub9c1\ud06c\ub294 \ub2e4\uc74c\uc5d0\uc11c \ucc3e\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/github.com\/couchbaselabs\/eventing-rate-limiter\/blob\/master\/openapi\/server-api-spec.yaml\">\uc5ec\uae30<\/a>.<\/p>\n<p>\ucc38\uace0: \uc774\ub7ec\ud55c REST API \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub97c \ud638\uc2a4\ud305\ud558\ub294 Go \ud504\ub85c\uadf8\ub7a8\uc740 \ubd80\ub85d\uc5d0 \ub9c1\ud06c\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>\ub85c\uc6b0 \ub808\ubca8 \ub514\uc790\uc778<\/h2>\n<h3>\uc774\ubca4\ud2b8 \uae30\ub2a5 \uc124\uc815<\/h3>\n<p>\uc544\ub798\ub294 \uc774\ubca4\ud2b8 \uae30\ub2a5\uc758 \uae30\ubcf8 \uc124\uc815\uc5d0 \ubcc0\uacbd\ud574\uc57c \ud558\ub294 \ubaa8\ub4e0 \ubcc0\uacbd \uc0ac\ud56d \ubaa9\ub85d\uc785\ub2c8\ub2e4.<\/p>\n<p><strong>\ud0a4 \uc2a4\ud398\uc774\uc2a4<\/strong><\/p>\n<table>\n<thead>\n<tr style=\"background-color: #fbce90\">\n<th>S.No.<\/th>\n<th>\ud544\ub4dc<\/th>\n<th>\uac00\uce58<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr style=\"background-color: #f3f3f3\">\n<td>1.<\/td>\n<td>\uae30\ub2a5 \ubc94\uc704<\/td>\n<td>default._default<\/td>\n<\/tr>\n<tr>\n<td>2.<\/td>\n<td>\uc18c\uc2a4 \ud0a4\uc2a4\ud398\uc774\uc2a4<\/td>\n<td>my-llm.users.events<\/td>\n<\/tr>\n<tr style=\"background-color: #f3f3f3\">\n<td>3.<\/td>\n<td>\uc774\ubca4\ud2b8 \uc2a4\ud1a0\ub9ac\uc9c0 \ud0a4\uacf5\uac04<\/td>\n<td>\uae30\ubcf8\uac12._\uae30\ubcf8\uac12._\uae30\ubcf8\uac12<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>\uc124\uc815<\/strong><\/p>\n<table>\n<thead>\n<tr style=\"background-color: #fbce90\">\n<th>S.No.<\/th>\n<th>\ud544\ub4dc<\/th>\n<th>\uac00\uce58<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr style=\"background-color: #f3f3f3\">\n<td>1.<\/td>\n<td>\uc774\ub984<\/td>\n<td>my-llm-rate-limiter<\/td>\n<\/tr>\n<tr>\n<td>2.<\/td>\n<td>\ubc30\ud3ec \ud53c\ub4dc \uacbd\uacc4<\/td>\n<td>\uc9c0\uae08\ubd80\ud130<\/td>\n<\/tr>\n<tr style=\"background-color: #f3f3f3\">\n<td>3.<\/td>\n<td>\uc124\uba85<\/td>\n<td>\uc774 \uc774\ubca4\ud2b8 \ud568\uc218\ub294 \uc18d\ub3c4 \uc81c\ud55c\uae30 \uc5ed\ud560\uc744 \ud569\ub2c8\ub2e4.<\/td>\n<\/tr>\n<tr>\n<td>4.<\/td>\n<td>\uc791\uc5c5\uc790<\/td>\n<td>10<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>\ubc84\ud0b7 \ubc14\uc778\ub529<\/strong><\/p>\n<table>\n<thead>\n<tr>\n<th rowspan=\"2\">S.No.<\/th>\n<th rowspan=\"2\">\ubc84\ud0b7<br \/>\nAlias<\/th>\n<th colspan=\"3\">\ud0a4 \uc2a4\ud398\uc774\uc2a4<\/th>\n<th rowspan=\"2\">\uc561\uc138\uc2a4<\/th>\n<\/tr>\n<tr>\n<th>\ubc84\ud0b7<\/th>\n<th>\ubc94\uc704<\/th>\n<th>\uceec\ub809\uc158<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr style=\"background-color: #f3f3f3\">\n<td>1.<\/td>\n<td class=\"left\">\uc0ac\uc6a9\uc790 \uacc4\uc815<\/td>\n<td>my-llm<\/td>\n<td>\uc0ac\uc6a9\uc790<\/td>\n<td>\uacc4\uc815<\/td>\n<td>\uc77d\uae30 \uc804\uc6a9<\/td>\n<\/tr>\n<tr>\n<td>2.<\/td>\n<td class=\"left\">rateLimiter<\/td>\n<td>\uc18d\ub3c4 \uc81c\ud55c\uae30<\/td>\n<td>my-llm<\/td>\n<td>\ucd94\uc801\uae30<\/td>\n<td>\uc77d\uae30 \ubc0f \uc4f0\uae30<\/td>\n<\/tr>\n<tr style=\"background-color: #f3f3f3\">\n<td>3.<\/td>\n<td class=\"left\">\uacc4\uce35 \uc81c\ud55c<\/td>\n<td>\uc18d\ub3c4 \uc81c\ud55c\uae30<\/td>\n<td>my-llm<\/td>\n<td>\uc81c\ud55c<\/td>\n<td>\uc77d\uae30 \ubc0f \uc4f0\uae30<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>URL \ubc14\uc778\ub529<\/strong><\/p>\n<table>\n<thead>\n<tr>\n<th class=\"center\">S.No.<\/th>\n<th class=\"left\">URL \ubcc4\uce6d<\/th>\n<th class=\"left\">URL<\/th>\n<th class=\"center\">Auth<\/th>\n<th class=\"left\">\uc0ac\uc6a9\uc790 \uc774\ub984<\/th>\n<th class=\"left\">\ube44\ubc00\ubc88\ud638<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr style=\"background-color: #f3f3f3\">\n<td class=\"center\">1.<\/td>\n<td class=\"left\">llmEndpoint<\/td>\n<td class=\"left nowrap\">http:\/\/localhost:3054\/my-llm<\/td>\n<td class=\"center\" rowspan=\"2\">\uae30\ubcf8<\/td>\n<td class=\"left\" rowspan=\"2\">\uc774\ubca4\ud2b8<\/td>\n<td class=\"left\" rowspan=\"2\">Eventing123<\/td>\n<\/tr>\n<tr>\n<td class=\"center\">2.<\/td>\n<td class=\"left\">\uacc4\uce35 \uc5d4\ub4dc\ud3ec\uc778\ud2b8<\/td>\n<td class=\"left nowrap\">http:\/\/localhost:3054\/tiers<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>\ucc38\uace0:<\/strong> \u201c\ucfe0\ud0a4 \ud5c8\uc6a9\u201d \ubc0f \u201cSSL \uc778\uc99d\uc11c \uc720\ud6a8\uc131 \uac80\uc0ac\u201d \uc635\uc158\uc774 \ubaa8\ub450 \ube44\ud65c\uc131\ud654\ub429\ub2c8\ub2e4.<\/p>\n<h3>\uc804\uccb4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ud750\ub984\ub3c4<\/h3>\n<p><img decoding=\"async\" style=\"border: 1px solid\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Complete-Application-Flow-Diagram.png\" alt=\"Complete Application Flow Diagram\" \/><\/p>\n<p>\uc774 \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc740 \ud1a0\ud070 \ubc84\ud0b7 \uc54c\uace0\ub9ac\uc998\uc5d0 \ub530\ub77c \uc18d\ub3c4 \uc81c\ud55c\uae30\ub85c \uc791\ub3d9\ud558\ub294 \uc774\ubca4\ud2b8 \ud568\uc218 \ud578\ub4e4\ub7ec, \uc678\ubd80 REST API \uc5d4\ub4dc\ud3ec\uc778\ud2b8 \ubc0f \ud0a4 \uacf5\uac04 \uac04\uc758 \uc0c1\ud638 \uc791\uc6a9\uc744 \ubcf4\uc5ec\uc90d\ub2c8\ub2e4.<br \/>\n\ub2e4\uc74c \uc139\uc158\uc5d0\uc11c\ub294 \uc18d\ub3c4 \uc81c\ud55c\uae30\ub97c \ub2e8\uacc4\ubcc4\ub85c \uad6c\ud604\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<h3><code style=\"color: #83c694\">OnDeploy<\/code> \uc124\uc815<\/h3>\n<h4>\uc678\ubd80 REST API \uc5d4\ub4dc\ud3ec\uc778\ud2b8\uc5d0\uc11c \uacc4\uce35 \uac00\uc838\uc624\uae30 \ubc0f \uc800\uc7a5\ud558\uae30<\/h4>\n<p><img decoding=\"async\" style=\"border: 1px solid\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Get-and-Store-the-Tiers-From-the-External-REST-API-Endpoint.png\" alt=\"Get and Store the Tiers From the External REST API Endpoint\" \/><\/p>\n<p>\uc5b8\uc81c <code style=\"color: #83c694\">OnDeploy<\/code> \ud578\ub4e4\ub7ec\uac00 \uc2e4\ud589\ub418\uae30 \uc2dc\uc791\ud558\uba74 \uba3c\uc800 \uc678\ubd80 REST API \uc5d4\ub4dc\ud3ec\uc778\ud2b8\uc5d0\uc11c <code style=\"color: #83c694\">\uacc4\uce35 \uc5d4\ub4dc\ud3ec\uc778\ud2b8<\/code> URL \ubc14\uc778\ub529.<br \/>\n\uc758 \uc751\ub2f5\uc740 <code style=\"color: #83c694\">\/\ud2f0\uc5b4<\/code> \uc678\ubd80 REST API\ub294 \uacc4\uce35 \uc774\ub984\uc5d0\uc11c \ub9e4\ud551\uc744 \ud3ec\ud568\ud558\ub294 JSON \uac12( <code style=\"color: #83c694\">\ubb38\uc790\uc5f4<\/code>)\ub97c \uc2dc\uac04\ub2f9 \ud5c8\uc6a9\ub418\ub294 \ucd1d \uc694\uccad \uc218(\uc989, \ucd1d_\uc694\uccad_\uc218)\ub85c \ud45c\uc2dc\ub418\ub294 \uc2dc\uac04\ub2f9 \uc694\uae08 \ud55c\ub3c4(\uc720\ud615 <code style=\"color: #83c694\">\uc22b\uc790<\/code>).<br \/>\n\ud2f0\uc5b4-\uc694\uae08 \uc81c\ud55c \ub9e4\ud551\uc740 \uc694\uae08 \uc81c\ud55c\uc5d0 \ub300\ud55c \ub9e4\ud551\uc744 <code style=\"color: #83c694\">rate-limit.my-llm.limits<\/code> \ud0a4\uc2a4\ud398\uc774\uc2a4.<\/p>\n<pre class=\"lang:default decode:true\">function OnDeploy(action) {\r\n    \/\/ ...\r\n\r\n    \/\/ GET the tiers from the `tiersEndpoint`\r\n    const response = curl('GET', tiersEndpoint);\r\n    if (response.status != 200) {\r\n        throw new Error(\"Error(Cannot get tiers): \" + JSON.stringify(response));\r\n    }\r\n    const tiers = response.body;\r\n    log(\"Successfully retrieved the tiers: \" + JSON.stringify(tiers));\r\n\r\n    \/\/ Write the tiers to the `tierLimits` keyspace, in the document with ID `limits`\r\n    tierLimits[\"limits\"] = tiers;\r\n\r\n    \/\/ ...\r\n\r\n    \/\/ Create a timer to run every 24 hours to refresh the tiers\r\n    let timeAfter24hours = new Date();\r\n    timeAfter24hours.setDate(timeAfter24hours.getDate() + 1);\r\n    log(\"Time after 24 hours is: \" + timeAfter24hours);\r\n\r\n    createTimer(updateTierCallback, timeAfter24hours, \"tier-updater\", {});\r\n\r\n   \/\/ ...\r\n}\r\n\r\n\/\/ Function to update the user tiers every 24 hours\r\nfunction updateTierCallback(context) {\r\n    log('From updateTierCallback: timer fired');\r\n\r\n    \/\/ GET the tiers from the `tiersEndpoint`\r\n    const response = curl('GET', tiersEndpoint);\r\n    if (response.status != 200) {\r\n        log(\"Error(Cannot get tiers): \" + JSON.stringify(response));\r\n    } else {\r\n        const tiers = response.body;\r\n        log(\"Successfully retrieved the tiers: \" + JSON.stringify(tiers));\r\n\r\n        \/\/ Write the tiers to the `tierLimits` keyspace, in the document with ID `limits`\r\n        tierLimits[\"limits\"] = tiers;\r\n    }\r\n\r\n    \/\/ Create a timer to run every 24 hours to refresh the tiers\r\n    let timeAfter24hours = new Date();\r\n    timeAfter24hours.setDate(timeAfter24hours.getDate() + 1);\r\n    log(\"Time after 24 hours is: \" + timeAfter24hours);\r\n\r\n    createTimer(updateTierCallback, timeAfter24hours, \"tier-updater\", {});\r\n}\r\n<\/pre>\n<h4>\ubc30\ud3ec \uc2dc \ubaa8\ub4e0 \uc18d\ub3c4 \uc81c\ud55c \ucd94\uc801\uae30 \ucd08\uae30\ud654<\/h4>\n<p><img decoding=\"async\" style=\"border: 1px solid\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Reset-All-Rate-Limit-Trackers-When-Deploying.png\" alt=\"Reset All Rate Limit Trackers When Deploying\" \/><\/p>\n<p>\uc800\ud76c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c\ub294 \uc774\ubca4\ud2b8 \uae30\ub2a5\uc758 \ubc30\ud3ec \uc911\ub2e8\uc744 \ud558\ub4dc \uc167\ub2e4\uc6b4\uc73c\ub85c \ubaa8\ub378\ub9c1\ud558\uc5ec \ubc30\ud3ec\ud558\ub294 \ub3d9\uc548 \uc0ac\uc6a9\uc790\uc758 \uc18d\ub3c4 \uc81c\ud55c \uc0ac\uc6a9\uc744 \ucd94\uc801\ud558\ub294 \ubaa8\ub4e0 \ubb38\uc11c\ub97c \uc0ad\uc81c\ud569\ub2c8\ub2e4. \uc77c\uc2dc \uc911\uc9c0\ub294 \uc18d\ub3c4 \uc81c\ud55c \ud65c\ub3d9\uc758 \uc77c\uc2dc\uc801\uc778 \uc911\ub2e8\uc73c\ub85c \ubaa8\ub378\ub9c1\ud558\ubbc0\ub85c \uc774\ubca4\ud2b8 \uae30\ub2a5\uc774 \uc7ac\uac1c\ub420 \uacbd\uc6b0 \ud574\ub2f9 \ubb38\uc11c\ub97c \uc9c0\uc6b0\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ubc30\ud3ec\uc640 \uc7ac\uac1c \uc791\uc5c5\uc744 \ubcc4\ub3c4\ub85c \ucc98\ub9ac\ud558\ub294 \ubc29\uc2dd\uc774 \uad81\uae08\ud558\uc2e0\uac00\uc694? <code style=\"color: #83c694\">OnDeploy<\/code> \ub294 \uc774\ub7ec\ud55c \uc0ac\uc6a9 \uc0ac\ub840\ub97c \uac00\ub2a5\ud558\uac8c \ud558\ub294 \uc774\uc720\ub294 \uc774\ubca4\ud2b8\uac00 <code style=\"color: #83c694\">\uc774\uc720<\/code> \ud544\ub4dc\uc5d0 <code style=\"color: #83c694\">\uc561\uc158<\/code> \uac1d\uccb4\uc5d0 \ub300\ud55c <code style=\"color: #83c694\">OnDeploy<\/code> \ud578\ub4e4\ub7ec\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc774\ubca4\ud2b8 \ud568\uc218\uc758 \ubc30\ud3ec \ub610\ub294 \uc7ac\uac1c \uc5ec\ubd80\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:default decode:true\">function OnDeploy(action) {\r\n    \/\/ ...\r\n \r\n    \/\/ If we are deploying, then we should delete all the existing document in the keyspace `rateLimiter`\r\n    if (action.reason === \"deploy\") {\r\n        let results = N1QL(\"DELETE FROM `rate-limiter`.`my-llm`.tracker\");\r\n        results.close();\r\n        log(\"Deleted all the documents in the `rate-limiter`.`my-llm`.tracker keyspace as we are deploying!\");\r\n    }\r\n\r\n    \/\/ ...\r\n}\r\n<\/pre>\n<h4>\ub9e4 \uc2dc\uac04\ub9c8\ub2e4 \uc0ac\uc6a9\uc790 \uc694\uae08 \ud55c\ub3c4 \uc7ac\uc124\uc815\ud558\uae30<\/h4>\n<p><img decoding=\"async\" style=\"border: 1px solid\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Reset-the-Users-Rate-Limits-Every-Hour.png\" alt=\"Reset the Users\u2019 Rate Limits Every Hour\" \/><\/p>\n<p>\ud1a0\ud070 \ubc84\ud0b7 \uc54c\uace0\ub9ac\uc998\uc744 \uad6c\ud604\ud558\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0 \ud0c0\uc774\uba38\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub9e4\uc2dc\uac04 \uc0ac\uc6a9\uc790\uc758 \uc694\uae08 \ud55c\ub3c4\ub97c \uc7ac\uc124\uc815\ud558\ub294\ub370, \uc774\ub294 \uc800\ud76c \uc0ac\uc6a9 \uc0ac\ub840\uc5d0 \ub9e4\uc6b0 \uc911\uc694\ud55c \uc774\ubca4\ud2b8 \uae30\ub2a5\uc785\ub2c8\ub2e4. \uccab \ubc88\uc9f8 \ud0c0\uc774\uba38\ub294 <code style=\"color: #83c694\">OnDeploy<\/code> \ud578\ub4e4\ub7ec\uc5d0 1\uc2dc\uac04 \ud6c4\uc5d0 \uc2e4\ud589\ub418\ub3c4\ub85d \uc124\uc815\ud569\ub2c8\ub2e4. \ud0c0\uc774\uba38 \ucf5c\ubc31\uc774 \uc2e4\ud589\ub418\uba74 1\uc2dc\uac04 \ud6c4\uc5d0 \uc2e4\ud589\ub420 \uc0c8 \ud0c0\uc774\uba38\ub97c \uc0dd\uc131\ud558\ub294 \uc2dd\uc73c\ub85c \uc774\ubca4\ud2b8 \uae30\ub2a5\uc774 \ubc30\ud3ec\ub418\uc5b4 \uc788\ub294 \ud55c \ub9e4 \uc2dc\uac04\ub9c8\ub2e4 \uc2e4\ud589\ub418\ub294 \uc790\uccb4 \ubc18\ubcf5 \ud0c0\uc774\uba38\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc774 \ud0c0\uc774\uba38\ub97c \uc0dd\uc131\ud558\uae30 \uc704\ud574 \uc774\ubca4\ud2b8 \ud568\uc218\ub97c \ud2b8\ub9ac\uac70\ud558\ub294 \ub370 \uc678\ubd80 \ubcc0\uc774\uac00 \ud544\uc694\ud558\uc9c0 \uc54a\uc740 \uac83\uc744 \uad00\ucc30\ud558\uc138\uc694. \uc774 \ubaa8\ub4e0 \uc791\uc5c5\uc740 \ubc30\ud3ec\/\uc7ac\uc2dc\uc791 \uc2dc <code style=\"color: #83c694\">OnDeploy<\/code> \ud578\ub4e4\ub7ec.<\/p>\n<pre class=\"lang:default decode:true\">function OnDeploy(action) {\r\n    \/\/ ...\r\n\r\n    \/\/ Create a timer to run every 1 hour to reset user rate limits\r\n    let timeAfter1Hour = new Date();\r\n    timeAfter1Hour.setHours(timeAfter1Hour.getHours() + 1);\r\n    log(\"Time after 1 hour is: \" + timeAfter1Hour);\r\n\r\n    createTimer(resetRateLimiter, timeAfter1Hour, \"rate-limit-resetter\", {});\r\n\r\n    \/\/ ...\r\n}\r\n\r\n\/\/ Function to reset the rate limits for all users every 1 hour\r\nfunction resetRateLimiter(context) {\r\n    log('From resetRateLimiter: timer fired');\r\n\r\n    let results = N1QL(\"DELETE FROM `rate-limiter`.`my-llm`.tracker\");\r\n    results.close();\r\n\r\n    \/\/ Create a timer to run every 1 hour to reset user rate limits\r\n    let timeAfter1Hour = new Date();\r\n    timeAfter1Hour.setHours(timeAfter1Hour.getHours() + 1);\r\n    log(\"Time after 1 hour is: \" + timeAfter1Hour);\r\n\r\n    createTimer(resetRateLimiter, timeAfter1Hour, \"rate-limit-resetter\", {});\r\n}\r\n<\/pre>\n<h4>\ub9e4\uc77c \ud2f0\uc5b4 \uc694\uae08 \ud55c\ub3c4 \uc0c8\ub85c \uace0\uce68<\/h4>\n<p><img decoding=\"async\" style=\"border: 1px solid\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Refresh-Tier-Rate-Limits-Daily.png\" alt=\"Refresh Tier Rate Limits Daily\" \/><\/p>\n<p>\uc800\ud76c\ub294 24\uc2dc\uac04\ub9c8\ub2e4 \uc694\uae08 \uc81c\ud55c\uc744 \ubcc0\uacbd\ud560 \uc218 \uc788\ub3c4\ub85d \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ubaa8\ub378\ub9c1\ud558\ubbc0\ub85c, \uc774\ubca4\ud2b8 \uae30\ub2a5\uc740 24\uc2dc\uac04\ub9c8\ub2e4 \uc678\ubd80 REST API \uc5d4\ub4dc\ud3ec\uc778\ud2b8\uc5d0\uc11c \ucd5c\uc2e0 \uacc4\uce35-\uc694\uae08 \uc81c\ud55c \ub9e4\ud551\uc744 \uac00\uc838\uc640\uc57c \uc0ac\uc6a9\uc790\uc5d0\uac8c \uc62c\ubc14\ub978 \uc694\uae08 \uc81c\ud55c\uc774 \uc801\uc6a9\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\uc2dc \ub9d0\ud558\uc9c0\ub9cc, \uc790\ub3d9 \ubc18\ubcf5 \ud0c0\uc774\uba38\ub97c \uc0ac\uc6a9\ud558\uc5ec 24\uc2dc\uac04\ub9c8\ub2e4 \ucd5c\uc2e0 \ud2f0\uc5b4-\uc18d\ub3c4 \uc81c\ud55c \ub9e4\ud551\uc744 \uac00\uc838\uc635\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:default decode:true\">function OnDeploy(action) {\r\n    \/\/ ...\r\n\r\n    \/\/ Create a timer to run every 24 hours to refresh the tiers\r\n    let timeAfter24hours = new Date();\r\n    timeAfter24hours.setDate(timeAfter24hours.getDate() + 1);\r\n    log(\"Time after 24 hours is: \" + timeAfter24hours);\r\n\r\n    createTimer(updateTierCallback, timeAfter24hours, \"tier-updater\", {});\r\n\r\n    \/\/ ...\r\n}\r\n\r\n\/\/ Function to update the user tiers every 24 hours\r\nfunction updateTierCallback(context) {\r\n    log('From updateTierCallback: timer fired');\r\n\r\n    \/\/ GET the tiers from the `tiersEndpoint`\r\n    const response = curl('GET', tiersEndpoint);\r\n    if (response.status != 200) {\r\n        log(\"Error(Cannot get tiers): \" + JSON.stringify(response));\r\n    } else {\r\n        const tiers = response.body;\r\n        log(\"Successfully retrieved the tiers: \" + JSON.stringify(tiers));\r\n\r\n        \/\/ Write the tiers to the `tierLimits` keyspace, in the document with ID `limits`\r\n        tierLimits[\"limits\"] = tiers;\r\n    }\r\n\r\n    \/\/ Create a timer to run every 24 hours to refresh the tiers\r\n    let timeAfter24hours = new Date();\r\n    timeAfter24hours.setDate(timeAfter24hours.getDate() + 1);\r\n    log(\"Time after 24 hours is: \" + timeAfter24hours);\r\n\r\n    createTimer(updateTierCallback, timeAfter24hours, \"tier-updater\", {});\r\n}\r\n<\/pre>\n<h3><code style=\"color: #83c694\">\uc628\uc5c5\ub370\uc774\ud2b8<\/code> \uc124\uc815<\/h3>\n<h4>\uc0ac\uc6a9\uc790 \uc774\ubca4\ud2b8 \ucc98\ub9ac<\/h4>\n<p><img decoding=\"async\" style=\"border: 1px solid\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Handling-User-Events.png\" alt=\"Handling User Events\" \/><\/p>\n<p>\uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc740 \ub2e4\uc74c\uc5d0\uc11c \ub4e4\uc5b4\uc624\ub294 \uc694\uccad \ubb38\uc11c\ub97c \uc218\uc2e0\ud569\ub2c8\ub2e4. <code style=\"color: #83c694\">my-llm.users.events<\/code> \ud0a4\uc2a4\ud398\uc774\uc2a4. \uc774\ub7ec\ud55c \ubb38\uc11c\uc5d0\ub294 \uace0\uc720 ID\uac00 \uc788\uc73c\uba70 \ud574\ub2f9 \ud615\uc2dd\uc758 \ub370\uc774\ud130\uac00 \ud3ec\ud568\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">{\r\n    \"user_id\": String,\r\n    \"respond_to\": String,\r\n    \"payload\": String,\r\n    \"header\": String\r\n}\r\n<\/pre>\n<p>\uc0ac\uc6a9\uc790\uc758 \uc694\uccad\uc774 \uc804\uc1a1\ub960 \ud55c\ub3c4 \ub0b4\uc5d0 \uc788\ub294 \uacbd\uc6b0, \uc0ac\uc6a9\uc790_ID\ub97c \uc81c\uc678\ud55c \ubb38\uc11c\uc758 \ubaa8\ub4e0 \ub370\uc774\ud130\ub294 \uc804\uc1a1\ub960 \uc81c\ud55c\uae30\ub85c \ubcf4\ud638\ub418\ub294 \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub85c \uc804\uc1a1\ub429\ub2c8\ub2e4.<\/p>\n<h4>\uc0ac\uc6a9\uc790 \uacc4\uce35 \uc77d\uae30<\/h4>\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Reading-the-Users-Tier.png\" alt=\"Reading the User\u2019s Tier\" \/><br \/>\n\uc5b8\uc81c <code style=\"color: #83c694\">\uc628\uc5c5\ub370\uc774\ud2b8<\/code> \ud578\ub4e4\ub7ec\uac00 \uc774\uc804 \ub2e8\uacc4\uc5d0\uc11c \ub4e4\uc5b4\uc624\ub294 \uc0ac\uc6a9\uc790 \uc774\ubca4\ud2b8 \ubb38\uc11c\uc5d0 \uc758\ud574 \ud2b8\ub9ac\uac70\ub418\uba74, \uc774\uc804 \ub2e8\uacc4\uc758 <code style=\"color: #83c694\">user_id<\/code> \ud544\ub4dc\ub85c \uc774\ub3d9\ud569\ub2c8\ub2e4.<br \/>\n\uc0ac\uc6a9 <code style=\"color: #83c694\">user_id<\/code> \ud544\ub4dc\uc5d0\uc11c \uc0ac\uc6a9\uc790\uc758 \uacc4\uc815 \uc138\ubd80 \uc815\ubcf4 \ubb38\uc11c\ub97c \uac80\uc0c9\ud569\ub2c8\ub2e4. <code style=\"color: #83c694\">my-llm.users.accounts<\/code> \ud0a4\uc2a4\ud398\uc774\uc2a4. \uc774 \ubb38\uc11c\uc5d0\uc11c \uc774 \ubb38\uc11c\uc5d0 \uc788\ub294 <code style=\"color: #83c694\">\uacc4\uce35<\/code> \ud544\ub4dc\uc5d0 \uc785\ub825\ud569\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:default decode:true\">function OnUpdate(doc, meta, xattrs) {\r\n    \/\/ ...\r\n\r\n    const user_id = doc.user_id;\r\n\r\n    let done = false;\r\n    while (!done) {\r\n        \/\/ Get the tier of the `user_id`\r\n        let userAccountsMeta = {\r\n            \"id\": user_id\r\n        };\r\n        let userAccountsResult = couchbase.get(userAccounts, userAccountsMeta, {\r\n            \"cache\": true\r\n        });\r\n        if (!userAccountsResult.success) {\r\n            throw new Error(\"Error(Unable to get the user's details): \" + JSON.stringify(userAccountsResult));\r\n        }\r\n        const tier = userAccountsResult.doc.tier;\r\n\r\n        \/\/ ...\r\n    }\r\n    \/\/ ...\r\n}\r\n<\/pre>\n<h4>\ud2f0\uc5b4\uc758 \uc694\uae08 \ud55c\ub3c4 \uc77d\uae30<\/h4>\n<p><img decoding=\"async\" style=\"border: 1px solid\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Reading-the-Tiers-Rate-Limits.png\" alt=\"Reading the Tier\u2019s Rate Limits\" \/><\/p>\n<p>\ud2f0\uc5b4\uc640 \uc694\uae08 \ud55c\ub3c4 \ub9e4\ud551\uc774 \ud3ec\ud568\ub41c \ubb38\uc11c\uc5d0\uc11c \uc0ac\uc6a9\uc790\uc758 \ud2f0\uc5b4\uc5d0 \ub300\ud55c \uc694\uae08 \ud55c\ub3c4\ub97c \uac00\uc838\uc635\ub2c8\ub2e4. <code style=\"color: #83c694\">rate-limit.my-llm.limits<\/code> \ud0a4\uc2a4\ud398\uc774\uc2a4.<\/p>\n<pre class=\"lang:default decode:true\">function OnUpdate(doc, meta, xattrs) {\r\n    \/\/ ...\r\n\r\n    while (!done) {\r\n        \/\/ ...\r\n\r\n        \/\/ Get the rate limit for the tier\r\n        let tierLimitsMeta = {\r\n            \"id\": \"limits\"\r\n        };\r\n        let tierLimitsResult = couchbase.get(tierLimits, tierLimitsMeta, {\r\n            \"cache\": true\r\n        });\r\n        if (!tierLimitsResult.success) {\r\n            throw new Error(\"Error(Unable to get the tier limits): \" + JSON.stringify(tierLimitsResult));\r\n        }\r\n        const rateLimit = tierLimitsResult.doc[tier];\r\n\r\n        \/\/ ...\r\n    }\r\n    \/\/ ...\r\n}\r\n<\/pre>\n<h4>\uc694\uccad\uc5d0 \ub300\ud55c \uc694\uae08 \uc81c\ud55c \uc5ec\ubd80\ub97c \uacb0\uc815\ud558\uace0 \uc0ac\uc6a9\uc790\uc758 \uc694\uae08 \uc81c\ud55c \uc0ac\uc6a9\ub7c9\uc744 \uc5c5\ub370\uc774\ud2b8\ud558\uc138\uc694.<\/h4>\n<p><img decoding=\"async\" style=\"border: 1px solid\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Decide-Whether-to-Rate-Limit-the-Request-Update-the-Users-Rate-Limit-Usage.png\" alt=\"Decide Whether to Rate Limit the Request &amp; Update the User\u2019s Rate Limit Usage\" \/><\/p>\n<p>\uc774\uc81c \uc0ac\uc6a9\uc790\uc758 \uc694\uae08 \ud55c\ub3c4\uac00 \uc8fc\uc5b4\uc9c0\uba74 \ud604\uc7ac \uc0ac\uc6a9\ub7c9\uc744 \ud655\uc778\ud558\uc5ec \uc694\uccad\uc744 \ud560 \uc218 \uc788\ub294\uc9c0 \uc5ec\ubd80\ub97c \uacb0\uc815\ud569\ub2c8\ub2e4. \uc694\uae08 \uc81c\ud55c\uae30\ub294 \uac01 \uc0ac\uc6a9\uc790\uc758 \uc0ac\uc6a9\ub7c9\uc744 \uce74\uc6b4\ud130 \ubb38\uc11c\ub85c \ucd94\uc801\ud558\uc5ec <code style=\"color: #83c694\">rate-limit.my-llm.tracker<\/code> \ud0a4\uc2a4\ud398\uc774\uc2a4. \uac01 \uc694\uccad\uc5d0 \ub530\ub77c \uc774 \uce74\uc6b4\ud130 \ubb38\uc11c\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4. <code style=\"color: #83c694\">user_id<\/code> \ub97c \uc0ac\uc6a9\ud558\uc5ec \ud1a0\ud070 \ubc84\ud0b7 \ud55c\ub3c4\uac00 \uc0c8\ub85c \uace0\uccd0\uc9c0\uae30 \uc804\uc5d0 \ud604\uc7ac \uae30\uac04 \ub3d9\uc548 \ud574\ub2f9 \uc0ac\uc6a9\uc790\uc758 \uc694\uccad \ud69f\uc218\ub97c \uc800\uc7a5\ud569\ub2c8\ub2e4. \uc0ac\uc6a9\uc790\uc758 \uc0ac\uc6a9\ub7c9\uc774 \ud574\ub2f9 \ud2f0\uc5b4\uc758 \ud55c\ub3c4\ub97c \ucda9\uc871\ud558\uac70\ub098 \ucd08\uacfc\ud558\uba74 \uc694\uccad\uc744 \ucc28\ub2e8\ud569\ub2c8\ub2e4. \uadf8\ub807\uc9c0 \uc54a\uc73c\uba74 \ubcf4\ud638\ub41c \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub85c \uc694\uccad\uc744 \uc804\ub2ec\ud569\ub2c8\ub2e4. \ub9c8\uc9c0\ub9c9\uc73c\ub85c, \uc0ac\uc6a9\uc790\uc758 \uc694\uae08 \ud55c\ub3c4 \uc0ac\uc6a9\ub7c9\uc744 \ud574\ub2f9 \uce74\uc6b4\ud130 \ubb38\uc11c\uc5d0\uc11c \uc5c5\ub370\uc774\ud2b8\ud569\ub2c8\ub2e4. <code style=\"color: #83c694\">rate-limit.my-llm.tracker<\/code> \ud0a4\uc2a4\ud398\uc774\uc2a4.<\/p>\n<pre class=\"lang:default decode:true\">function OnUpdate(doc, meta, xattrs) {\r\n    \/\/ ...\r\n\r\n    while (!done) {\r\n        \/\/ ...\r\n\r\n        \/\/ Try to get the rate limit count for the `user_id`\r\n        const userIDMeta = {\r\n            \"id\": user_id\r\n        };\r\n        const result = couchbase.get(rateLimiter, userIDMeta);\r\n\r\n        \/\/ If the rate limit count for the `user_id` does not exist. Try to create it.\r\n        while (!result.success) {\r\n            couchbase.insert(rateLimiter, userIDMeta, {\r\n                \"count\": 0\r\n            });\r\n            result = couchbase.get(rateLimiter, userIDMeta);\r\n        }\r\n\r\n        \/\/ Assign the counter document's `count` and `meta` to local variables for convenience\r\n        const counterDocCount = result.doc.count;\r\n        const counterDocMeta = result.meta;\r\n\r\n        \/\/ Check if the counter has hit the rate limit\r\n        \/\/ We use &gt;= instead of == to handle the edge case where the tier limits have reduced\r\n        \/\/ but the tier tracker documents have not yet been deleted.\r\n        if (counterDocCount &gt;= rateLimit) {\r\n            log(\"User with ID '\" + user_id + \"' hit their rate limit of \" + rateLimit + \"!\");\r\n            done = true;\r\n            continue;\r\n        }\r\n\r\n        \/\/ Update the count in the document\r\n        let res = couchbase.mutateIn(rateLimiter, counterDocMeta, [\r\n            couchbase.MutateInSpec.replace(\"count\", counterDocCount + 1),\r\n        ]);\r\n        \/\/ ...\r\n    }\r\n    \/\/ ...\r\n}\r\n<\/pre>\n<h4>\uc6d0\ud558\ub294 \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub85c \u201c\ud55c\ub3c4 \ub0b4\u201d \uc694\uccad \ubcf4\ub0b4\uae30<\/h4>\n<p><img decoding=\"async\" style=\"border: 1px solid\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Send-the-within-the-limit-Request-to-the-Desired-Endpoint.png\" alt=\"Send the \u201cwithin the limit\u201d Request to the Desired Endpoint\" \/><\/p>\n<p>\uc0ac\uc6a9\uc790 \uc694\uccad\uc740 \ud574\ub2f9 \ud2f0\uc5b4\uc758 \uc694\uae08 \ud55c\ub3c4 \ub0b4\uc5d0\uc11c \uc694\uae08 \uc81c\ud55c\uae30\ub85c \ubcf4\ud638\ub418\ub294 REST API \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub85c \uc804\uc1a1\ub429\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:default decode:true\">function OnUpdate(doc, meta, xattrs) {\r\n    \/\/ ...\r\n\r\n    while (!done) {\r\n        \/\/ ...\r\n\r\n        done = res.success;\r\n        if (done) {\r\n            \/\/ POST the request to the `llmEndpoint`\r\n            delete doc.user_id;\r\n            const response = curl('POST', llmEndpoint, doc);\r\n            if (response.status != 200) {\r\n                throw new Error(\"Error(MyLLM endpoint is not working): \" + response.status);\r\n            }\r\n        }\r\n    }\r\n    \/\/ ...\r\n}\r\n<\/pre>\n<h1>\uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ud14c\uc2a4\ud2b8<\/h1>\n<p>\uc774\uc81c \uc18d\ub3c4 \uc81c\ud55c\uae30\ub97c \uad6c\ud604\ud588\uc73c\ub2c8 \uc774\ub97c \uc2e4\ud589\ud558\uace0 \ud14c\uc2a4\ud2b8\ud560 \ud658\uacbd\uc744 \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4:<\/p>\n<ol>\n<li>Go \ud504\ub85c\uadf8\ub7a8\uc744 \uc2e4\ud589\ud558\uc5ec 100\uba85\uc758 \uc0ac\uc6a9\uc790\ub85c \uad6c\uc131\ub41c \uc0d8\ud50c \uc138\ud2b8\ub97c \ub85c\ub4dc\ud569\ub2c8\ub2e4.<\/li>\n<li>Go \ud504\ub85c\uadf8\ub7a8\uc744 \uc2e4\ud589\ud558\uc5ec \uc774\ubca4\ud2b8 \ud568\uc218\uac00 \uc0c1\ud638\uc791\uc6a9\ud558\ub294 \uc678\ubd80 REST API\ub97c \uc81c\uacf5\ud558\ub294 HTTP \uc11c\ubc84\ub97c \uc2dc\uc791\ud569\ub2c8\ub2e4.<\/li>\n<li>\uc774\ubca4\ud2b8 \uae30\ub2a5\uc744 \ubc30\ud3ec\ud569\ub2c8\ub2e4.<\/li>\n<li>\uc774\ubca4\ud2b8 \uae30\ub2a5\uc744 \ud2b8\ub9ac\uac70\ud558\ub824\uba74 Go \ud504\ub85c\uadf8\ub7a8\uc744 \uc2e4\ud589\ud558\uc5ec \uc0ac\uc6a9\uc790 \uc774\ubca4\ud2b8 \ubb38\uc11c\ub97c \uc18c\uc2a4 \ud0a4 \uacf5\uac04\uc5d0 \ub85c\ub4dc\ud574\uc57c \ud569\ub2c8\ub2e4, <code style=\"color: #83c694\">my-llm.users.events<\/code>.<\/li>\n<li>\uc18d\ub3c4 \uc81c\ud55c\uae30\ub85c \ubcf4\ud638\ub418\ub294 \uc678\ubd80 REST API \uc5d4\ub4dc\ud3ec\uc778\ud2b8\uc5d0 \ub3c4\ub2ec\ud558\ub294 \uc0ac\uc6a9\uc790 \uc694\uccad\uc758 \uc218\ub97c \ud655\uc778\ud558\ub824\uba74 \ub2e4\uc74c\uc744 \uc804\uc1a1\ud574\uc57c \ud569\ub2c8\ub2e4. <code style=\"color: #83c694\">GET<\/code> \uc694\uccad\uc5d0 \ub300\ud55c <code style=\"color: #83c694\">\/my-llm<\/code> \uc5d4\ub4dc\ud3ec\uc778\ud2b8.<\/li>\n<\/ol>\n<h1>\uacb0\ub860<\/h1>\n<p>\uc774 \uac8c\uc2dc\ubb3c\uc5d0\uc11c\ub294 \uc0c8\ub85c\uc6b4 Couchbase Eventing \ud578\ub4e4\ub7ec\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc744 \ubcf4\uc5ec\ub4dc\ub838\uc2b5\ub2c8\ub2e4, <code style=\"color: #83c694\">OnDeploy<\/code>, \ub97c \uc0ac\uc6a9\ud558\uc5ec \ud1a0\ud070 \ubc84\ud0b7 \ube44\uc728 \uc81c\ud55c\uae30\ub97c \uad6c\ucd95\ud558\uc5ec \ud1b5\ud569\ub41c \ub3c5\ub9bd\ud615 \uc194\ub8e8\uc158\uc744 \uac1c\ubc1c\ud558\ub294 \ub370 \uc788\uc5b4 Couchbase Eventing\uc758 \uac15\ub825\ud55c \uc131\ub2a5\uacfc \uc720\uc5f0\uc131\uc744 \uac15\uc870\ud588\uc2b5\ub2c8\ub2e4.<br \/>\n\ub354 \ub113\uac8c\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc790\uccb4\uc5d0\uc11c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uad6c\ucd95\ud558\ub294 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uac1c\ubc1c\uc758 \ubcc0\ud654\ub97c \ubcf4\uc5ec\uc90d\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \ub2e4\uc591\ud55c \uc694\uad6c\uc0ac\ud56d\uc5d0 \ub300\ud55c \ub9de\ucda4\ud615 \uc194\ub8e8\uc158\uc744 Couchbase \ud50c\ub7ab\ud3fc \ub0b4\uc5d0\uc11c \ubaa8\ub450 \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h1>\ubd80\ub85d<\/h1>\n<p>\uc774\ubca4\ud2b8 \ucf54\ub4dc\ub97c \uc791\uc131\ud569\ub2c8\ub2e4: <a href=\"https:\/\/github.com\/couchbaselabs\/eventing-rate-limiter\/blob\/master\/eventing\/eventing-function.js\">\uc5ec\uae30\ub97c \ud074\ub9ad\ud558\uc138\uc694<\/a><br \/>\n\uc11c\ubc84 \uc774\ub3d9 \ucf54\ub4dc: <a href=\"https:\/\/github.com\/couchbaselabs\/eventing-rate-limiter\/blob\/master\/server\/server.go\">\uc5ec\uae30\ub97c \ud074\ub9ad\ud558\uc138\uc694<\/a><br \/>\n\ud074\ub77c\uc774\uc5b8\ud2b8 \uc774\ub3d9 \ucf54\ub4dc: <a href=\"https:\/\/github.com\/couchbaselabs\/eventing-rate-limiter\/blob\/master\/event-generator\/event-generator.go\">\uc5ec\uae30\ub97c \ud074\ub9ad\ud558\uc138\uc694<\/a><br \/>\n\uc0ac\uc6a9\uc790 \ub85c\ub354 \uc774\ub3d9 \ucf54\ub4dc: <a href=\"https:\/\/github.com\/couchbaselabs\/eventing-rate-limiter\/blob\/master\/user-loader\/user-loader.go\">\uc5ec\uae30\ub97c \ud074\ub9ad\ud558\uc138\uc694<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Introduction Couchbase Server 8.0 introduces a new Eventing function handler called OnDeploy that allows customers to run business logic during Eventing function deployment or resumption without requiring any external mutation to trigger it. Earlier, customers with use cases that needed [&hellip;]<\/p>","protected":false},"author":85695,"featured_media":17881,"comment_status":"open","ping_status":"open","sticky":true,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1816],"tags":[],"ppma_author":[10171],"class_list":["post-17870","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.8 (Yoast SEO v26.8) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Build a Rate Limiter With Couchbase Eventing - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/ko\/build-a-rate-limiter-with-couchbase-eventing\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Build a Rate Limiter With Couchbase Eventing\" \/>\n<meta property=\"og:description\" content=\"Introduction Couchbase Server 8.0 introduces a new Eventing function handler called OnDeploy that allows customers to run business logic during Eventing function deployment or resumption without requiring any external mutation to trigger it. Earlier, customers with use cases that needed [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/ko\/build-a-rate-limiter-with-couchbase-eventing\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-12T15:32:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-02-24T19:16:03+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Build-a-Rate-Limiter-With-Couchbase-Eventing.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2400\" \/>\n\t<meta property=\"og:image:height\" content=\"1256\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Rishit Chaudhary, Software Engineer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Rishit Chaudhary, Software Engineer\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/build-a-rate-limiter-with-couchbase-eventing\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/build-a-rate-limiter-with-couchbase-eventing\/\"},\"author\":{\"name\":\"Rishit Chaudhary, Software Engineer\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/a63068d4f974ee8c1df6808fd7ad0d7d\"},\"headline\":\"Build a Rate Limiter With Couchbase Eventing\",\"datePublished\":\"2026-02-12T15:32:16+00:00\",\"dateModified\":\"2026-02-24T19:16:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/build-a-rate-limiter-with-couchbase-eventing\/\"},\"wordCount\":1657,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/build-a-rate-limiter-with-couchbase-eventing\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Build-a-Rate-Limiter-With-Couchbase-Eventing.png\",\"articleSection\":[\"Couchbase Server\"],\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/build-a-rate-limiter-with-couchbase-eventing\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/build-a-rate-limiter-with-couchbase-eventing\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/build-a-rate-limiter-with-couchbase-eventing\/\",\"name\":\"Build a Rate Limiter With Couchbase Eventing - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/build-a-rate-limiter-with-couchbase-eventing\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/build-a-rate-limiter-with-couchbase-eventing\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Build-a-Rate-Limiter-With-Couchbase-Eventing.png\",\"datePublished\":\"2026-02-12T15:32:16+00:00\",\"dateModified\":\"2026-02-24T19:16:03+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/build-a-rate-limiter-with-couchbase-eventing\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/build-a-rate-limiter-with-couchbase-eventing\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/build-a-rate-limiter-with-couchbase-eventing\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Build-a-Rate-Limiter-With-Couchbase-Eventing.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Build-a-Rate-Limiter-With-Couchbase-Eventing.png\",\"width\":2400,\"height\":1256},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/build-a-rate-limiter-with-couchbase-eventing\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Build a Rate Limiter With Couchbase Eventing\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/a63068d4f974ee8c1df6808fd7ad0d7d\",\"name\":\"Rishit Chaudhary, Software Engineer\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/af670362d7fe103aec32309e743e0794\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/01\/Rishit-Chaudhary.jpeg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/01\/Rishit-Chaudhary.jpeg\",\"caption\":\"Rishit Chaudhary, Software Engineer\"},\"url\":\"https:\/\/www.couchbase.com\/blog\/ko\/author\/rishitchaudhary\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Build a Rate Limiter With Couchbase Eventing - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/ko\/build-a-rate-limiter-with-couchbase-eventing\/","og_locale":"ko_KR","og_type":"article","og_title":"Build a Rate Limiter With Couchbase Eventing","og_description":"Introduction Couchbase Server 8.0 introduces a new Eventing function handler called OnDeploy that allows customers to run business logic during Eventing function deployment or resumption without requiring any external mutation to trigger it. Earlier, customers with use cases that needed [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/ko\/build-a-rate-limiter-with-couchbase-eventing\/","og_site_name":"The Couchbase Blog","article_published_time":"2026-02-12T15:32:16+00:00","article_modified_time":"2026-02-24T19:16:03+00:00","og_image":[{"width":2400,"height":1256,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Build-a-Rate-Limiter-With-Couchbase-Eventing.png","type":"image\/png"}],"author":"Rishit Chaudhary, Software Engineer","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Rishit Chaudhary, Software Engineer","Est. reading time":"10\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/build-a-rate-limiter-with-couchbase-eventing\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/build-a-rate-limiter-with-couchbase-eventing\/"},"author":{"name":"Rishit Chaudhary, Software Engineer","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/a63068d4f974ee8c1df6808fd7ad0d7d"},"headline":"Build a Rate Limiter With Couchbase Eventing","datePublished":"2026-02-12T15:32:16+00:00","dateModified":"2026-02-24T19:16:03+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/build-a-rate-limiter-with-couchbase-eventing\/"},"wordCount":1657,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/build-a-rate-limiter-with-couchbase-eventing\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Build-a-Rate-Limiter-With-Couchbase-Eventing.png","articleSection":["Couchbase Server"],"inLanguage":"ko-KR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/build-a-rate-limiter-with-couchbase-eventing\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/build-a-rate-limiter-with-couchbase-eventing\/","url":"https:\/\/www.couchbase.com\/blog\/build-a-rate-limiter-with-couchbase-eventing\/","name":"Build a Rate Limiter With Couchbase Eventing - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/build-a-rate-limiter-with-couchbase-eventing\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/build-a-rate-limiter-with-couchbase-eventing\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Build-a-Rate-Limiter-With-Couchbase-Eventing.png","datePublished":"2026-02-12T15:32:16+00:00","dateModified":"2026-02-24T19:16:03+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/build-a-rate-limiter-with-couchbase-eventing\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/build-a-rate-limiter-with-couchbase-eventing\/"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/build-a-rate-limiter-with-couchbase-eventing\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Build-a-Rate-Limiter-With-Couchbase-Eventing.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Build-a-Rate-Limiter-With-Couchbase-Eventing.png","width":2400,"height":1256},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/build-a-rate-limiter-with-couchbase-eventing\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Build a Rate Limiter With Couchbase Eventing"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ube14\ub85c\uadf8","description":"NoSQL \ub370\uc774\ud130\ubca0\uc774\uc2a4, Couchbase","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ko-KR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ube14\ub85c\uadf8","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/a63068d4f974ee8c1df6808fd7ad0d7d","name":"\ub9ac\uc2ef \ucc28\uc6b0\ub2e4\ub9ac, \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc5d4\uc9c0\ub2c8\uc5b4","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/af670362d7fe103aec32309e743e0794","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/01\/Rishit-Chaudhary.jpeg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/01\/Rishit-Chaudhary.jpeg","caption":"Rishit Chaudhary, Software Engineer"},"url":"https:\/\/www.couchbase.com\/blog\/ko\/author\/rishitchaudhary\/"}]}},"authors":[{"term_id":10171,"user_id":85695,"is_guest":0,"slug":"rishitchaudhary","display_name":"Rishit Chaudhary, Software Engineer","avatar_url":{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/01\/Rishit-Chaudhary.jpeg","url2x":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/01\/Rishit-Chaudhary.jpeg"},"0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/17870","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/users\/85695"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/comments?post=17870"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/17870\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media\/17881"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media?parent=17870"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/categories?post=17870"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/tags?post=17870"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/ppma_author?post=17870"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}