{"id":8489,"date":"2020-05-22T10:50:02","date_gmt":"2020-05-22T17:50:02","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=8489"},"modified":"2025-06-13T22:40:23","modified_gmt":"2025-06-14T05:40:23","slug":"implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/ko\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/","title":{"rendered":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc774\ubca4\ud305\uc744 \ud1b5\ud55c \uc2a4\ucf00\uc904\ub7ec \uad6c\ud604\ud558\uae30(1\ubd80)"},"content":{"rendered":"<p>\uc774 \uae00\uc740 \uc5ec\ub7ec \ud30c\ud2b8\ub85c \uad6c\uc131\ub41c \uc2dc\ub9ac\uc988 \uc911 \uccab \ubc88\uc9f8 \uae00\uc785\ub2c8\ub2e4. <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/products\/eventing\/\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc774\ubca4\ud2b8 \uc11c\ube44\uc2a4<\/a> \ub97c \uc0ac\uc6a9\ud558\uc5ec \ud2b9\uc815 \ubc18\ubcf5 \uac04\uaca9\uc73c\ub85c \uc5ec\ub7ec \uc608\uc57d\ub41c \uc791\uc5c5\uc744 \uc2e4\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <em>cron<\/em> \ub2e8\uc77c \ubc94\uc6a9 \uc774\ubca4\ud2b8 \ud568\uc218\ub97c \ud1b5\ud574 \ucd94\uac00 \uc778\ud504\ub77c \uc5c6\uc774\ub3c4 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ub0b4\ubd80\uc5d0\uc11c \ud328\uc158\uacfc \uac19\uc740 \uae30\ub2a5\uc744 \uc644\uc804\ud788 \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\ubc88 \ud3b8\uc5d0\uc11c\ub294 \uc774\ubca4\ud2b8 \ud568\uc218 \uc548\uc5d0 \uc815\uc758\ub41c \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \ud568\uc218\uc778 \uace0\uc815 \uc0ac\uc6a9\uc790 \ub8e8\ud2f4\uc744 \uc2e4\ud589\ud558\ub294 \ub370 \uc911\uc810\uc744 \ub450\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\ud6c4 \uae00\uc5d0\uc11c\ub294 \ub2e4\uc74c \uae00\uc5d0\uc11c \ud655\uc7a5\ub41c <em>cron<\/em> \uc774\ubca4\ud2b8 \ud568\uc218\uc640 \uac19\uc774 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uae30\ubc18 \ub3d9\uc801 N1QL \ubb38\uc744 \uc608\uc57d\ud558\uace0 \uc2e4\ud589\ud558\ub294 \ubc29\ubc95\uc744 \uc0b4\ud3b4\ubcf4\uace0, \ub9c8\uc9c0\ub9c9\uc73c\ub85c \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uae30\ubc18 \ub3d9\uc801 JavaScript \ud568\uc218\ub97c \uc608\uc57d\ud558\ub294 \ubc29\ubc95\uc744 \uc0b4\ud3b4\ubd05\ub2c8\ub2e4.<\/p>\n<h3>\ubc30\uacbd<\/h3>\n<p>\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc774\ubca4\ud2b8 \uc11c\ube44\uc2a4\ub294 \ubb38\uc11c \ubcc0\uacbd\uc744 \ucc98\ub9ac\ud558\uae30 \uc704\ud55c \uac04\ub2e8\ud55c JavaScript \ud568\uc218\uc778 \uc790\uccb4 \ub8e8\ud2f4\uc744 \uc791\uc131\ud560 \uc218 \uc788\ub294 \ud504\ub808\uc784\uc6cc\ud06c\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4.  \uc774 \uc11c\ube44\uc2a4\ub294 \ud655\uc7a5 \uac00\ub2a5\ud558\uace0 \uac15\ub825\ud55c \ud074\ub77c\uc6b0\ub4dc \uae30\ubc18 \ud568\uc218\ub97c \ub9cc\ub4dc\ub294 \ub370 \ud544\uc694\ud55c \ubaa8\ub4e0 \uc778\ud504\ub77c\ub97c \uc81c\uacf5\ud558\uc5ec \ub370\uc774\ud130\uc758 \ubcc0\ud654\uc5d0 \uac70\uc758 \uc2e4\uc2dc\uac04\uc73c\ub85c \uc0c1\ud638\uc791\uc6a9\ud558\ub294 \uc21c\uc218\ud55c \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \uac1c\ubc1c\ud558\ub294 \ub370 \uc9d1\uc911\ud560 \uc218 \uc788\ub3c4\ub85d \ud574\uc90d\ub2c8\ub2e4. \ud568\uc218\ub294 Couchbase \ub370\uc774\ud130 \uc11c\ube44\uc2a4(KV), Couchbase \ucffc\ub9ac \uc11c\ube44\uc2a4(N1QL) \ubc0f Couchbase \uc2dc\uc2a4\ud15c \uc678\ubd80\uc758 REST \uc5d4\ub4dc\ud3ec\uc778\ud2b8\uc5d0 \uc561\uc138\uc2a4\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-8490\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/04\/cron_implementation_1_image_0_input-output-overview-6.5-1024x405.png\" alt=\"Eventing Life Cycle 6.5 I\/O\" width=\"900\" height=\"356\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/cron_implementation_1_image_0_input-output-overview-6.5-1024x405.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/cron_implementation_1_image_0_input-output-overview-6.5-300x119.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/cron_implementation_1_image_0_input-output-overview-6.5-768x304.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/cron_implementation_1_image_0_input-output-overview-6.5-1536x608.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/cron_implementation_1_image_0_input-output-overview-6.5-20x8.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/cron_implementation_1_image_0_input-output-overview-6.5-1320x522.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/cron_implementation_1_image_0_input-output-overview-6.5.png 1870w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p>\uadf8\ub9ac\uace0 <a href=\"https:\/\/www.json.org\/\">JSON<\/a> \uce74\uc6b0\uce58\ubca0\uc774\uc2a4\uc758 \ub370\uc774\ud130 \ubaa8\ub378\uc740 <a href=\"https:\/\/en.wikipedia.org\/wiki\/JavaScript\">\uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8<\/a>\ub530\ub77c\uc11c \uc774\ubca4\ud2b8 \uc11c\ube44\uc2a4\uc5d0\uc11c \uc0bd\uc785, \uc5c5\ub370\uc774\ud2b8, \ubcd1\ud569, \uc0ad\uc81c(\ucd1d\uce6d\ud558\uc5ec \ubcc0\uacbd\uc774\ub77c\uace0 \ud568)\ub97c \ud3ec\ud568\ud55c \ubaa8\ub4e0 \uc720\ud615\uc758 \ubcc0\uacbd \uc774\ubca4\ud2b8\uc5d0 \ub300\ud574 JSON \ubb38\uc11c\ub97c \ubd84\uc11d\ud558\uace0 \uc870\uc791\ud558\uae30 \uc704\ud55c JavaScript \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \uae30\ub2a5\uc744 \ub178\ucd9c\ud558\ub294 \uac83\uc740 \ub2f9\uc5f0\ud55c \uc77c\uc785\ub2c8\ub2e4.<\/p>\n<p>\uc774\ubca4\ud2b8 \ud568\uc218\ub97c \uc0ac\uc6a9\ud558\uba74 \uc77c\ubc18\uc801\uc73c\ub85c \ubb38\uc11c\uc5d0\uc11c \ucd08\ub2f9 \uc218\ucc9c, \uc218\ubc31\ub9cc \uac74\uc758 \ubcc0\uacbd\uc5d0 \ubc18\uc751\ud558\ub294 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \ucf54\ub4dc \uc870\uac01\uc744 \ubc30\ud3ec\ud558\uace0 \uc2e4\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uba87 \uac00\uc9c0 \uc77c\ubc18\uc801\uc778 \uc0ac\uc6a9 \uc0ac\ub840\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/docs.couchbase.com\/server\/6.5\/eventing\/eventing-overview.html\">\ubb38\uc11c\ud654<\/a> \ub97c \uc0ac\uc6a9\ud558\uc5ec Couchbase \ubb38\uc11c\uc758 \ubcc0\uc774\uc5d0 \ubc18\uc751\ud558\ub294 \uace0\uc18d \ub300\uaddc\ubaa8 \uc774\ubca4\ud2b8 \ud568\uc218\ub97c \uac1c\ubc1c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8739 size-large\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/05\/cron_implementation_1_image_0_lifecycle_overview_notitle_b-1024x398.png\" alt=\"Eventing Life Cycle 6.5\" width=\"900\" height=\"350\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/cron_implementation_1_image_0_lifecycle_overview_notitle_b-1024x398.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/cron_implementation_1_image_0_lifecycle_overview_notitle_b-300x117.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/cron_implementation_1_image_0_lifecycle_overview_notitle_b-768x298.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/cron_implementation_1_image_0_lifecycle_overview_notitle_b-1536x597.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/cron_implementation_1_image_0_lifecycle_overview_notitle_b-20x8.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/cron_implementation_1_image_0_lifecycle_overview_notitle_b-1320x513.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/cron_implementation_1_image_0_lifecycle_overview_notitle_b.png 1825w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p>\uc774 \uae00\uc5d0\uc11c\ub294 \ub300\uc2e0 \uc548\uc815\uc801\uc778 \"\ub370\uc774\ud130\ubca0\uc774\uc2a4 \ub0b4\" \ubd84\uc0b0 \ud06c\ub860\ud0ed\uc744 \uad6c\ucd95\ud558\uc5ec \uc815\uae30\uc801\uc73c\ub85c \uc8fc\uae30\uc801\uc73c\ub85c Couchbase \uc11c\ube44\uc2a4\uc640 \uc0c1\ud638 \uc791\uc6a9\ud558\ub294 JavaScript \ud568\uc218\ub97c \uc2e4\ud589\ud560 \uc218 \uc788\ub294 \ub9e4\uc6b0 \ub0ae\uc740 \uc18d\ub3c4\uc758 \uc774\ubca4\ud2b8 \uc11c\ube44\uc2a4 \uc0ac\uc6a9 \uc0ac\ub840\uc5d0 \ucd08\uc810\uc744 \ub9de\ucd9c \uac83\uc785\ub2c8\ub2e4.<\/p>\n<h3>\uc9c0\uc815\ub41c \ub0a0\uc9dc \ub610\ub294 \uc2dc\uac04\uc5d0 \uc2e4\ud589\ub418\ub3c4\ub85d \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1 \uc608\uc57d\ud558\uae30<\/h3>\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\">Cron<\/a>\uc758 \uc774\ub984\uc744 \ub530\uc11c \"<em>\ud06c\ub85c\ub178\uc2a4<\/em>\uc2dc\uac04\uc744 \ub73b\ud558\ub294 \uadf8\ub9ac\uc2a4\uc5b4\uc778 \"\uc2dc\uac04\"\uc740 Linux \uc2dc\uc2a4\ud15c\uc5d0\uc11c \uac00\uc7a5 \uc720\uc6a9\ud55c \uc720\ud2f8\ub9ac\ud2f0 \uc911 \ud558\ub098\uc785\ub2c8\ub2e4. Linux\uc5d0\uc11c <em>cron<\/em> \uc720\ud2f8\ub9ac\ud2f0\ub294 \uc8fc\uc5b4\uc9c4 \uc77c\uc815\uc5d0 \ub530\ub77c \uc8fc\uae30\uc801\uc73c\ub85c \uc2e4\ud589\ud560 \uc178 \uba85\ub839\uc744 \uc9c0\uc815\ud558\ub294 \uad6c\uc131 \ud30c\uc77c\uc778 \ud06c\ub860\ud0ed(\ud06c\ub860 \ud14c\uc774\ube14) \ud30c\uc77c\uc5d0 \uc758\ud574 \uad6c\ub3d9\ub429\ub2c8\ub2e4.<\/p>\n<p>\ub7ec\ub2dd\uc758 \ud55c \uac00\uc9c0 \ub2e8\uc810 <em>cron<\/em> \ub294 \ubd84\uc0b0 \uc11c\ube44\uc2a4\ub85c \uc124\uacc4\ub418\uc9c0 \uc54a\uc558\uae30 \ub54c\ubb38\uc5d0 \ub2e8\uc77c \ubc15\uc2a4\uc5d0\uc11c \uc2e4\ud589\ub418\ubbc0\ub85c \ub2e8\uc77c \uc7a5\uc560 \uc9c0\uc810\uc774 \uc874\uc7ac\ud569\ub2c8\ub2e4. \uc2dc\uc2a4\ud15c\uc774 \uba87 \uc2dc\uac04 \ub3d9\uc548 \uc624\ud504\ub77c\uc778 \uc0c1\ud0dc\uc774\uba74 \uc608\uc57d\ub41c \ubaa8\ub4e0 \uc791\uc5c5\uc744 \ub193\uce58\uac8c \ub429\ub2c8\ub2e4.<\/p>\n<p>\uc608, \uc77c\ubd80 \ubc30\ud3ec\ub41c <em>cron<\/em> Google\uc758 \ud074\ub77c\uc6b0\ub4dc \uc11c\ube44\uc2a4, AWS\uc758 \uc608\uc57d \uc791\uc5c5, Azure \ud568\uc218\/\uc2dc\uac04 \ud2b8\ub9ac\uac70\uc640 \uac19\uc740 \uad6c\ud604\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \uac01 \ud074\ub77c\uc6b0\ub4dc \uacf5\uae09\uc5c5\uccb4\uc758 \uc11c\ube44\uc2a4\uc5d0\ub294 \uace0\uc720\ud55c \uad00\uc6a9\uad6c\uac00 \uc788\uc73c\uba70 \uc9c1\uc811 \uc774\uc2dd\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub610\ud55c, \uc608\ub97c \ub4e4\uc5b4 \ubd84\uc0b0\ub41c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc81c\uc5b4\ud558\ub294 \uacbd\uc6b0\uc640 \uac19\uc774 \uad6c\uc131 \ubc0f \uc81c\uc5b4 \ubc29\ubc95\ub860\uc758 \ubcf4\uc548\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. <em>cron<\/em> \uc2dc\uc2a4\ud15c\uc744 HTTP\/S\ub97c \ud1b5\ud574 REST API\ub85c \uc5f0\uacb0\ud558\ub824\uba74 \ubcf4\uc548 \uacc4\ud68d\uc5d0 \uc774\ub97c \uace0\ub824\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<h3>\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc790\uccb4\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc8fc\uae30\uc801 \uba85\ub839 \uc2e4\ud589\ud558\uae30<\/h3>\n<p>\uc57d\uac04\uc758 \ucf54\ub4dc\uc640 \uacc4\ud68d\ub9cc \uc788\uc73c\uba74 Couchbase\uc758 Eventing \uc11c\ube44\uc2a4\ub97c \ud65c\uc6a9\ud558\uc5ec \uc720\uc5f0\ud55c <em>cron<\/em> \uc608\uc57d\ub41c \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc791\uc5c5\uc774\ub098 \uc720\uc9c0 \uad00\ub9ac\ub97c \uc704\ud55c \uae30\ub2a5\ucc98\ub7fc\uc694. \uc2a4\ucf00\uc904\ub7ec\ub97c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uad6c\ucd95\ud558\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uc774\uc810\uc744 \uc5bb\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4:<\/p>\n<ul>\n<li>\ud074\ub77c\uc6b0\ub4dc \uc81c\uacf5\uc5c5\uccb4 \uac04 \uc774\ub3d9\uc131, Couchbase \ud074\ub7ec\uc2a4\ud130\ub97c \ub9ac\ud638\uc2a4\ud305\ud558\ub294 \uacbd\uc6b0 \uc2a4\ucf00\uc904\ub7ec\ub294 \uc601\ud5a5\uc744 \ubc1b\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/li>\n<li>\uc9c0\uc6d0 \uac00\ub2a5\uc131, Couchbase\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \uc9c0\uc6d0 \ubc0f \uae30\ud0c0 \uc11c\ube44\uc2a4\ub97c \uc81c\uacf5\ud558\ub294 \ub2e8\uc77c \uacf5\uae09\uc5c5\uccb4\uac00 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<li>\ub2e8\uc77c \uc7a5\uc560 \uc9c0\uc810\uc774 \uc5c6\ub294 \ubd84\uc0b0\ud615\uc774\uba70 \ubaa8\ub4e0 Couchbase \uc11c\ube44\uc2a4\ub294 \ubd84\uc0b0 \ubcf5\uc81c\ubcf8\uc744 \uc9c0\uc6d0\ud569\ub2c8\ub2e4.<\/li>\n<li>\uc2e4\ud589\uc774 \ubcf4\uc7a5\ub418\uc5b4 \ub178\ub4dc \uc7a5\uc560\uc5d0\uc11c \ubcf5\uad6c\ub41c \ud6c4\uc5d0\ub3c4 \uc791\uc5c5\uc774 \uc2e4\ud589\ub429\ub2c8\ub2e4.<\/li>\n<\/ul>\n<h3>\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc2a4\ucf00\uc904\ub9c1, \ud0c0\uc774\uba38\uc758 \ube44\ubc00 \uc18c\uc2a4<\/h3>\n<p>\ud0c0\uc774\uba38\ub294 \uac1c\ubc1c\uc790\uac00 \ubbf8\ub798\uc758 \uc2dc\uac04\uc5d0 \ud2b8\ub9ac\uac70\ub420 \ub8e8\ud2f4(\ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1)\uc744 \uc9c0\uc815\ud560 \uc218 \uc788\ub294 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc774\ubca4\ud2b8 \uc11c\ube44\uc2a4 \uad6c\uc131\uc785\ub2c8\ub2e4. \uc774 \uae30\ub2a5\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc21c\uc218\ud55c Couchbase \uad6c\uc131 \uac00\ub2a5 <em>\ud06c\ub860\ud0ed<\/em> \uc2dc\uc2a4\ud15c\uc744 \uc0ac\uc6a9\ud558\uba74 \uac04\ub2e8\ud55c N1QL \ucffc\ub9ac\ub97c \uc2e4\ud589\ud558\ub4e0 \ubcf5\uc7a1\ud55c \uaddc\uce59 \uc5d4\uc9c4\uc744 \uad6c\ucd95\ud558\ub4e0 \uc6cc\ud06c\ud50c\ub85c\uc6b0\uc758 \uc77c\ubd80\ub85c \ubc18\ubcf5 \uc791\uc5c5\uc744 \ud2b8\ub9ac\uac70\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\ud6c4 \ubaa8\ub4e0 \ub514\uc790\uc778\uc5d0\uc11c \uc6b0\ub9ac\ub294 <em>cron<\/em> \uad6c\ud604\uc744 15\ucd08 \uc774\uc0c1\uc758 \ud574\uc0c1\ub3c4\ub85c \uad6c\ud604\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc81c\ud55c\uc774 \uc788\ub294 \uc774\uc720\ub294 \ud0c0\uc774\uba38\uac00 \uc218\ubc31\ub9cc \ub2e8\uc704\ub85c \ud655\uc7a5\ub418\uace0 \uc2e4\ud589 \ubc0f \uc2e4\ud589\uc774 \ubcf4\uc7a5\ub418\uc9c0\ub9cc \ud604\uc7ac 14\ucd08 \ubbf8\ub9cc\uc758 \uc815\uc0c1 \uc0c1\ud0dc \uc9c0\uc5f0\uc73c\ub85c \uc778\ud574 \ubcbd\uc2dc\uacc4 \uc815\ud655\ub3c4\uac00 \ub5a8\uc5b4\uc9c0\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4. <a id=\"footnote_1\"><\/a><sup>[1]<\/sup>.<\/p>\n<p>\ubb3c\ub860 \ub354 \uc9e7\uc740 \uc77c\uc815, \uc989 15\ucd08 \ubbf8\ub9cc\uc774 \ud544\uc694\ud55c \uacbd\uc6b0\uc5d0\ub294 \ud0c0\uc774\uba38 \uad6c\uc870\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 \uc774\ubca4\ud2b8 \ub85c\uc9c1\uc5d0\uc11c \ub3cc\uc5f0\ubcc0\uc774 \uc790\uccb4\ub97c \ucc98\ub9ac\ud558\uc5ec \ud5a5\ud6c4 \ucf5c\ubc31\uc744 \uc608\uc57d\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>\uc774 \uae00\uc744 \uc4f0\ub294 \uc2dc\uc810\uc5d0\uc11c \ud604\uc7ac Couchbase \ub9b4\ub9ac\uc2a4\ub294 \ubc84\uc804 6.5.1\uc785\ub2c8\ub2e4. <em><strong>\ud574\uacb0\ud574\uc57c \ud560 \ub450 \uac00\uc9c0 \uc81c\ud55c \uc0ac\ud56d<\/strong><\/em> \uac15\ub825\ud55c <em>cron<\/em> \uc2dc\uc2a4\ud15c.<\/p>\n<ol>\n<li>5.5.x, 6.0.x \ubc0f 6.5.x \ub9b4\ub9ac\uc2a4\uc5d0\uc11c\ub294 \ud0c0\uc774\uba38 \ucf5c\ubc31\uc73c\ub85c \ud638\ucd9c\ub418\ub294 \ud568\uc218\uac00 \uc0c8 \ud0c0\uc774\uba38\ub97c \uc548\uc815\uc801\uc73c\ub85c \uc0dd\uc131\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4(\ub450 \ubc88\uc9f8 \ud611\ub825 \ud568\uc218\ub97c \ud1b5\ud574 \uc0ac\uc6a9\uc790 \uacf5\uac04 \uc6b0\ud68c \ubc29\ubc95\uc744 \uc218\ud589\ud560 \uc218 \uc788\uc74c).<\/li>\n<li>6.5.x \ub9b4\ub9ac\uc2a4\uc5d0\uc11c\ub294 \uc720\ud734 \uc2dc\uc2a4\ud15c\uc5d0\uc11c \ud5a5\ud6c4(1\uc2dc\uac04 \uc774\uc0c1) \ud0c0\uc774\uba38\ub97c \uc0dd\uc131\ud558\uba74 \uba54\ud0c0\ub370\uc774\ud130 \ubc84\ud0b7 \uc791\uc5c5\uc758 \uc218\uac00 \uc99d\uac00\ud558\uc5ec \uacb0\uad6d \uc8fc\uc5b4\uc9c4 \uc774\ubca4\ud2b8 \ud568\uc218\uc5d0 \ub300\ud55c \ubcc0\uc774\ub97c \ucc28\ub2e8\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4(6.5.X\uc5d0\uc11c\ub294 \ub450 \ubc88\uc9f8 \ud611\ub825 \ud568\uc218\ub97c \ud1b5\ud574 \uc0ac\uc6a9\uc790 \uacf5\uac04 \uc6cc\ud06c\uc5b4\ub77c\uc6b4\ub4dc\uac00 \uc218\ud589\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4). \uc2ec\uac01\ub3c4\ub294 \ub2e4\uc74c\uc5d0 \uc758\ud574 \uad00\ub9ac\ub429\ub2c8\ub2e4:\n<ul>\n<li>\ud65c\uc131 \ud0c0\uc774\uba38\ub97c \ubcf4\uc720\ud558\uace0 \uc788\ub294 vBucket\uc758 \uc218\uc785\ub2c8\ub2e4. \ub530\ub77c\uc11c \ud5a5\ud6c4 \ud0c0\uc774\uba38\uac00 \uba87 \uac1c\ub9cc \uc788\ub294 \uacbd\uc6b0 \ubb38\uc81c\uac00 \ub208\uc5d0 \ub744\uc9c0 \uc54a\uac70\ub098 \uad6c\uccb4\ud654\ub418\uc9c0 \uc54a\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\u00a0 <em>\uc774\uac83\uc740 \uba87 \uac00\uc9c0 \ud06c\ub860 \uc77c\uc815\uc758 \uacbd\uc6b0\uc774\uc9c0\ub9cc \ub0a0\uc9dc \uae30\ub2a5\uc744 \ucd94\uac00 \ud560 \uacbd\uc6b0\ub97c \ub300\ube44\ud558\uc5ec\uc774 \ubb38\uc11c\uc5d0 \uc81c\uacf5\ub41c \ucf54\ub4dc\uc5d0 \ub300\ud55c\uc774 \ubb38\uc81c\uc5d0 \ub300\ud55c \uc218\uc815 \uc0ac\ud56d\uc744 \ucd94\uac00\ud588\uc2b5\ub2c8\ub2e4.<\/em>.<\/li>\n<li>\uc774\ubca4\ud2b8 \ud0c0\uc774\uba38\uac00 \ucd5c\uadfc\uc5d0 vBucket\uc5d0\uc11c \uc2e4\ud589\ub418\uc5c8\ub294\uc9c0 \uc5ec\ubd80(\uae30\ub2a5\ubcc4\ub85c \uc9c0\uc815\ub41c vBucket\uc5d0 \ub300\ud55c \ubb38\uc81c\ub97c \uc9c0\uc6c1\ub2c8\ub2e4). \ub530\ub77c\uc11c \ub2e8\uae30 \ud0c0\uc774\uba38 \ud65c\ub3d9\uc774 \ub9ce\uc740 \uc2dc\uc2a4\ud15c\uc5d0\uc11c\ub294 \ud0c0\uc774\uba38\uac00 \uba3c \ubbf8\ub798\ub85c \uc608\uc57d\ub418\uc5b4 \uc788\uc5b4\ub3c4 \uc774 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>\ub2e4\ud589\ud788\ub3c4 \ubc84\uc804 6.6.0\uc5d0\uc11c\ub294 \uc704\uc758 \ub450 \uac00\uc9c0 \ubb38\uc81c\ub098 \uc81c\ud55c \uc0ac\ud56d\uc774 \ubaa8\ub450 \ud574\uacb0\ub418\uc5b4 \ud558\ub098\uc758 \uac04\ub2e8\ud55c \ud1b5\ud569 \uc774\ubca4\ud2b8 \ud568\uc218\uc5d0\uc11c \uc2a4\ucf00\uc904\ub7ec\ub97c \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8730\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/04\/ev_cr_1u_design_choices-1.png\" alt=\"Eventing cron update\" width=\"740\" height=\"325\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/ev_cr_1u_design_choices-1.png 1479w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/ev_cr_1u_design_choices-1-300x132.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/ev_cr_1u_design_choices-1-1024x449.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/ev_cr_1u_design_choices-1-768x337.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/ev_cr_1u_design_choices-1-20x9.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/ev_cr_1u_design_choices-1-1320x579.png 1320w\" sizes=\"auto, (max-width: 740px) 100vw, 740px\" \/><\/p>\n<h3>\uc804\uc81c \uc870\uac74<\/h3>\n<p>\uc774 \ubb38\uc11c\uc5d0\uc11c\ub294 \ucd5c\uc2e0 GA \ubc84\uc804, \uc989 Couchbase \ubc84\uc804 6.5.1\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4(\uc774\uc804 Couchbase \ubc84\uc804\uc5d0 \ub300\ud574 \uc124\uba85\ub41c \uc774\ubca4\ud2b8 \ud568\uc218\ub97c \uc77c\ubd80 \ubcc0\uacbd\ud574\uc57c \ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4). \uc774 \ubb38\uc11c\uc758 \uc608\uc81c\ub294 Couchbase \uc11c\ubc84\uc640 \ud568\uaed8 \uc81c\uacf5\ub418\ub294 \uc5ec\ud589 \uc0d8\ud50c \ub370\uc774\ud130 \uc138\ud2b8\uc5d0 \ub300\ud574 \uc2e4\ud589\ub429\ub2c8\ub2e4.<\/p>\n<p style=\"border: 1px solid black;padding: 8px\"><strong>\ud504\ub85c \ud301<\/strong>: <u>\uace0\uae09 \uc0ac\uc6a9\uc790 \uc804\uc6a9<\/u>, <em>\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc774\ubca4\ud2b8 \ubc0f CLI\/ REST \ub3c4\uad6c\uc5d0 \uc775\uc219\ud558\ub2e4\uba74 \uc774 \ube14\ub85c\uadf8\uc758 \ub300\ubd80\ubd84\uc744 \uac74\ub108\ub6f0\uace0 \uc544\ub798 \uc81c\uc2dc\ub41c \uc2a4\ucf00\uc904\ub7ec \uc2dc\uc2a4\ud15c\uc744 \ube60\ub974\uac8c \uc124\uc815\ud558\uace0 \uc2e4\ud589\ud560 \uc218 \uc788\ub294 ZIP \ud30c\uc77c\uc744 \ub2e4\uc6b4\ub85c\ub4dc\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.  \ub2e4\uc74c \ub9c1\ud06c\ub97c \ub9c8\uc6b0\uc2a4 \uc624\ub978\ucabd \ubc84\ud2bc\uc73c\ub85c \ud074\ub9ad\ud558\uace0 <strong>\ub2e4\ub978 \uc774\ub984\uc73c\ub85c \ub9c1\ud06c \uc800\uc7a5<\/strong>\u00a0\ub97c \ud074\ub9ad\ud558\uc5ec \ud30c\uc77c\uc744 \ub2e4\uc6b4\ub85c\ub4dc\ud569\ub2c8\ub2e4.<\/em> \u00a0<a href=\"https:\/\/github.com\/couchbaselabs\/blog-source-code\/raw\/master\/Strabala\/CronFiles\/cron_impl_2func_CLI.zip\"><strong>cron_impl_2func_CLI.zip<\/strong><\/a>, <em>\uc774\ubca4\ud2b8 \ub178\ub4dc\ub85c \uc774\ub3d9\ud558\uace0 ZIP \ud30c\uc77c\uc744 \ucd94\ucd9c\ud55c \ub2e4\uc74c \ucd94\ucd9c\ub41c README.txt \ud30c\uc77c\uc744 \ucc38\uc870\ud558\uc138\uc694.<\/em><\/p>\n<p>\uadf8\ub7ec\ub098 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ub610\ub294 \uc774\ubca4\ud2b8 \uc11c\ube44\uc2a4\uc5d0 \uc775\uc219\ud558\uc9c0 \uc54a\uc740 \uacbd\uc6b0 \uc2dc\uc791\ud558\uae30\uc640 \uc774\ubca4\ud2b8 \uc608\uc2dc\ub97c \uad6c\uccb4\uc801\uc73c\ub85c \ucc38\uc870\ud558\uc138\uc694:<\/p>\n<ul>\n<li>\uc758 \uc9c0\uce68\uc5d0 \ub530\ub77c \uc791\ub3d9\ud558\ub294 Couchbase 6.5.1 \uc11c\ubc84\ub97c \uc124\uc815\ud569\ub2c8\ub2e4. <a href=\"https:\/\/docs.couchbase.com\/server\/current\/getting-started\/start-here.html\">\uc5ec\uae30\uc11c \uc2dc\uc791\ud558\uc138\uc694!<\/a><\/li>\n<li>\uc5d0 \ub300\ud574 N1QL \ucffc\ub9ac\ub97c \uc2e4\ud589\ud560 \uc218 \uc788\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4. <strong>\uc5ec\ud589 \uc0d8\ud50c<\/strong> \uc758 \uc9c0\uce68\uc5d0 \ub530\ub77c \ub370\uc774\ud130 \uc138\ud2b8\ub97c <a href=\"https:\/\/docs.couchbase.com\/server\/current\/getting-started\/try-a-query.html\">\uccab \ubc88\uc9f8 N1QL \ucffc\ub9ac \uc2e4\ud589<\/a>.<\/li>\n<li>\uc758 \uc9c0\uce68\uc5d0 \ub530\ub77c \uae30\ubcf8 \uc774\ubca4\ud2b8 \uae30\ub2a5\uc744 \ubc30\ud3ec\ud558\ub294 \ubc29\ubc95\uc744 \uc774\ud574\ud569\ub2c8\ub2e4. <a href=\"https:\/\/docs.couchbase.com\/server\/current\/eventing\/eventing-examples-docarchive.html\">\ubb38\uc11c \ubcf4\uad00<\/a> \uc608\uc81c\ub97c \uc0ac\uc6a9\ud558\ub294 <strong>\uc5ec\ud589 \uc0d8\ud50c<\/strong> \ub370\uc774\ud130 \uc9d1\ud569\uc785\ub2c8\ub2e4.<\/li>\n<li>\ub2e4\uc74c \uc0ac\ud56d\uc774 \uc788\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4. <strong>\uc5ec\ud589 \uc0d8\ud50c<\/strong> \ubc84\ud0b7\uc744 \ud074\ub9ad\ud569\ub2c8\ub2e4.<\/li>\n<li>\ub77c\ub294 \ubc84\ud0b7\uc774 \uc788\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4. <strong>\uba54\ud0c0\ub370\uc774\ud130<\/strong> UI\uc758 \ubc84\ud0b7 \ubcf4\uae30\uc5d0\uc11c \ucd5c\uc18c \ud06c\uae30\uac00 200MB\uc5ec\uc57c \ud569\ub2c8\ub2e4.<\/li>\n<li>UI\uc758 \ubc84\ud0b7 \ubcf4\uae30\uc5d0\uc11c \ub2e4\uc74c\uacfc \uac19\uc740 \ubc84\ud0b7\uc744 \ub9cc\ub4ed\ub2c8\ub2e4. <strong>\ud06c\ub860\ub370\uc774\ud130<\/strong> \ucd5c\uc18c \ud06c\uae30\ub294 200MB\uc785\ub2c8\ub2e4. \ubc84\ud0b7\uc744 \ub9cc\ub4dc\ub294 \ubc29\ubc95\uc5d0 \ub300\ud55c \uc790\uc138\ud55c \ub2e8\uacc4\ub294 \ub2e4\uc74c\uc744 \ucc38\uc870\ud558\uc138\uc694. <a href=\"https:\/\/docs.couchbase.com\/server\/6.5\/manage\/manage-buckets\/create-bucket.html\">\ubc84\ud0b7 \ub9cc\ub4e4\uae30<\/a>.<\/li>\n<li>\uc124\uc815 <em>\ud5c8\uc6a9_\uc778\ud130\ubc84\ud0b7_\uc7ac\uadc0<\/em> \uc5d0 <em>true<\/em> \ub97c \uc0ac\uc6a9\ud558\uc5ec \ub450(2) \uac1c\uc758 \uc774\ubca4\ud2b8 \ud568\uc218\uac00 \ub3d9\uc77c\ud55c KV \ubb38\uc11c\ub97c \ubcc0\uacbd\ud560 \uc218 \uc788\ub3c4\ub85d \ud5c8\uc6a9\ud569\ub2c8\ub2e4. <a id=\"footnote_2\"><\/a><sup>[2]<\/sup>.\n<pre class=\"striped:false wrap-toggle:false lang:sh highlight:0 decode:true\">curl -X POST -u \"$CB_USERNAME:$CB_PASSWORD\" 'https:\/\/localhost:8091\/_p\/event\/api\/v1\/config' -d '{ \"allow_interbucket_recursion\":true }'\r\n<\/pre>\n<\/li>\n<\/ul>\n<h3>\uad6c\ud604 #1, \uc2a4\ucf00\uc904\ub9c1\uacfc \uac19\uc740 \ud558\ub4dc \ucf54\ub529\ub41c '\ud06c\ub860'<\/h3>\n<p>\uccab \ubc88\uc9f8 \uad6c\ud604(\uc608: \uc2dc\ub9ac\uc988 1\ud3b8)\uc5d0\uc11c\ub294 KV JSON \ubb38\uc11c\uc5d0 \ubd88\uacfc\ud55c \uac04\ub2e8\ud55c \uc81c\uc5b4 \uad6c\uc870\uc640 \uc81c\uc5b4 \uad6c\uc870\uc758 \uc815\ubcf4\uc5d0 \uc751\ub2f5\ud558\uace0 \uc774\uc5d0 \ub530\ub77c \ub3d9\uc791\ud558\ub294 \uc774\ubca4\ud2b8 \ud568\uc218 2\uac1c\ub97c \uc124\uacc4\ud560 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p>\uc544\ub798\ub294 \uc5ec\ub7ec \uac1c\uc758 \uc608\uc57d\ub41c \"\uc774\ubca4\ud2b8\"\ub97c \uac00\uc9c8 \uc218 \uc788\ub3c4\ub85d \ud558\ub294 JSON \ubb38\uc11c \ub610\ub294 \uc81c\uc5b4 \uad6c\uc870\uc758 \ub514\uc790\uc778\uc785\ub2c8\ub2e4. \uac01 \uc2a4\ucf00\uc904 \uc774\ubca4\ud2b8\uc5d0\ub294 recurring_event::1, recurring_event::1, ... recurring_event::N\uacfc \uac19\uc740 \uace0\uc720\ud55c KEY\uac00 \uc788\ub294 \uc790\uccb4 \uc81c\uc5b4 \ubb38\uc11c\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uc2a4\ucf00\uc904\ub9c1 \uc2dc\uc2a4\ud15c\uc774 \uc791\uc5c5\uc744 \ud65c\uc131\ud654 \ub610\ub294 \ube44\ud65c\uc131\ud654\ud558\uae30 \uc704\ud574 \"\ud65c\uc131\" \uc0c1\ud0dc\ub97c \ud1a0\uae00\ud558\uac70\ub098 \ub85c\uae45\uc758 \uc591\uacfc \uc2a4\ud0c0\uc77c\uc744 \uc81c\uc5b4\ud558\ub294 \"\uc0c1\uc138\" \ud544\ub4dc\ub97c \ubcc0\uacbd\ud558\ub294 \ub4f1 \uc81c\uc5b4 \ubb38\uc11c\uc758 \ubcc0\uacbd \ub610\ub294 \uc5c5\ub370\uc774\ud2b8(\ubcc0\uc774)\uc5d0 \uc751\ub2f5\ud558\ubbc0\ub85c JSON \uad6c\uc870 \uc790\uccb4\uc5d0\ub294 \"\ud0a4 \uc7ac\uad6c\uc131\"\uc744 \uc704\ud55c \uc815\ubcf4\uac00 \ud3ec\ud568\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\uc74c\uc740 KEY\ub97c \uc0ac\uc6a9\ud55c \uc81c\uc5b4 \ubb38\uc11c \uc608\uc2dc\uc785\ub2c8\ub2e4. <strong>\ubc18\ubcf5_\uc774\ubca4\ud2b8::1<\/strong> \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \ud568\uc218\ub97c \uc2e4\ud589\ud558\ub294 <strong>doCronActionA<\/strong> \ub9e4\uc77c 14:54(\uc624\ud6c4 2\uc2dc 30\ubd84).<\/p>\n<table style=\"width: 100%;border: 1px solid #456789;padding: 1px;font-size: 80%;margin-bottom: 26px\">\n<tbody>\n<tr>\n<th style=\"padding: 4px;font-weight: bold;border-bottom: solid 1px;width: 33%\">JSON \uc81c\uc5b4 \ub808\ucf54\ub4dc<\/th>\n<th style=\"padding: 4px;font-weight: bold;border-bottom: solid 1px\">\uc124\uba85<\/th>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">{<\/td>\n<td style=\"padding: 4px\"><\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">\u00a0 \u00a0\"\uc720\ud615\":\"\ubc18\ubcf5_\uc774\ubca4\ud2b8\",<\/td>\n<td style=\"padding: 4px\">KEY\ub294 &lt;&gt;::&lt;&gt;\uc785\ub2c8\ub2e4.<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">\u00a0 \u00a0\"id\":1,<\/td>\n<td style=\"padding: 4px\"><\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">\u00a0 \u00a0\"\uc2dc\uac04\":14,<\/td>\n<td style=\"padding: 4px\">0-23, *, *2X, *4X\ub97c \ud2b8\ub9ac\uac70\ud558\ub294 \ud558\ub8e8 \uc911 \uc2dc\uac04\uc785\ub2c8\ub2e4.<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">\u00a0 \u00a0\"min\":54,<\/td>\n<td style=\"padding: 4px\">\uc2dc 0-59\ubd84, *, *2X, *4X\ub97c \ud2b8\ub9ac\uac70\ud558\ub824\uba74<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">\u00a0\u00a0 \"action\":\"doCronActionA\",<\/td>\n<td style=\"padding: 4px\">\ud0c0\uc774\uba38\uac00 \uc2e4\ud589\ub420 \ub54c \uc2e4\ud589\ud560 \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \ud568\uc218<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">\u00a0 \u00a0\"active\":true,<\/td>\n<td style=\"padding: 4px\">\uc774 \uc77c\uc815\uc744 \ud65c\uc131\ud654 \ub610\ub294 \ube44\ud65c\uc131\ud654\ud558\ub824\uba74 \ud50c\ub798\uadf8 \uc9c0\uc815<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">\u00a0\u00a0 \"verbose\": {<\/td>\n<td style=\"padding: 4px\">[\uc120\ud0dd \uc0ac\ud56d] \ub85c\uae45 \uc81c\uc5b4<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">\u00a0 \u00a0\u00a0 \u00a0\"user_func\":2,<\/td>\n<td style=\"padding: 4px\">\uc561\uc158 \ub85c\uc9c1\uc758 \ub85c\uae45 \uc218\uc900 : 0=\uc5c6\uc74c \ub4f1 \ub4f1<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">\u00a0 \u00a0\u00a0 \u00a0\"\uc2a4\ucf00\uc904\ub7ec\":3<\/td>\n<td style=\"padding: 4px\">\ud06c\ub860 \ub85c\uc9c1\uc758 \ub85c\uae45 \uc218\uc900: 0=\uc5c6\uc74c \ub4f1 \ub4f1<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">\u00a0\u00a0 },<\/td>\n<td style=\"padding: 4px\"><\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">\u00a0\u00a0 \"\ub3d9\uc801\": {<\/td>\n<td style=\"padding: 4px\">[\ub3d9\uc801] \uc2dc\uc2a4\ud15c \uc81c\uc5b4 \ubc0f \ud1b5\uacc4<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">\u00a0 \u00a0\u00a0 \u00a0\"\uc0c1\ud0dc\":\"\ud314\",<\/td>\n<td style=\"padding: 4px\">\"ARM\"|\"\ub2e4\uc2dc \ubb34\uc7a5\"|\"\ubcf4\ub958 \uc911\" \uc784\uc758\uc758 \uac12 != \"\ubcf4\ub958 \uc911\" \uc77c\uc815 \uc2dc\uc791<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">\u00a0 \u00a0\u00a0 \u00a0\"next_sched\": 0,<\/td>\n<td style=\"padding: 4px\">\uc5d0\ud3ec\ud06c \uc774\ud6c4 \ub2e4\uc74c \uc6d0\ud558\ub294 \uc77c\uc815\uae4c\uc9c0 \uac78\ub9b0 \uc2dc\uac04(\ucd08)<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">\u00a0 \u00a0\u00a0 \u00a0\"prev_sched\": 0,<\/td>\n<td style=\"padding: 4px\">\uc774\uc804 \uc77c\uc815\uc758 \uc5d0\ud3ec\ud06c \uc774\ud6c4 \uacbd\uacfc \uc2dc\uac04(\ucd08)<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">\u00a0 \u00a0\u00a0 \u00a0\"prev_time\": 0,<\/td>\n<td style=\"padding: 4px\">\uc774\uc804 \uc2a4\ucf00\uc904 \uc2e4\uc81c \uc2e4\ud589 \uc2dc\uac04\uc5d0 \ub300\ud55c \uc5d0\ud3ec\ud06c \uc774\ud6c4 \uc2dc\uac04(\ucd08)<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">\u00a0 \u00a0\u00a0 \u00a0\"prev_delay\": 0,<\/td>\n<td style=\"padding: 4px\">\ud0c0\uc774\uba38\uac00 \uc77c\uc815\uc5d0\uc11c \uc9c0\uc5f0\ub41c \uc2dc\uac04(\ucd08)<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">\u00a0 \u00a0\u00a0 \u00a0\"prev_atime\": 0<\/td>\n<td style=\"padding: 4px\">\uc0ac\uc6a9\uc790 '\uc561\uc158'\uc5d0 \uac78\ub9b0 \uc2dc\uac04(\ucd08)<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">\u00a0\u00a0 }<\/td>\n<td style=\"padding: 4px\"><\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">}<\/td>\n<td style=\"padding: 4px\"><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\uae30\uc874 Linux\uc640 \ub9c8\ucc2c\uac00\uc9c0\ub85c <em>\ud06c\ub860\ud0ed<\/em> \uc2dc\uc640 \ubd84\uc744 \ubc95\uc815 \uc815\uc218\ub85c \uc124\uc815\ud560 \uc218 \uc788\uc73c\uba70, \ub610\ud55c <em>\uc2dc\uac04<\/em> \ub97c \"*\"\ub85c \uc124\uc815\ud558\uc5ec \ubaa8\ub4e0 \uc2dc\uac04 \ub3d9\uc548 \ucc98\ub9ac\ud558\uac70\ub098 <em>\ubd84<\/em> \ub97c \"*\"\ub85c \uc124\uc815\ud558\uc5ec \ubaa8\ub4e0 \ubd84\uc744 \ucc98\ub9ac\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc804\uccb4 \uae30\ub2a5\uc744 \uc9c0\uc6d0\ud558\uc9c0\ub294 \uc54a\uc9c0\ub9cc <em>\ud06c\ub860\ud0ed<\/em> \uad6c\ubb38\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \ub2e4\uc74c\uacfc \uac19\uc740 \ub450 \uac00\uc9c0 \ube44\ud45c\uc900 \uc124\uc815\uc744 \uc9c0\uc6d0\ud569\ub2c8\ub2e4. <u>\ub458 \ub2e4 \uc124\uc815<\/u> <em>\uc2dc\uac04<\/em> \uadf8\ub9ac\uace0 <em>\ubd84<\/em> \ub97c \"*4X\"\ub85c \uc124\uc815\ud558\uba74 1\ubd84\uc5d0 \ub124(4) \ubc88 \uc2e4\ud589\ud558\uace0 \ub2e4\uc2dc \ubb34\uc7a5\ud558\uba70, \ub450 \uac00\uc9c0\ub97c \ubaa8\ub450 \"*2X\"\ub85c \uc124\uc815\ud558\uba74 1\ubd84\uc5d0 \ub450(2) \ubc88 \uc2e4\ud589\ud558\uace0 \ub2e4\uc2dc \ubb34\uc7a5\ud569\ub2c8\ub2e4.  \uc544\ub798\ub294 \uc124\uba85\uacfc \ud568\uaed8 \uc9c0\uc6d0\ub418\ub294 \uc2a4\ucf00\uc904 \ud45c\uc785\ub2c8\ub2e4:<\/p>\n<table style=\"width: 100%;border: 1px solid #456789;padding: 1px;font-size: 80%;margin-bottom: 26px\">\n<tbody>\n<tr>\n<th style=\"padding: 4px;font-weight: bold;border-bottom: solid 1px\" width=\"60\">\uc2dc\uac04<\/th>\n<th style=\"padding: 4px;font-weight: bold;border-bottom: solid 1px\" width=\"72\">\ubd84<\/th>\n<th style=\"padding: 4px;font-weight: bold;border-bottom: solid 1px\" width=\"510\">\uac12\uc740 \uc22b\uc790 \ub610\ub294 \ubb38\uc790\uc5f4\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/th>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\" width=\"60\">13<\/td>\n<td style=\"padding: 4px\" width=\"72\">32<\/td>\n<td style=\"padding: 4px\" width=\"510\">13:32(\ub610\ub294 \uc624\ud6c4 1\uc2dc 32\ubd84) \uc2e4\ud589<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\" width=\"60\">*<\/td>\n<td style=\"padding: 4px\" width=\"72\">15<\/td>\n<td style=\"padding: 4px\" width=\"510\">\ub9e4\uc2dc\uac04 15\ubd84 \uacbd\uacfc \uc2dc \uc2e4\ud589<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\" width=\"60\">8<\/td>\n<td style=\"padding: 4px\" width=\"72\">12<\/td>\n<td style=\"padding: 4px\" width=\"510\">\ud558\ub8e8\uc5d0 \ud55c \ubc88 8\uc2dc 32\ubd84(\ub610\ub294 \uc624\uc804 8\uc2dc 32\ubd84)\uc5d0 \uc2e4\ud589\ud569\ub2c8\ub2e4.<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\" width=\"60\">*<\/td>\n<td style=\"padding: 4px\" width=\"72\">*<\/td>\n<td style=\"padding: 4px\" width=\"510\">1\ubd84\uc5d0 \ud55c \ubc88 \uc2e4\ud589<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\" width=\"60\">*2X<\/td>\n<td style=\"padding: 4px\" width=\"72\">*2X<\/td>\n<td style=\"padding: 4px\" width=\"510\">1\ubd84\uc5d0 \ub450 \ubc88 \uc2e4\ud589 - \uc2dc\uc640 \ubd84\uc744 \ubaa8\ub450 \"*2X\"\ub85c \uc124\uc815\ud574\uc57c \ud569\ub2c8\ub2e4.<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\" width=\"60\">*4X<\/td>\n<td style=\"padding: 4px\" width=\"72\">*4X<\/td>\n<td style=\"padding: 4px\" width=\"510\">1\ubd84\uc5d0 4\ubc88 \uc2e4\ud589 - \uc2dc\uc640 \ubd84\uc744 \ubaa8\ub450 \"*2X\"\ub85c \uc124\uc815\ud574\uc57c \ud569\ub2c8\ub2e4.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\uacb0\uad6d \ucffc\ub9ac \uc6cc\ud06c\ubca4\uce58\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub2e4\uc74c\uc744 \uc0bd\uc785\ud569\ub2c8\ub2e4. <em>cron<\/em> \uc81c\uc5b4 \ubb38\uc11c\uc5d0\ub294 \ubaa8\ub450 \uace0\uc720\ud55c \ud0a4\uac00 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. <strong>recurring_event::#<\/strong> \ub97c \uc2e4\ud589 \uc608\uc815 \uc2dc\uac04\uc778 14:54(\uc624\ud6c4 2\uc2dc 54\ubd84)\ub85c \ubcc0\uacbd\ud558\ub824\uba74 doCronActionA \uc791\uc5c5\uc5d0 \ub300\ud574 \ub2e4\uc74c N1QL \ubb38\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><u>\uc9c0\uae08 \ub2f9\uc7a5 N1QL \ubb38\uc744 \uc2e4\uc81c\ub85c \uc2e4\ud589\ud558\ub294 \uac83\uc5d0 \ub300\ud574 \uac71\uc815\ud558\uc9c0 \ub9c8\uc138\uc694,<\/u> \uc774\ubca4\ud2b8 \ud568\uc218\ub97c \ube4c\ub4dc\ud558\uace0 \ubc30\ud3ec\ud55c \ud6c4 \ub098\uc911\uc5d0 N1QL \ubb38\uc744 \uc218\ud589\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ubc84\ud0b7\uc5d0\uc11c \uc81c\uc5b4 \ub808\ucf54\ub4dc(\ub610\ub294 \ub808\ucf54\ub4dc)\ub97c \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <strong>\uc5ec\ud589 \uc0d8\ud50c<\/strong>\ub97c \ud074\ub9ad\ud55c \ub2e4\uc74c \ub2e4\uc74c\uacfc \uac19\uc774 \ub098\uc5f4, \ubb34\uc7a5, \ubb34\uc7a5 \ud574\uc81c, \ub530\ub974\ub294 \uc77c\uc815 \uc870\uc815, \ub85c\uae45\uc758 \uc0c1\uc138\ub3c4 \uc218\uc900 \ubcc0\uacbd \ub610\ub294 \uc0ad\uc81c\ud569\ub2c8\ub2e4:<\/p>\n<table style=\"width: 100%;border: 1px solid #456789;padding: 1px;font-size: 80%;margin-bottom: 26px\">\n<tbody>\n<tr>\n<th style=\"padding: 4px;font-weight: bold;border-bottom: solid 1px;width: 30%\">\uc561\uc158<\/th>\n<th style=\"padding: 4px;font-weight: bold;border-bottom: solid 1px\">N1QL \ubb38<\/th>\n<\/tr>\n<tr>\n<td style=\"padding: 4px;vertical-align: top\">\uc77c\uc815 \ub9cc\ub4e4\uae30<\/td>\n<td style=\"padding: 4px\">INSERT INTO `travel-sample` (KEY,VALUE) VALUES (<br \/>\n\"RECURRING_EVENT::1\", {<br \/>\n\"\uc720\ud615\":\"\ubc18\ubcf5_\uc774\ubca4\ud2b8\",<br \/>\n\"id\":1,<br \/>\n\"\uc2dc\uac04\":\"14\",<br \/>\n\"min\":\"54\u2033,<br \/>\n\"action\":\"doCronActionA\",<br \/>\n\"active\":true<br \/>\n}<br \/>\n);<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">\ud0a4\ub97c \uc9c0\uc815\ud558\uc9c0 \uc54a\uace0\ub3c4 \ub370\uc774\ud130\ub97c \ucffc\ub9ac\ud560 \uc218 \uc788\ub294 \uc778\ub371\uc2a4 \ub9cc\ub4e4\uae30<\/td>\n<td style=\"padding: 4px\">\ud06c\ub860\ub370\uc774\ud130`\uc5d0 \uae30\ubcf8 \uc778\ub371\uc2a4\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4;<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">ID\ubcc4\ub85c \ubaa8\ub4e0 \uc77c\uc815 \uc21c\uc11c \ud45c\uc2dc<\/td>\n<td style=\"padding: 4px\">SELECT * FROM `crondata` WHERE type=&#8221;recurring_event&#8221; order by id ;<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">\ud2b9\uc815 \uc77c\uc815 \ud45c\uc2dc<\/td>\n<td style=\"padding: 4px\">SELECT * FROM `crondata` WHERE type=&#8221;recurring_event&#8221; AND id=1 ;<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">\ud314 \ub610\ub294 \ud65c\uc131 \uc124\uc815<\/td>\n<td style=\"padding: 4px\">UPDATE `crondata` SET active = true WHERE type=&#8221;recurring_event&#8221; AND id=1 ;<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">\ube44\ud65c\uc131\ud654 \ub610\ub294 \ube44\ud65c\uc131 \uc124\uc815<\/td>\n<td style=\"padding: 4px\">UPDATE `crondata` SET active = false WHERE type=&#8221;recurring_event&#8221; AND id=1 ;<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">\ud2b8\ub9ac\uac70 \uc2dc\uac04 \uc870\uc815<\/td>\n<td style=\"padding: 4px\">UPDATE `crondata` SET hour = 11, min = 30 WHERE type=&#8221;recurring_event&#8221; AND id=1 ;<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">\"\uc791\uc5c5\" \ub85c\uae45 \uc870\uc815<\/td>\n<td style=\"padding: 4px\">UPDATE `crondata` SET verbose.user_data = 0 WHERE type=&#8221;recurring_event&#8221; AND id=1 ;<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">\uc2a4\ucf00\uc904\ub7ec \ub85c\uc9c1\uc758 \ub85c\uae45 \uc870\uc815\ud558\uae30<\/td>\n<td style=\"padding: 4px\">UPDATE `crondata` SET verbose.scheduler = 0 WHERE type=&#8221;recurring_event&#8221; AND id=1 ;<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">\uc77c\uc815 \uc0ad\uc81c<\/td>\n<td style=\"padding: 4px\">DELETE FROM `crondata` WHERE type=&#8221;recurring_event&#8221; AND id=1 ;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>4\uac1c\uc758 \ud65c\uc131 \uc77c\uc815\uc774 \uc788\ub2e4\uace0 \uac00\uc815\ud558\uace0, \uc704\uc758 \uccab \ubc88\uc9f8 N1QL \ubb38\uc744 \uc2e4\ud589\ud558\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 \ubaa8\ub4e0 \uc77c\uc815\uc774 \ub098\uc5f4\ub429\ub2c8\ub2e4.<\/p>\n<pre class=\"striped:false wrap-toggle:false lang:sh highlight:0 decode:true\">SELECT active, action, hour, min, type, id, verbose.user_func, verbose.scheduler\r\nFROM `crondata` where type=\"recurring_event\" order by id ;<\/pre>\n<p>\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \ucd9c\ub825\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4(\ucffc\ub9ac \uc6cc\ud06c\ubca4\uce58\uc758 \ud14c\uc774\ube14 \ubcf4\uae30):<\/p>\n<table style=\"width: 100%;border: 1px solid #456789;padding: 1px;font-size: 80%;margin-bottom: 26px\">\n<tbody>\n<tr>\n<th style=\"padding: 4px;font-weight: bold;border-bottom: solid 1px\">\ud65c\uc131<\/th>\n<th style=\"padding: 4px;font-weight: bold;border-bottom: solid 1px;width: 20%\">\uc561\uc158<\/th>\n<th style=\"padding: 4px;font-weight: bold;border-bottom: solid 1px\">\uc2dc\uac04<\/th>\n<th style=\"padding: 4px;font-weight: bold;border-bottom: solid 1px\">id<\/th>\n<th style=\"padding: 4px;font-weight: bold;border-bottom: solid 1px\">\ubd84<\/th>\n<th style=\"padding: 4px;font-weight: bold;border-bottom: solid 1px\">\uc2a4\ucf00\uc904\ub7ec<\/th>\n<th style=\"padding: 4px;font-weight: bold;border-bottom: solid 1px;width: 20%\">\uc720\ud615<\/th>\n<th style=\"padding: 4px;font-weight: bold;border-bottom: solid 1px\">user_func<\/th>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">true<\/td>\n<td style=\"padding: 4px\">\"doCronActionA\"<\/td>\n<td style=\"padding: 4px\">14<\/td>\n<td style=\"padding: 4px\">1<\/td>\n<td style=\"padding: 4px\">54<\/td>\n<td style=\"padding: 4px\">1<\/td>\n<td style=\"padding: 4px\">\"recurring_event\"<\/td>\n<td style=\"padding: 4px\">2<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">true<\/td>\n<td style=\"padding: 4px\">\"doCronActionB\"<\/td>\n<td style=\"padding: 4px\">*<\/td>\n<td style=\"padding: 4px\">2<\/td>\n<td style=\"padding: 4px\">*<\/td>\n<td style=\"padding: 4px\">1<\/td>\n<td style=\"padding: 4px\">\"recurring_event\"<\/td>\n<td style=\"padding: 4px\">1<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">true<\/td>\n<td style=\"padding: 4px\">\"doCronActionC\"<\/td>\n<td style=\"padding: 4px\">*2X<\/td>\n<td style=\"padding: 4px\">3<\/td>\n<td style=\"padding: 4px\">*2X<\/td>\n<td style=\"padding: 4px\">4<\/td>\n<td style=\"padding: 4px\">\"recurring_event\"<\/td>\n<td style=\"padding: 4px\">4<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\">true<\/td>\n<td style=\"padding: 4px\">\"doCronActionD\"<\/td>\n<td style=\"padding: 4px\">*<\/td>\n<td style=\"padding: 4px\">4<\/td>\n<td style=\"padding: 4px\">0<\/td>\n<td style=\"padding: 4px\">0<\/td>\n<td style=\"padding: 4px\">\"recurring_event\"<\/td>\n<td style=\"padding: 4px\">1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\uc704\uc758 \ud45c\uc5d0\uc11c \uccab \ubc88\uc9f8 \ub3d9\uc791\uc740 \ud558\ub8e8\uc5d0 \ud55c \ubc88, \ub450 \ubc88\uc9f8 \ub3d9\uc791\uc740 1\ubd84\ub9c8\ub2e4, \uc138 \ubc88\uc9f8 \ub3d9\uc791\uc740 30\ucd08\ub9c8\ub2e4, \ub124 \ubc88\uc9f8 \ub3d9\uc791\uc740 1\uc2dc\uac04\uc5d0 \ud55c \ubc88 \uc2e4\ud589\ub418\ub294 \ub124 \uac00\uc9c0 \ub3d9\uc791\uc774 \uc788\uc2b5\ub2c8\ub2e4.  \uc774 \uc2dc\ub9ac\uc988\uc758 \ub2e4\uc74c \ud3b8\uc5d0\uc11c\ub294 '\uc694\uc77c' \uae30\ub2a5\uc744 \ucd94\uac00\ud560 \uc608\uc815\uc785\ub2c8\ub2e4.<\/p>\n<p>JSON \ucee8\ud2b8\ub864 \ub808\ucf54\ub4dc\uc758 \uc911\ucca9\ub41c \uac1c\uccb4 \"<em>verbose<\/em>\"\ub97c \uc81c\uacf5\ud558\uc9c0 \uc54a\uc73c\uba74 \uae30\ubcf8\uac12\uc740 { \"user_func\":1, \"scheduler\":1 }\ub85c \ub3d9\uc791 \ud568\uc218 \ubc0f \uc2a4\ucf00\uc904\ub9c1 \ub85c\uc9c1\uc5d0 \ub300\ud55c \ub85c\uae45 \uc218\uc900\uc774 \ub0ae\uac70\ub098 \uac04\uacb0\ud568\uc744 \ub098\ud0c0\ub0c5\ub2c8\ub2e4.  \uac12\uc774 0\uc774\uba74 \ubaa8\ub4e0 \ub85c\uadf8 \uba54\uc2dc\uc9c0(\uc608: doCronActionD)\uac00 \uc5b5\uc81c\ub418\uace0, \uac12\uc774 \ud074\uc218\ub85d doCronActionC\uc5d0 \uc815\uc758\ub41c \ub300\ub85c \ub354 \uc790\uc138\ud55c \ub0b4\uc6a9\uc774 \uae30\ub85d\ub429\ub2c8\ub2e4.<\/p>\n<p>JSON \ucee8\ud2b8\ub864 \ub808\ucf54\ub4dc\uc758 \uc911\ucca9\ub41c \uac1c\uccb4 \"<em>\ub3d9\uc801<\/em>\"(\uc77c\ubc18\uc801\uc73c\ub85c \uc81c\uacf5\ub418\uc9c0 \uc54a\ub294 \uacbd\uc6b0 \uae30\ubcf8\uac12\uc740 { \"state\")\ub85c \uc124\uc815\ub429\ub2c8\ub2e4: \"arm\", \"next_sched\": 0, \"prev_sched\": 0, \"prev_time\": 0, \"prev_delay\": 0, \"prev_atime\": 0 } \uc774\uac83\uc740 \uc2e4\ud589 \uc911\uc778 \uc774\ubca4\ud2b8 \ub85c\uc9c1 \uc2a4\ucf00\uc904\uc744 \uc704\ud55c \uc2a4\ud06c\ub798\uce58 \ud328\ub4dc\uc774\uba70 \uc2e4\ud589 \uc2dc\uac04\uc5d0 \ub300\ud55c \uc720\uc6a9\ud55c \ud1b5\uacc4\ub3c4 \uc81c\uacf5\ud558\ubbc0\ub85c \uc77d\uae30 \uc804\uc6a9\uc73c\ub85c \ucde8\uae09\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>\uc774 \uc2dc\uc810\uc5d0\uc11c \uc6b0\ub9ac\ub294 \ub192\uc740 \uc218\uc900\uc758 \uc81c\uc5b4 \uc124\uacc4\ub97c \uac00\uc9c0\uace0 \uc788\uc9c0\ub9cc \uc81c\uc5b4 \uad6c\uc870\ub97c \ucc98\ub9ac\ud560 \ub85c\uc9c1\uc774 \ud544\uc694\ud558\uba70, \ubc14\ub85c \uc774 \uc9c0\uc810\uc5d0\uc11c Couchbase Eventing \uc11c\ube44\uc2a4, \ud2b9\ud788 Eventing \ud568\uc218\uac00 \uc791\ub3d9\ud569\ub2c8\ub2e4.<\/p>\n<h3>\uc774\ubca4\ud2b8 \ud568\uc218<\/h3>\n<p>\uc774 \ub514\uc790\uc778\uc5d0\ub294 \ub450 \uac1c\uc758 \uc774\ubca4\ud2b8 \ud568\uc218, \uc989 \uba54\uc778 \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \ud568\uc218 \"cron_impl_2func_651\"\uacfc \uc791\uc740 \ud5ec\ud37c \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \ud568\uc218 \"cron_impl_2func_651_help\"\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \ucd08\uae30 \uad6c\ud604\uc744 \uad6c\uc131\ud558\ub294 \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \ud568\uc218\uc758 \uac01 \uc139\uc158\uc740 \uc57d 610\uc904(\uc904 \uc911 \uc57d 441\uc904\uc740 \uc8fc\uc11d\uacfc \uacf5\ubc31)\uc758 \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \ucf54\ub4dc\ub97c \ud569\uce5c \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p><u>\uc9c0\uae08 \ubc14\ub85c \uc798\ub77c\ub0b4\uc5b4 \ubd99\uc5ec\ub123\uae30\uc5d0 \ub300\ud574 \uac71\uc815\ud558\uc9c0 \ub9c8\uc138\uc694.<\/u>\ub098\uc911\uc5d0 \ub450 \uac1c\uc758 \ud544\uc218 \uc774\ubca4\ud2b8 \ud568\uc218\uc640 \ubaa8\ub4e0 \ud544\uc218 \uc124\uc815\uc744 \"cron_impl_2func_651.json\" \"cron_impl_2func_651_help.json\"\uc774\ub77c\ub294 \ub450 \uac1c\uc758 \ud30c\uc77c\uc5d0 \ub2e4\uc6b4\ub85c\ub4dc(\uac00\uc838\uc624\uae30\uc6a9) \ub9c1\ud06c\ub97c \uc81c\uacf5\ud560 \uac83\uc774\uba70, \uc9c1\uc811 \uc798\ub77c \ubd99\uc5ec\ub123\uae30\ud560 \uc218 \uc788\ub294 \uc644\uc804\ud55c \ud1b5\ud569 \ud568\uc218 2\uac1c\ub97c \uc120\ud638\ud558\ub294 \uacbd\uc6b0 \uc774 \ub450 \uac1c\uc758 \ub9c1\ud06c\ub97c \uc81c\uacf5\ud560 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p>\uba54\uc778 \uc774\ubca4\ud2b8 \ud568\uc218 \"cron_impl_2func_651\"\uc740 9\uac1c\uc758 \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \ud568\uc218\ub85c \uad6c\uc131\ub429\ub2c8\ub2e4.<\/p>\n<ul>\n<li>\ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1 \ud568\uc218 3\uac1c(2\uac1c\ub294 \ube48 \uc178).\n<ul>\n<li>doCronActionA(doc) - \uc2e4\ud589\ud560 N1QL \uc608\uc81c \uc0ac\uc6a9\uc790 \uc791\uc5c5<\/li>\n<li>doCronActionB(doc) - \uc2e4\ud5d8\uc744 \uc704\ud55c \ube48 \uc0ac\uc6a9\uc790 \uc561\uc158 \uc178<\/li>\n<li>doCronActionC(doc) - \uc2e4\ud5d8\uc744 \uc704\ud55c \ube48 \uc0ac\uc6a9\uc790 \uc561\uc158 \uc178<\/li>\n<\/ul>\n<\/li>\n<li>\uc774\ubca4\ud2b8\uc5d0 \ub300\ud55c \ud558\ub098\uc758(1) \uc9c4\uc785\uc810.\n<ul>\n<li>OnUpdate(\ubb38\uc11c, \uba54\ud0c0) - \uc0bd\uc785 \ub610\ub294 \uc5c5\ub370\uc774\ud2b8\ub97c \uc704\ud55c \ud45c\uc900 \uc774\ubca4\ud2b8 \uc5d4\ud2b8\ub9ac \ud3ec\uc778\ud2b8\uc785\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<li>\ud558\ub098(1) <em>cron<\/em> \uad6c\ubb38 \ud30c\uc11c\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub2e4\uc74c \uc77c\uc815\uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4.\n<ul>\n<li>getNextRecurringDate(hour_str, min_str) - \ub2e4\uc74c \uc608\uc57d \ub0a0\uc9dc\ub97c \ucc3e\ub294 \ud06c\ub860 \ub85c\uc9c1\uc785\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<li>\ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc774 \uc874\uc7ac\ud558\ub294\uc9c0 \ud655\uc778\ud558\uac70\ub098 \uacb0\uacfc \uc11c\uc2dd\uc744 \uc9c0\uc815\ud558\ub294 \uc138 \uac00\uc9c0 \uc9c0\uc6d0 \uae30\ub2a5\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.\n<ul>\n<li>verifyFunctionExistsViaEval(curDoc, id) - \uc2e4\ud589\ud560 \ud568\uc218\uac00 \uc788\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4.<\/li>\n<li>toNumericFixed(\uc22b\uc790, \uc815\ubc00\ub3c4) - \ubd80\ub3d9 \uc18c\uc218\uc810\uc744 \ucf64\ud329\ud2b8\ud55c \uc2a4\ud0c0\uc77c\ub85c \ud3ec\ub9f7\ud569\ub2c8\ub2e4.<\/li>\n<li>toLocalISOTime(d) - \ub0a0\uc9dc\ub97c \uac04\uacb0\ud55c \uc2a4\ud0c0\uc77c\ub85c \ud3ec\ub9f7\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<li>\ud0c0\uc774\uba38\uac00 \uc2e4\ud589\ub420 \ub54c \ucf5c\ubc31 \ud568\uc218\uac00 \ud558\ub098(1) \uc788\uc2b5\ub2c8\ub2e4.\n<ul>\n<li>Callback(doc) - \uc608\uc57d\ub41c \ud0c0\uc774\uba38\ub97c \uc704\ud55c \ucf5c\ubc31 \ud568\uc218<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\ud5ec\ud37c \uc774\ubca4\ud2b8 \ud568\uc218 \"cron_impl_2func_651_help\"\ub294 \ud558\ub098\uc758(1) \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \ud568\uc218\ub85c \uad6c\uc131\ub429\ub2c8\ub2e4.<\/p>\n<ul>\n<li>\uc774\ubca4\ud2b8\uc5d0 \ub300\ud55c \ud558\ub098\uc758(1) \uc9c4\uc785\uc810.\n<ul>\n<li>OnUpdate(\ubb38\uc11c, \uba54\ud0c0) - \uc0bd\uc785 \ub610\ub294 \uc5c5\ub370\uc774\ud2b8\ub97c \uc704\ud55c \ud45c\uc900 \uc774\ubca4\ud2b8 \uc5d4\ud2b8\ub9ac \ud3ec\uc778\ud2b8\uc785\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\ub2e4\uc74c \uc139\uc158\uc5d0\uc11c\ub294 \uc704\uc758 \uac01 \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \ud568\uc218\ub97c \ud558\ub098\uc529 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>\uc8fc\uae30\uc801\uc778 \uc77c\uc815\uc5d0 \ub530\ub77c \uc2e4\ud589\ub418\ub294 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uacfc \uac19\uc740 \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \ud568\uc218\uac00 \ud544\uc694\ud569\ub2c8\ub2e4.<\/h3>\n<p>\uac00\uc7a5 \uba3c\uc800 \uc6d0\ud558\ub294 \uac83\uc740 \ud06c\ub860\ud0ed \uaddc\uce59\uc5d0 \ub530\ub77c \uc2e4\ud589\ud560 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc774 \uc788\ub294 \ub8e8\ud2f4 \ub610\ub294 \ud568\uc218\uc785\ub2c8\ub2e4.  \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \uba54\uc11c\ub4dc <strong>doCronActionA(doc)<\/strong>\ub77c\uace0 \ubd80\ub974\uc9c0\ub9cc, \uc608\ub97c \ub4e4\uc5b4 <em>doPeriodicLedgerBalance(doc),<\/em> \uc608\uc57d\ub41c \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \uad6c\ud604\ud558\ub294 '\uc561\uc158' \uae30\ub2a5\uc5d0 \ub300\ud55c \uc720\uc77c\ud55c \uc694\uad6c \uc0ac\ud56d\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4:<\/p>\n<ul>\n<li>\ud558\ub098\uc758 \ub9e4\uac1c\ubcc0\uc218\uac00 \uc788\uc2b5\ub2c8\ub2e4: doc, \uc704\uc5d0\uc11c \uc124\uba85\ud55c \uc720\ud615=\"recurring_event\"\uc758 \uc81c\uc5b4 \ubb38\uc11c.<\/li>\n<li>\uc2e4\uc81c \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \uc774\ub984\uc740 \uc81c\uc5b4 \ubb38\uc11c\uc758 'action' \ud544\ub4dc\uc640 \uc77c\uce58\ud569\ub2c8\ub2e4.<\/li>\n<li>\ubc18\ud658 <strong><em>true<\/em><\/strong> \uc131\uacf5\uacfc <em><strong>false<\/strong><\/em> \uc2e4\ud328 \uc2dc<\/li>\n<li>\ud65c\uc6a9 <em><strong>doc.verbose.user_func<\/strong><\/em> \ub85c\uae45\uc744 \uc81c\uc5b4\ud558\uae30 \uc704\ud574 0\uc774\uba74 \ubb34\uc74c, 1\uc774\uba74 \ud55c \uc904, 2\uc774\uba74 \ud568\uc218 \ub514\ubc84\uae45\uc5d0 \ud544\uc694\ud55c \ubaa8\ub4e0 \ub85c\uadf8 \uc815\ubcf4 \ub4f1\uc744 \ucd9c\ub825\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p>\ud568\uc218\ub97c \uc791\uc131\ud558\uaca0\uc2b5\ub2c8\ub2e4. <strong>doCronActionA(doc)<\/strong>)\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub0b4\uc7a5\ub41c N1QL \ucffc\ub9ac\ub97c \uc2e4\ud589\ud558\uc5ec \uad6d\uac00\ubcc4 \ud56d\uacf5\uc0ac \uc218\ub97c \uacb0\ud569\ud55c \ub2e4\uc74c \uacc4\uc0b0\ub41c \ub370\uc774\ud130\uc758 \ub2e8\uc77c KV \ubb38\uc11c\ub97c \ub9cc\ub4ed\ub2c8\ub2e4.<\/p>\n<pre class=\"striped:false wrap-toggle:false lang:sh highlight:0 decode:true\">SELECT country, count( * ) AS cnt FROM `travel-sample` WHERE `type` = 'airline' GROUP BY \uad6d\uac00;<\/pre>\n<p>\ub0b4 \ud14c\uc2a4\ud2b8 \uc2dc\uc2a4\ud15c\uc5d0\uc11c\ub294 \uc791\uc740 \ub2e8\uc77c \ub178\ub4dc \ube44<a href=\"https:\/\/docs.couchbase.com\/server\/6.5\/learn\/services-and-indexes\/services\/services.html#services-and-multi-dimensional-scaling\">MDS<\/a> \uc11c\ubc84(\ubaa8\ub4e0 Couchbase \uc11c\ube44\uc2a4 \uc2e4\ud589)\uc5d0\uc11c \uc704\uc758 N1QL\uc740 \uc57d 20ms\uac00 \uc18c\uc694\ub429\ub2c8\ub2e4. (\uba85\ud655\uc131\uc744 \uc704\ud574 \ub9e4\uc6b0 \ubcf5\uc7a1\ud558\ub2e4\uace0 \uac00\uc815\ud558\uba74 \uc644\ub8cc\ud558\ub294 \ub370 10\ucd08\uac00 \uac78\ub9bd\ub2c8\ub2e4).<\/p>\n<p>\uc5ec\uae30\uc11c \uc544\uc774\ub514\uc5b4\ub294 \ucffc\ub9ac \uc11c\ube44\uc2a4 \ub178\ub4dc\uc640\uc758 \ucd94\uac00 \uc624\ubc84\ud5e4\ub4dc \ud1b5\uc2e0\uc774\ub098 \uac01 \ubcc0\uc774\uc5d0 \ub300\ud55c N1QL \ubb38\uc744 \ucc98\ub9ac\ud558\uc9c0 \uc54a\uace0\ub3c4 \ucd08\ub2f9 10\ub9cc(\ub610\ub294 \ubc31\ub9cc) \uac1c\uc758 \uc774\ubca4\ud2b8 \ubcc0\uc774\uc5d0 \uc758\ud574 \ucd5c\uc885 \uacc4\uc0b0 \ubc0f \uc694\uc57d\ub41c KV \ubb38\uc11c\ub97c \ube60\ub974\uac8c \ub85c\ub4dc\ud560 \uc218 \uc788\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p>\uc774 \ud2b9\uc815 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc758 \ubaa9\ud45c\ub294 \ubd84\uba85\ud574\uc57c \ud569\ub2c8\ub2e4, <strong>doCronActionA(doc)<\/strong>\ub294 \uc77c\uc815\uc5d0 \ub530\ub77c \uc8fc\uae30\uc801\uc73c\ub85c \uc5c5\ub370\uc774\ud2b8\ub418\ub294 \ubc18\uc815\uc801 \uce90\uc2dc\ub97c \uc0dd\uc131\ud558\ub294 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p>\uc6b0\ub9ac\uac00 \uc2e4\uc81c\ub85c \ud558\ub294 \uc77c\uc740 \uc5ec\ud589 \uc0d8\ud50c \ubb38\uc11c \uc138\ud2b8\uc5d0\uc11c \uad6d\uac00\ubcc4 \ud56d\uacf5\uc0ac \uc218\ub97c \uac00\uc838\uc624\ub294 \uac83\ubfd0\uc785\ub2c8\ub2e4(\ub9e4\uc6b0 \ube60\ub985\ub2c8\ub2e4).  N1QL\uc744 \uc0ac\uc6a9\ud558\uba74\uc11c \ubb38\uc11c\ub97c \uc791\uc131\ud558\uace0 \ucd5c\uc885\uc801\uc73c\ub85c \uc694\uc57d\ub41c \ubb38\uc11c\ub85c KV\uc5d0 \uc791\uc131\ud569\ub2c8\ub2e4.   \uc5ec\uae30\uc11c \ud575\uc2ec\uc740 \uc218\ubc31\ub9cc \uac1c\uc758 \ubcc0\uc774\uc5d0 \ub300\ud574 \uac01\uac01 \ub3d9\uc77c\ud55c \uc791\uc5c5\uc744 \ubc18\ubcf5\ud558\uace0 \uc2f6\uc9c0 \uc54a\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4. \ud2b9\ud788 \uc77c\ubd80 \uacc4\uc0b0\uc740 \uc774\ubca4\ud2b8 \ud568\uc218\uc5d0\uc11c \uc784\ubca0\ub514\ub4dc N1QL \ucffc\ub9ac\ub97c \uc2dc\uc791\ud560 \ub54c\ub9c8\ub2e4 10\ucd08\uc758 \ucffc\ub9ac \uc11c\ube44\uc2a4 \uacc4\uc0b0 \uc2dc\uac04\uc774 \uac78\ub9b4 \uc218 \uc788\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4.<\/p>\n<p>\uc544\ub798\uc5d0\ub294 \ud558\ub8e8\uc5d0 \ud55c \ubc88(\ub610\ub294 \ud55c \uc2dc\uac04\uc5d0 \ud55c \ubc88 \ub4f1) \uc2e4\ud589\ud558\ub824\ub294 JavaScript \ud568\uc218\uac00 \ub098\uc640 \uc788\uc2b5\ub2c8\ub2e4.  \ud568\uc218 \uc774\ub984\uc740 \uc81c\uc5b4 \uad6c\uc870 \uc561\uc158 \ud544\ub4dc\uc5d0 \uc788\ub294 \uc774\ub984\uacfc \uc77c\uce58\ud569\ub2c8\ub2e4.  \uc774\ubca4\ud2b8 \uc6a9\uc5b4 \ubc0f \uc5b8\uc5b4 \uad6c\uc870\uc5d0 \ub300\ud55c \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 \ub2e4\uc74c\uc5d0\uc11c Couchbase \ubb38\uc11c \ubc0f \uc608\uc81c\ub97c \ucc38\uc870\ud558\uc138\uc694. <a href=\"https:\/\/docs.couchbase.com\/server\/6.5\/eventing\/eventing-overview.html\">\uc774\ubca4\ud2b8 \uc11c\ube44\uc2a4: \uae30\ubcf8 \uc0ac\ud56d<\/a>.<\/p>\n<pre class=\"toolbar-overlay:false nums:false lang:js decode:true\">function doCronActionA(doc) {\r\n  try {\r\n    \/\/ Check that doc has desired values\r\n    if (!doc.type || doc.type !== \"recurring_event\" || !doc.active || doc.active !== true) return;\r\n    if (doc.verbose.user_func &gt;= 1)\r\n      log(doc.action + ' user action controlled by ' + doc.type + '::' + doc.id);\r\n\r\n    \/\/ this is a 6.5 N1QL query (feature not available in GA prior to 6.5)\r\n    \/\/ Create an embedded N1QL iterator by issuing a SELECT statement to get the\r\n    \/\/ counts of airlines by country.  Make a new document and write it out to KV \r\n\r\n    \/\/ We will use the iterator to create a KV document representing the results of a\r\n    \/\/ HARD lengthy embedded N1QL query and write it back to KV, the idea is to keep\r\n    \/\/ a calculation up to date once a day such that it that can be read 'quickly' \r\n    \/\/ by other Eventing Functions, other Couchbase services or SDKs.   \r\n\r\n    \/\/ Consider if we had 1 million docs in a minute do we really want to use N1QL\r\n    \/\/ to recalculate something that is almost static for all 1 million documents, of \r\n    \/\/ course not, so we make an intermediate value that can be read into Eventing\r\n    \/\/ and used via a single 'light weight' KV read.\r\n\r\n    var q_iter = SELECT country,\r\n      count( * ) cnt\r\n    FROM `travel-sample`\r\n    WHERE `type` = 'airline'\r\n    GROUP BY country;\r\n\r\n    \/\/ loop through the result set and update the map 'accumulate'\r\n    var accumulate = {};\r\n    var idx = 0;\r\n    for (var val of q_iter) {\r\n      if (doc.verbose.user_func &gt;= 2)\r\n        log(doc.action + ' N1QL idx ' + idx + ', country ' + val.country + \" cnt \" + val.cnt);\r\n      accumulate[val.country] = val.cnt;\r\n      idx++;\r\n    }\r\n    \/\/ close out embedded N1QL iterator\r\n    q_iter.close();\r\n\r\n    \/\/ Now let\u2019s make a cached KV document representing a HARD length embedded N1QL\r\n    \/\/ query and write it back to KV, we need a KEY and a type and id and then we \r\n    \/\/ upsert it into the `travel-sample` bucket.\r\n\r\n    var cachedoc = {};\r\n    cachedoc.type = \"cron_cache\";\r\n    cachedoc.id = \"airlines_by_country\";\r\n    cachedoc.date = new Date();\r\n    cachedoc.data = accumulate;\r\n    var ckey = cachedoc.type + '::' + cachedoc.id;\r\n    ts_bkt[ckey] = cachedoc;\r\n    if (doc.verbose.user_func &gt;= 2) {\r\n      log(doc.action + ' upsert to KV with KEY ' + ckey + ' cachedoc ', cachedoc);\r\n    }\r\n  } catch (e) {\r\n    log(doc.action + ' Error exception:', e);\r\n    return false;\r\n  }\r\n  return true;\r\n}<\/pre>\n<p>\uc704\uc758 \ud568\uc218\ub294 1) \uc5ec\ud589 \uc0d8\ud50c \ubc84\ud0b7\uc744 \ucffc\ub9ac\ud558\uc5ec \ub370\uc774\ud130(\uc774 \uacbd\uc6b0 \uac01 \uad6d\uac00\ubcc4 \ud56d\uacf5\uc0ac \uc218)\ub97c \ucd94\ucd9c\ud558\uace0, 2) \uc0c8 KV \ubb38\uc11c\uc640 \ud0a4\ub97c \uc0dd\uc131\ud558\uc5ec \ub098\uc911\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \uc5ec\ud589 \uc0d8\ud50c \ubc84\ud0b7\uc5d0 \uae30\ub85d\ud558\uae30\ub9cc \ud558\uba74 \ub429\ub2c8\ub2e4.<\/p>\n<p>\ub610\ud55c \uc774 \uc608\uc81c\uc5d0\uc11c\ub294 \uc22b\uc790 \uc0c1\uc138 \uc815\ubcf4 \uc124\uc815\uc5d0 \uc751\ub2f5\ud558\ub294 \ub85c\uae45\uc744 \uad6c\ucd95\ud558\uc5ec, a) \uc81c\uc5b4 \ubb38\uc11c\uc5d0 doc.verbose.user_func == 1 \uac12\uc774 \uc788\ub294 \uacbd\uc6b0 \ud55c \uc904\uc744 \uae30\ub85d\ud558\uac70\ub098 b) doc.verbose.user_func \uac12\uc774 &gt;= 2\uc778 \uacbd\uc6b0 \ub354 \ub9ce\uc740 \uc815\ubcf4\ub97c \uae30\ub85d\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc774\uac83\uc740 \ud558\ub098(1)\ub97c \uc2e4\ud589\ud560 \uc218 \uc788\ub294 \uc77c\ubc18\uc801\uc778 \ud504\ub808\uc784\uc6cc\ud06c\uc785\ub2c8\ub2e4. <em>cron<\/em> \uc561\uc158 \ub610\ub294 \ucc9c(1000) \uac1c\uc758 <em>cron<\/em> \uc561\uc158. \ub530\ub77c\uc11c \uc55e\uc11c \uc9c0\uc801\ud55c \ub300\ub85c \ub450 \uac1c\uc758 \"\ube48\" \ud568\uc218 \uc178\uc744 \ucd94\uac00\ub85c \uc81c\uacf5\ud588\ub294\ub370, \uc774 \uc178\uc5d0\ub294 \uc544\ubb34 \uc774\ub984\ub3c4 \ubd99\uc77c \uc218 \uc5c6\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"toolbar-overlay:false nums:false lang:js decode:true\">function doCronActionB(doc) {\r\n  try {\r\n    \/\/ check that doc has desired values\r\n    if (doc.type !== \"recurring_event\" || doc.active !== true) return;\r\n    if (doc.verbose.user_func &gt;= 1)\r\n      log(doc.action + ' user action controlled by ' + doc.type + '::' + doc.id);\r\n\r\n    \/\/ YOUR LOGIC HERE\r\n\r\n  } catch (e) {\r\n    log(doc.action + ' Error exception:', e);\r\n    return false;\r\n  }\r\n  return true;\r\n}<\/pre>\n<p>\uadf8\ub9ac\uace0<\/p>\n<pre class=\"toolbar-overlay:false nums:false lang:js decode:true\">function doCronActionC(doc) {\r\n  try {\r\n    \/\/ check that doc has desired values\r\n    if (doc.type !== \"recurring_event\" || doc.active !== true) return;\r\n    if (doc.verbose.user_func &gt;= 1)\r\n      log(doc.action + ' user action controlled by ' + doc.type + '::' + doc.id);\r\n\r\n    \/\/ YOUR LOGIC HERE\r\n\r\n  } catch (e) {\r\n    log(doc.action + ' Error exception:', e);\r\n    return false;\r\n  }\r\n  return true;\r\n}<\/pre>\n<p>\uc704\uc758 doCronActionB \ubc0f doCronActionC \ud568\uc218\ub294 \uc774\ubca4\ud2b8 \ud568\uc218\uc758 \uc774\ubca4\ud2b8 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ub85c\uadf8\uc5d0 \uc815\ubcf4\ub97c \uae30\ub85d\ud558\uae30\ub9cc \ud558\ubbc0\ub85c \uc0ac\uc18c\ud55c \ud568\uc218\uc785\ub2c8\ub2e4.  \ub2e4\uc74c\uc744 \ucc38\uc870\ud558\uc138\uc694. <a href=\"https:\/\/docs.couchbase.com\/server\/6.5\/eventing\/eventing-debugging-and-diagnosability.html#logging-functions\">\ub85c\uae45 \uae30\ub2a5<\/a> \ub97c \ucc38\uc870\ud558\uc138\uc694. \ubb3c\ub860 \uc2e4\uc81c\ub85c \ud65c\uc131\ud654\ud558\uace0 \uc2e4\ud589\ud558\ub824\uba74 type=\"recurring_event\", active=true\uc758 \uc81c\uc5b4 \ubb38\uc11c\uc640 action = \"doCronActionB\" \uac19\uc740 \uc561\uc158\uc774 \ud544\uc694\ud569\ub2c8\ub2e4.<\/p>\n<h3>\uc774\ubca4\ud2b8 \uc9c4\uc785\uc810 \ub610\ub294 \ud578\ub4e4\ub7ec\uac00 \ud544\uc694\ud569\ub2c8\ub2e4.<\/h3>\n<p>\ubc84\uc804 6.5\ubd80\ud130 \uc774\ubca4\ud2b8 \uc11c\ube44\uc2a4\uc5d0\uc11c \uc9c0\uc6d0\ud558\ub294 \ub450 \uac00\uc9c0 \uc5d4\ud2b8\ub9ac \ud3ec\uc778\ud2b8 \ub610\ub294 \ud578\ub4e4\ub7ec\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4. <strong>\uc628\uc5c5\ub370\uc774\ud2b8(\ubb38\uc11c, \uba54\ud0c0)<\/strong> \uadf8\ub9ac\uace0 <strong>OnDelete(\uba54\ud0c0)<\/strong> \uc6b0\ub9ac\ub294 \uc624\uc9c1 <strong>\uc628\uc5c5\ub370\uc774\ud2b8(\ubb38\uc11c,\uba54\ud0c0)<\/strong> \uc774 \uc608\uc81c\uc5d0\uc11c\ub294<\/p>\n<p>\uadf8\ub9ac\uace0 <strong>\uc628\uc5c5\ub370\uc774\ud2b8(\ubb38\uc11c,\uba54\ud0c0)<\/strong> \ud578\ub4e4\ub7ec\ub294 \uc18c\uc2a4 \ubc84\ud0b7\uc758 \ubb38\uc11c\uac00 \uc0dd\uc131\ub418\uac70\ub098 \uc218\uc815(\ubcc0\uacbd)\ub420 \ub54c \ud638\ucd9c\ub418\uba70, \uad00\uc2ec \uc5c6\ub294 \ubb38\uc11c\ub97c \uc989\uc2dc \ud544\ud130\ub9c1\ud569\ub2c8\ub2e4. <a id=\"footnote_3\"><\/a><sup>[3]<\/sup><\/p>\n<pre class=\"toolbar-overlay:false nums:false lang:js decode:true\">function OnUpdate(doc, meta) {\r\n  \/\/ fix for 6.5.X growing bucket ops\r\n  if (doc.type === \"_tmp_vbs\") genNoopTimers(doc, meta, 30);\r\n  if (!cron_bkt[\"fix_timer_scan_issue::1\"]) {\r\n      cron_bkt[\"fix_timer_scan_issue::1\"] = {};\r\n  }\r\n    \r\n  try {\r\n    \/\/ Check if further analysis is needed we only trigger on an active recurring_event \r\n    if (doc.type !== \"recurring_event\" || doc.active !== true) return;\r\n\r\n    var update_doc = false;\r\n    if (!doc.dynamic) {\r\n      \/\/ Add if missing doc.dynamic with defaults\r\n      doc.dynamic = {\r\n        \"state\": \"arm\",\r\n        \"next_sched\": 0,\r\n        \"prev_sched\": 0,\r\n        \"prev_etime\": 0,\r\n        \"prev_delay\": 0,\r\n        \"prev_atime\": 0\r\n      };\r\n      \/\/ we need to update the document once we have the next schedule\r\n      update_doc = true;\r\n    }\r\n    if (!doc.verbose) {\r\n      \/\/ Add if missing doc.dynamic with defaults\r\n      doc.verbose = {\r\n        \"user_func\": 1,\r\n        \"scheduler\": 1\r\n      };\r\n      \/\/ we need to update the document once we have the next schedule\r\n      update_doc = true;\r\n    }\r\n    \/\/ Do not process dynamic.state pending\r\n    if (!doc.dynamic || !doc.dynamic.state || doc.dynamic.state === \"pending\") return;\r\n\r\n    var mid = doc.type + \"::\" + doc.id; \/\/ this is the same as meta.id or the KEY\r\n    var hour = doc.hour;\r\n    var min = doc.min;\r\n\r\n    \/\/ Do an eval check the JavaScript function exists. The eval occurs in a common \r\n    \/\/ utility function shared with RecurringCallback\r\n    if (!verifyFunctionExistsViaEval(doc, mid)) {\r\n      \/\/ doc.action did not exist, we have already logged the issue\r\n      return;\r\n    }\r\n\r\n    \/\/ Get the next valid execution time\r\n    var date_timer = getNextRecurringDate(hour, min);\r\n    var next_sched = Math.round(date_timer.getTime() \/ 1000);\r\n    if (!update_doc &amp;&amp; next_sched !== doc.dynamic.next_sched) {\r\n      \/\/ the next_sched should be the same as the setting from the helper application, however\r\n      \/\/ if we undeploy\/deploy or pause\/resume we might haver to reschedule to the next time slot\r\n      log('OnUpdate U ' + mid + ' calculated next_sched !== doc.dynamic.next_sched, delta ' +\r\n        (next_sched - doc.dynamic.next_sched) + ', reschedule');\r\n      update_doc = true;\r\n    }\r\n\r\n    if (update_doc) {\r\n      \/\/ this mutation is recursive and will be suppressed, we ensure we have a dynamic structure\r\n      doc.dynamic.next_sched = next_sched;\r\n\r\n      \/\/ rather then the call a function, to trap and retry if there is a resource issue\r\n      \/\/ cron_bkt[mid] = doc;\r\n      if (!tryBucketKvWriteWithLog('OnUpdate F', mid, doc)) {\r\n        \/\/ Failed to write doc to cron_bkt[key] the error has been logged\r\n        \/\/ and there is nothing more we can do.\r\n        return;\r\n      }\r\n    }\r\n\r\n    \/\/ Schedule an Eventing timer\r\n    var timer_id = createTimer(Callback, date_timer, null, doc);\r\n    if (doc.verbose.scheduler &gt;= 1) {\r\n      log('OnUpdate A ' + mid + ' rcv mutation (initial or rearm) schedule timer at ' +\r\n        toLocalISOTime(date_timer));\r\n    }\r\n    if (doc.verbose.scheduler &gt;= 2) {\r\n      log('OnUpdate B ' + mid + ' recurring timer was created, timer_id ' + timer_id);\r\n    }\r\n  } catch (e) {\r\n    log('OnUpdate E ' + meta.id + ', Error exception:', e);\r\n  }\r\n}<\/pre>\n<p>\uc5ec\uae30\uc11c \ud575\uc2ec\uc740 <em>cron<\/em> \ud578\ub4e4\ub7ec\uc758 \ub85c\uc9c1\uc740 doc.type\uc774 'recurring_event\uc774\uace0 doc.active\uac00 true\uc778 \ubb38\uc11c\uc5d0\ub9cc \uad00\uc2ec\uc744 \uac16\uc2b5\ub2c8\ub2e4.  \ub610\ud55c, \uc774 \uc608\uc81c\uc5d0\uc11c\ub294 <em>cron<\/em> \uc81c\uc5b4 \ubb38\uc11c\uc5d0 doc.verbose &gt;= 3 \uac12\uc774 \uc788\ub294 \uacbd\uc6b0\uc5d0\ub9cc \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ub85c\uadf8\uc5d0 \uae30\ub85d\ub418\ub294 \ud558\uc6b0\uc2a4\ud0a4\ud551 \ub85c\uc9c1\uc785\ub2c8\ub2e4.<\/p>\n<p>\uba87 \uac00\uc9c0 \uc77c\uc815\ub9cc \uc2e4\ud589\ud558\ub294 \uacbd\uc6b0 \uc0ac\uc6a9\uc790 \uacf5\uac04 \uc791\uc5c5\uc744 \ub044\uac70\ub098 \"<em>6.5.X \ubc84\ud0b7 \uc791\uc5c5 \uc99d\uac00\uc5d0 \ub300\ud55c \uc218\uc815 \uc0ac\ud56d<\/em>\"\ud06c\ub860_\uc784\ud50c_2func_651\"\uc5d0 \ub300\ud55c \uc704\uc758 OnUpdate \ube14\ub85d\uc5d0\uc11c \ub2e4\uc74c\uacfc \uac19\uc774 \ub124 \uc904\uc758 \ucf54\ub4dc\ub97c \uc8fc\uc11d\uc73c\ub85c \ucd94\uac00\ud569\ub2c8\ub2e4:<\/p>\n<pre class=\"toolbar-overlay:false lang:js decode:true\">function OnUpdate(doc, meta) {\r\n  \/\/ fix for 6.5.X growing bucket ops\r\n  \/\/ if (doc.type === \"_tmp_vbs\") genNoopTimers(doc, meta, 30);\r\n  \/\/ if (!cron_bkt[\"fix_timer_scan_issue::1\"]) {\r\n  \/\/     cron_bkt[\"fix_timer_scan_issue::1\"] = {};\r\n  \/\/ }\r\n<\/pre>\n<h3>6.5.X\uc5d0\uc11c \uc99d\uac00\ud558\ub294 \ubc84\ud0b7 \uc791\uc5c5\uc744 \ud574\uacb0\ud560 \uc218 \uc788\ub294 \ucf54\ub4dc\uac00 \ud544\uc694\ud569\ub2c8\ub2e4.<\/h3>\n<p>\ubc84\uc804 6.5.X\ubd80\ud130\ub294 \"<em>6.5.X \ubc84\ud0b7 \uc791\uc5c5 \uc99d\uac00\uc5d0 \ub300\ud55c \uc218\uc815 \uc0ac\ud56d<\/em>\"\ub77c\ub294 \ud0c0\uc774\uba38\uac00 \ud5a5\ud6c4 \uc608\uc57d\ub41c \ub9ce\uc740 \ud0c0\uc774\uba38\uac00 \uc788\ub294 \uc720\ud734 \uc2dc\uc2a4\ud15c\uc5d0\uc11c \ubc1c\uc0dd\ud569\ub2c8\ub2e4.  \uc774 \ucf54\ub4dc\ub294 \uc774\ubca4\ud2b8 \ud0c0\uc774\uba38\uac00 vBucket\uc5d0\uc11c \ucd5c\uadfc\uc5d0 \uc2e4\ud589\ub418\uc5c8\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4(\uae30\ub2a5\ubcc4\ub85c \uc9c0\uc815\ub41c vBucket\uc758 \ubb38\uc81c\ub97c \ud574\uacb0\ud569\ub2c8\ub2e4).<\/p>\n<pre class=\"toolbar-overlay:false nums:false lang:js decode:true\">\/\/ FIXUP: ADDIN FUNCTON\r\nfunction noopTimer(context) {\r\n    \/\/ fix for 6.5.X growing bucket ops\r\n    try {\r\n        if (context.type === \"_tmp_vbs\" &amp;&amp; context.vb === 0) { \r\n            \/\/ log(\"noopTimer timers firing, printing only for vBucket 0\");\r\n        }\r\n    } catch (e) {\r\n        log(\"OnUpdate Exception in callback noopTimer:\", e);\r\n    }\r\n}\r\n\r\n\/\/ FIXUP: ADDIN FUNCTON\r\nfunction rearmTimer(context) {\r\n    \/\/ fix for 6.5.X growing bucket ops\r\n    try {\r\n        if (context.type === \"_tmp_vbs\" &amp;&amp; context.vb === 0) { \r\n            \/\/ Update\/touch all docs in the helper_bucket the helper function will then\r\n            \/\/ mutate all 1024 of type == vbs_seed (64 on MacOS) to create a recuring cycle.\r\n            \/\/ log(\"noopTimer timer fired all 1024 vBuckets, logging only vb 0\", context);\r\n            \r\n            \/\/ generate a mutation to re-arm the HELPER function: fix_scan_issue\r\n            \/\/ which will in turn make new mutations for this Function\r\n            var cur = cron_bkt[context.key];\r\n            if (cur &amp;&amp; cur.ts_millis === context.ts_millis) {\r\n                \/\/ log(\"rearmTimer update fix_timer_scan_issue::1 in helper_bucket alias only for vBucket 0\");\r\n                var now = new Date();\r\n                cron_bkt[\"fix_timer_scan_issue::1\"] = { \"last_update\": now };\r\n            } else {\r\n                \/\/ NOOP we had multiple timer cycles, just let this one quietly stop.\r\n            }\r\n        }\r\n    } catch (e) {\r\n        log(\"OnUpdate Exception in callback rearmTimer:\", e);\r\n    }\r\n}\r\n\r\n\/\/ FIXUP: ADDIN FUNCTON\r\nfunction genNoopTimers(doc, meta, seconds) {\r\n    \/\/ fix for 6.5.X growing bucket ops\r\n    try {\r\n        \/\/ redundant but play it safe\r\n        if (doc.type === \"_tmp_vbs\") {\r\n            \/\/ Since we are using an different function a timer on all our vBuckets do immeadiately (can take up to 15 seconds)\r\n            \/\/ If we used cross bucket recursion to rearm all the timers in a recurring fashion we would add a delay of at least 40 seconds.\r\n            createTimer(noopTimer, new Date(), null, doc);\r\n            if (doc.vb === 0) { \r\n                \/\/ Update\/touch all docs in the helper_bucket the helper function will then\r\n                \/\/ mutate all 1024 of type == vbs_seed (64 on MacOS) to create a recuring cycle.\r\n                \/\/ log(\"noopTimer timer fired all 1024 vBuckets, logging only vb 0\", context);\r\n            \r\n                \/\/ generate a mutation to re-arm the HELPER function: fix_scan_issue\r\n                \/\/ which will in turn make new mutations for this Function\r\n                \r\n                \/\/ log(\"genNoopTimers make timer to rearm fix_timer_scan_issue::1\");\r\n                createTimer(rearmTimer, new Date(new Date().getTime() + seconds * 1000), null, doc);\r\n            }\r\n        }\r\n    } catch (e) {\r\n        log(\"OnUpdate Exception in genNoopTimers:\", e);\r\n    }\r\n}<\/pre>\n<h3>\u00a0\uc77c\uc815\uc758 \ub2e4\uc74c \uc2dc\uac04\uc744 \uacc4\uc0b0\ud558\ub294 \uc720\ud2f8\ub9ac\ud2f0\uac00 \ud544\uc694\ud569\ub2c8\ub2e4.<\/h3>\n<p>\ub2e4\uc74c \ud568\uc218 getNextRecurringDate(\uc2dc\uac04, \ubd84)\ub294 \uc77c\uc815\uc758 \uc77c\ubd80\ub85c \uc815\uc758\ub41c \ub300\ub85c \uc791\uc5c5\uc744 \uc2e4\ud589\ud560 \uc2dc\uac04\uc744 \uacb0\uc815\ud569\ub2c8\ub2e4.  \uc774\uac83\uc740 <em>cron<\/em>\ub300\uc2e0 \ud558\ub8e8\uc5d0 \ud55c \ubc88, \ud55c \uc2dc\uac04\uc5d0 \ud55c \ubc88, 1\ubd84\uc5d0 \ud55c \ubc88 \uc2e4\ud589\ud558\ub294 \uc8fc\uc694 \ud45c\uc900 \uae30\ub2a5\uc774 \ud3ec\ud568\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.  \ub610\ud55c 1\ubd84\uc5d0 \ub450 \ubc88 \ub610\ub294 1\ubd84\uc5d0 \ub124 \ubc88 \uc2e4\ud589\ud558\ub294 \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\uae30 \uc704\ud55c \ube44\ud45c\uc900 \uad6c\ubb38\ub3c4 \ud3ec\ud568\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc55e\uc11c \uae30\ub2a5\uc5d0 \ub300\ud574 \uc124\uba85\ud55c \uac83\ucc98\ub7fc <strong>\ub2e4\uc74c \ubc18\ubcf5 \ub0a0\uc9dc(\uc2dc\uac04, \ubd84)<\/strong> \ub294 \ub2e4\uc74c\uc744 \ud5c8\uc6a9\ud558\uba70(\ud45c\ub294 \uc544\ub798\uc5d0 \uc911\ubcf5\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4), \ub9c8\uc9c0\ub9c9 \ub450 \uac1c\ub294 \ube44\ud45c\uc900\uc785\ub2c8\ub2e4.<a id=\"footnote_4\"><\/a><sup>[4]<\/sup><\/p>\n<table style=\"width: 100%;border: 1px solid #456789;padding: 1px;font-size: 80%;margin-bottom: 26px\">\n<tbody>\n<tr>\n<th style=\"padding: 4px;font-weight: bold;border-bottom: solid 1px\" width=\"60\">\uc2dc\uac04<\/th>\n<th style=\"padding: 4px;font-weight: bold;border-bottom: solid 1px\" width=\"72\">\ubd84<\/th>\n<th style=\"padding: 4px;font-weight: bold;border-bottom: solid 1px\" width=\"510\">\uac12\uc740 \uc22b\uc790 \ub610\ub294 \ubb38\uc790\uc5f4\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/th>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\" width=\"60\">13<\/td>\n<td style=\"padding: 4px\" width=\"72\">32<\/td>\n<td style=\"padding: 4px\" width=\"510\">13:32(\ub610\ub294 \uc624\ud6c4 1\uc2dc 32\ubd84) \uc2e4\ud589<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\" width=\"60\">*<\/td>\n<td style=\"padding: 4px\" width=\"72\">15<\/td>\n<td style=\"padding: 4px\" width=\"510\">\ub9e4\uc2dc\uac04 15\ubd84 \uacbd\uacfc \uc2dc \uc2e4\ud589<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\" width=\"60\">8<\/td>\n<td style=\"padding: 4px\" width=\"72\">12<\/td>\n<td style=\"padding: 4px\" width=\"510\">\ud558\ub8e8\uc5d0 \ud55c \ubc88 8\uc2dc 32\ubd84(\ub610\ub294 \uc624\uc804 8\uc2dc 32\ubd84)\uc5d0 \uc2e4\ud589\ud569\ub2c8\ub2e4.<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\" width=\"60\">*<\/td>\n<td style=\"padding: 4px\" width=\"72\">*<\/td>\n<td style=\"padding: 4px\" width=\"510\">1\ubd84\uc5d0 \ud55c \ubc88 \uc2e4\ud589<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\" width=\"60\">*2X<\/td>\n<td style=\"padding: 4px\" width=\"72\">*2X<\/td>\n<td style=\"padding: 4px\" width=\"510\">1\ubd84\uc5d0 \ub450 \ubc88 \uc2e4\ud589 - \uc2dc\uc640 \ubd84\uc744 \ubaa8\ub450 \"*2X\"\ub85c \uc124\uc815\ud574\uc57c \ud569\ub2c8\ub2e4.<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 4px\" width=\"60\">*4X<\/td>\n<td style=\"padding: 4px\" width=\"72\">*4X<\/td>\n<td style=\"padding: 4px\" width=\"510\">1\ubd84\uc5d0 4\ubc88 \uc2e4\ud589 - \uc2dc\uc640 \ubd84\uc744 \ubaa8\ub450 \"*2X\"\ub85c \uc124\uc815\ud574\uc57c \ud569\ub2c8\ub2e4.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\ub2e4\uc74c\uc740 \uccab \ubc88\uc9f8 \uc608\uc81c\uc758 \uc0ac\uc6a9\uc790 \ub85c\uc9c1\uc5d0\uc11c \uc2a4\ucf00\uc904\uc5d0\uc11c \uc774\ubca4\ud2b8 \ud0c0\uc774\uba38\ub97c \ud2b8\ub9ac\uac70\ud560 \ub2e4\uc74c \uc2dc\uac04\uc744 \uacb0\uc815\ud558\ub294 \ub370 \ud544\uc694\ud55c \ub85c\uc9c1\uc758 \uad6c\ud604\uc785\ub2c8\ub2e4. <strong>doCronActionA(doc) <\/strong>\uac00 \uc2e4\uc2dc\uac04 \uc624\ubc84\ub7f0 \ub4f1\uc758 \uc774\uc720\ub85c \uc81c\ub54c \uc644\ub8cc\ub418\uc9c0 \uc54a\uc73c\uba74 \ub2e4\uc74c \uc2a4\ucf00\uc904\uc774 \uc120\ud0dd\ub429\ub2c8\ub2e4.  \ud0c0\uc774\uba38\uc640 \uadf8 \ubd80\ubaa8 \ud568\uc218\ub97c \ubaa8\ub450 \uc8fc\ubaa9\ud558\uc138\uc694. \ub530\ub77c\uc11c \uc774\ubca4\ud2b8 \ud568\uc218\uc758 \uae30\ubcf8 \uc2e4\ud589 \uc2dc\uac04 \uc81c\ud55c\uc774 60\ucd08\uc778 \uacbd\uc6b0, \ud544\uc694\ud55c \uacbd\uc6b0 \uc774 \uc124\uc815\uc744 \uc870\uc815\ud558\uac70\ub098 \ub192\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"toolbar-overlay:false nums:false lang:js decode:true\">function getNextRecurringDate(hour_str, min_str) {\r\n  \/\/ Note Javascript Dates are in milliseconds\r\n  var date_now = new Date();\r\n  var date_ret = new Date();\r\n  var hour;\r\n  var min;\r\n\r\n  try {\r\n    hour = parseInt(hour_str);\r\n  } catch (e) {}\r\n  try {\r\n    min = parseInt(min_str);\r\n  } catch (e) {}\r\n\r\n  \/\/ Note, this is only a simplistic partial 'crontab' syntax with some slight extensions\r\n  \/\/ it allows once a day, once an hour, once a minute.  It also contains some non-standard \r\n  \/\/ syntax to provide the ability to execute twice a minute or four times a minute.\r\n\r\n  if (hour_str === '*4X' &amp;&amp; min_str === '*4X') {\r\n    \/\/ once every 15 seconds or four times a minute\r\n    date_ret.setMilliseconds(0);\r\n    date_ret.setSeconds(15);\r\n    while (date_ret.getTime() &lt; date_now.getTime()) {\r\n      date_ret.setSeconds(date_ret.getSeconds() + 15);\r\n    }\r\n    return date_ret;\r\n  } else\r\n  if (hour_str === '*2X' &amp;&amp; min_str === '*2X') {\r\n    \/\/ once every 30 seconds or twice a minute\r\n    date_ret.setMilliseconds(0);\r\n    date_ret.setSeconds(30);\r\n    while (date_ret.getTime() &lt; date_now.getTime()) {\r\n      date_ret.setSeconds(date_ret.getSeconds() + 30);\r\n    }\r\n    return date_ret;\r\n  } else\r\n  if (hour_str === '*' &amp;&amp; min_str === '*') {\r\n    \/\/ once a minute \r\n    date_ret.setMilliseconds(0);\r\n    date_ret.setSeconds(0);\r\n    date_ret.setMinutes(date_ret.getMinutes() + 1);\r\n  } else\r\n  if (hour_str !== '*' &amp;&amp; isNaN(hour) === false &amp;&amp; min_str === '*') {\r\n    \/\/ once a minute only for a given hour\r\n    date_ret.setMilliseconds(0);\r\n    date_ret.setSeconds(0);\r\n    date_ret.setMinutes(date_ret.getMinutes() + 1);\r\n    if (date_ret.getTime() &lt; date_now.getTime()) { date_ret.setHours(hour); } if (date_ret.getTime() &gt; date_now.getTime()) {\r\n      date_ret.setDate(date_ret.getDate() + 1);\r\n      date_ret.setSeconds(0);\r\n      date_ret.setMinutes(0);\r\n      date_ret.setHours(hour);\r\n    }\r\n  } else\r\n  if (hour_str === '*' &amp;&amp; min_str !== '*' &amp;&amp; isNaN(min) === false) {\r\n    \/\/ once a hour at a given minute\r\n    date_ret.setMilliseconds(0);\r\n    date_ret.setSeconds(0);\r\n    date_ret.setMinutes(min);\r\n    \/\/ schedule for next hour\r\n    date_ret.setHours(date_ret.getHours() + 1);\r\n  } else\r\n  if (isNaN(hour) === false &amp;&amp; isNaN(min) === false) {\r\n    \/\/ once a day for a given hour and a given minute \r\n    date_ret.setMilliseconds(0);\r\n    date_ret.setSeconds(0);\r\n    date_ret.setMinutes(min);\r\n    date_ret.setHours(hour);\r\n    if (date_ret.getTime() &lt; date_now.getTime()) {\r\n      \/\/ schedule for tomorrow\r\n      date_ret.setDate(date_ret.getDate() + 1);\r\n    }\r\n  } else {\r\n    log('getNextRecurringDate illegal input hour_str &lt;' + hour_str + '&gt; min_str &lt;' + min_str + '&gt;');\r\n    throw new Error('getNextRecurringDate illegal input hour_str &lt;' + hour_str + '&gt; min_str &lt;' + min_str + '&gt;');\r\n    return null;\r\n  }\r\n  return date_ret;\r\n}<\/pre>\n<h3>\uba87 \uac00\uc9c0 \uc791\uc740 \uc720\ud2f8\ub9ac\ud2f0\uac00 \ud544\uc694\ud569\ub2c8\ub2e4.<\/h3>\n<p>\uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8\uc758 \uc874\uc7ac \uc5ec\ubd80\ub9cc \ud655\uc778\ud558\ub294 \uacf5\ud1b5 \uc720\ud2f8\ub9ac\ud2f0 \ud568\uc218\ub294 \ub450 \uac00\uc9c0 \ubaa8\ub450\uc5d0\uc11c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. <strong>\uc628\uc5c5\ub370\uc774\ud2b8(\ubb38\uc11c,\uba54\ud0c0), <\/strong>\uc640 \ud0c0\uc774\uba38 <strong>\ucf5c\ubc31(\ubb38\uc11c), <\/strong>\ub098\uc911\uc5d0 \ud45c\uc2dc\ub429\ub2c8\ub2e4.  \uc544\ub798\ub294 <strong>verifyFunctionExistsViaEval(curDoc, id) <\/strong>\ub294 \ub450 \uac1c\uc758 \uc778\uc790\ub85c JSON \uc81c\uc5b4 \ubb38\uc11c\uc640 \ud574\ub2f9 \ubb38\uc11c\uc758 KEY\ub97c \ubc1b\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\ub97c \ud1b5\ud574 \ubc30\ud3ec \uc2dc JSON \uc81c\uc5b4 \ub808\ucf54\ub4dc \ubb38\uc11c\uc640 JavaScript \ucf54\ub4dc\uc758 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1 \ud568\uc218\uc758 \uc2e4\uc81c \uc774\ub984 \uac04\uc5d0 \uba85\uba85 \ubd88\uc77c\uce58 \ubb38\uc81c\uac00 \uc788\ub294 \uacbd\uc6b0 \uc989\uc2dc \uc54c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"toolbar-overlay:false nums:false lang:js decode:true\">function verifyFunctionExistsViaEval(curDoc, id) {\r\n  var result = false;\r\n  try {\r\n    \/\/ check for function if missing this is invalid return result\r\n    result = eval(\"typeof \" + curDoc.action + \" === 'function';\");\r\n    if (result === false) {\r\n      if (curDoc.verbose.scheduler &gt;= 1)\r\n        log(\"Warn\/Disable (No Action and No Re-Arm), because required 'action' of \" +\r\n          curDoc.action + \"(doc) does not exist, id is\", id);\r\n      return result;\r\n    }\r\n  } catch (e) {\r\n    log('verifyFunctionExistsViaEval Error exception:', e);\r\n  }\r\n  return result;\r\n}<\/pre>\n<p>\uc874\uc7ac\ud558\uc9c0 \uc54a\ub294 \ud568\uc218\ub97c \uc2e4\ud589\ud558\ub824\uace0 \uc2dc\ub3c4\ud558\uba74 \ucd5c\uc885 \uc0ac\uc6a9\uc790\uc5d0\uac8c \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ub85c\uadf8\uc5d0 \uacbd\uace0\uac00 \ud45c\uc2dc\ub429\ub2c8\ub2e4. <em>cron_impl_2func_651.log<\/em> \u00a0\ub97c \ud074\ub9ad\ud574 \ubb38\uc81c\ub97c \ud574\uacb0\ud558\uc138\uc694.<\/p>\n<p style=\"border: 1px solid black;max-width: 1000px;padding: 4px;font-size: 60%\">2020-04-22T16:20:38.725-07:00 [INFO] \"\uacbd\uace0\/\ube44\ud65c\uc131\ud654(\ub3d9\uc791 \uc5c6\uc74c \ubc0f \uc7ac\uc554\ud638\ud654 \uc5c6\uc74c), doCronMyNewFunction(doc)\uc758 \ud544\uc218 '\ub3d9\uc791'\uc774 \uc874\uc7ac\ud558\uc9c0 \uc54a\uc73c\ubbc0\ub85c ID\ub294\"\"recurring_event::1\"\"\uc785\ub2c8\ub2e4.<\/p>\n<p>\uc774 \uc218\uc815\uc740 \uc77c\uc2dc \uc911\uc9c0\/\uc7ac\uc2dc\uc791\uc744 \ud1b5\ud574 \ud568\uc218\ub97c \ucd94\uac00\ud55c \ub2e4\uc74c \uc9c0\uc815\ub41c ID \ub610\ub294 KEY\ub85c \uc81c\uc5b4 \ubb38\uc11c\ub97c \uc870\uc815\ud558\uac70\ub098(\ud1a0\uae00\uc744 \ud65c\uc131\ud654\ud558\uc5ec \uac70\uc9d3\uc5d0\uc11c \ucc38\uc73c\ub85c \uc804\ud658), \ud578\ub4e4\ub7ec\uc758 \uae30\uc874 \ud568\uc218\ub97c \uac00\ub9ac\ud0a4\ub3c4\ub85d \uc81c\uc5b4 \ubb38\uc11c\ub97c \uc870\uc815\ud558\uc5ec \uc218\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\uc74c \uc720\ud2f8\ub9ac\ud2f0 <strong>toNumericFixed(\uc22b\uc790, \uc815\ubc00\ub3c4)<\/strong> \ub97c \uc0ac\uc6a9\ud558\uba74 \ub85c\uadf8 \uba54\uc2dc\uc9c0\uc758 \ud50c\ub85c\ud2b8 \ud615\uc2dd\uc744 \uac04\uacb0\ud558\uac8c \uc9c0\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"\">function toNumericFixed(number, precision) {\r\n  var multi = Math.pow(10, precision);\r\n  return Math.round((number * multi).toFixed(precision + 1)) \/ multi;\r\n}<\/pre>\n<p>\ub9c8\uc9c0\ub9c9\uc73c\ub85c, \uc720\ud2f8\ub9ac\ud2f0 <strong>toLocalISOTime(d)<\/strong> \ub85c\uadf8 \uba54\uc2dc\uc9c0\uc758 \ub0a0\uc9dc \uc11c\uc2dd\uc744 \uac04\uacb0\ud558\uac8c \uc9c0\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"\">function toLocalISOTime(d) {\r\n  var tzoffset = (new Date()).getTimezoneOffset() * 60000; \/\/offset in milliseconds\r\n  return (new Date(d.getTime() - tzoffset)).toISOString().slice(0, -1);\r\n}<\/pre>\n<h3>\uc0ac\uc6a9\uc790 \ub85c\uc9c1\uc744 \uc2e4\ud589\ud558\uace0 \ud0c0\uc774\uba38\ub97c \uc7ac\uc7a5\uc804\ud558\ub824\uba74 \ud0c0\uc774\uba38 \ucf5c\ubc31\uc774 \ud544\uc694\ud569\ub2c8\ub2e4.<\/h3>\n<p>\"cron_impl_2func_651\"\uc758 \ub9c8\uc9c0\ub9c9 JavaScript \ud568\uc218\ub294 \uc608\uc57d\ub41c \ud0c0\uc774\uba38\uac00 \uc2e4\ud589\ub420 \ub54c \ud638\ucd9c\ub418\ub294 \ud0c0\uc774\uba38 \ucf5c\ubc31\uc785\ub2c8\ub2e4. \ucf5c\ubc31 \ud568\uc218\ub294 \ucee8\ud14d\uc2a4\ud2b8\ub77c\ub294 \ub2e8\uc77c \uc778\uc218\ub97c \ubc1b\ub294 \ucd5c\uc0c1\uc704 \ud568\uc218\uc5ec\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>\uc774 \uacbd\uc6b0 OnUpdate \ud578\ub4e4\ub7ec\uc5d0\uc11c \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \ud568\uc218\uc778 <strong>\ucf5c\ubc31(\ubb38\uc11c)<\/strong> \ubb38\uc11c(\ud65c\uc131 \uc2a4\ucf00\uc904\ub7ec \uc81c\uc5b4 \ubb38\uc11c \uc720\ud615=\"recurring_event\")\uc758 \ucee8\ud14d\uc2a4\ud2b8\uac00 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ubc84\uc804 6.6\uc5d0\uc11c\ub294 \ud0c0\uc774\uba38 \ub0b4\uc5d0 \ub2e4\ub978 \ud0c0\uc774\uba38\ub97c \ub9cc\ub4e4 \uc218 \uc788\uc9c0\ub9cc \uc774\uc804 \ubc84\uc804\uc5d0\uc11c\ub294 \ubaa8\ub450 \"\ud5ec\ud37c\" \ud568\uc218\ub85c\uc758 \ubcc0\ud615\uc744 \ud2b8\ub9ac\uac70\ud574\uc57c \ud569\ub2c8\ub2e4(\ubb34\ud55c \uc7ac\uadc0\ub97c \uc870\uc2ec\uc2a4\ub7fd\uac8c \ud53c\ud569\ub2c8\ub2e4).  6.6\uc5d0\uc11c\ub294 \ud5ec\ud37c \ud568\uc218\uac00 \ud544\uc694\ud558\uc9c0 \uc54a\uc73c\uba70 \ub85c\uc9c1\uc774 \uc0c1\ub2f9\ud788 \ub2e8\uc21c\ud654\ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"toolbar-overlay:false nums:false lang:js decode:true\">function Callback(doc) {\r\n  try {\r\n    var fired_at = new Date();\r\n\r\n    \/\/ Check if further analysis is needed we only trigger on a recurring_event that is active\r\n    if (doc.type !== \"recurring_event\") return;\r\n    \/\/ doc must have 'action', 'dynamic {}', verbose {}, dynamic.state\r\n    if (!doc.action || !doc.dynamic || !doc.verbose || !doc.dynamic.state) return;\r\n    \/\/ process any doc.dynamic.state BUT pending \r\n    if (doc.dynamic.state === \"pending\") return;\r\n\r\n    \/\/ ==================\r\n    \/\/ Check if still active\r\n\r\n    \/\/ We make sure that in KV the 'doc' still exists and that it is still active if not just \r\n    \/\/ return thus skipping the action and not Re-arming the timer. Note `travel-sample` is \r\n    \/\/ aliased to the map 'cron_bkt\r\n\r\n    var mid = doc.type + '::' + doc.id; \/\/ make our KEY\r\n    var curDoc = null;\r\n    try {\r\n      \/\/ read the current version of doc from KV, e.g. curDoc\r\n      curDoc = cron_bkt[mid];\r\n    } catch (e) {} \/\/ needed for pre 6.5, note pure 6.5+ deployment returns null sans exception\r\n\r\n    var reason = null;\r\n    if (!curDoc || curDoc === null) {\r\n      reason = \"cron document is missing\";\r\n    } else\r\n    if (!curDoc.active) {\r\n      reason = \"cron document has active = false\";\r\n    } else\r\n    if (!curDoc.dynamic.state || curDoc.dynamic.state !== doc.dynamic.state) {\r\n      reason = \"cron document wrong dynamic.state expected \" + doc.dynamic.state;\r\n    } else\r\n    if (crc64(doc) !== crc64(curDoc)) {\r\n      reason = \"cron document changed\";\r\n    }\r\n\r\n    if (reason !== null) {\r\n      if (!curDoc || curDoc === null || curDoc.verbose.scheduler &gt;= 1) {\r\n        log('Callback X ' + mid + \" ignore\/stop this timer's schedule because \" + reason);\r\n      }\r\n      if (!curDoc || curDoc === null || curDoc.verbose.scheduler &gt;= 4) {\r\n        log('Callback Y ' + mid + ' timer doc', doc);\r\n        log('Callback Z ' + mid + ' KV curDoc', curDoc);\r\n      }\r\n      return;\r\n    }\r\n\r\n    \/\/ ==================\r\n    \/\/ Verify user routine exists and if so eval it \r\n\r\n    \/\/ Assume curDoc.action contains something like \"doCronActionA\" and we have a function in \r\n    \/\/ this handler like \"doCronActionA(doc)\". Below we use curDoc as the end user should be \r\n    \/\/ able to alter the eval'd JavaScript function.  We will execute two (2) evals.\r\n\r\n    \/\/ First eval check the JavaScript function exists.  The eval occurs in a common \r\n    \/\/ utility function shared with Callback\r\n    if (!verifyFunctionExistsViaEval(curDoc, mid)) {\r\n      \/\/ curDoc.action did not exist, we have already logged the issue\r\n      return;\r\n    }\r\n\r\n    \/\/ Second eval execute and process the user function we execute the defined function \r\n    \/\/ with an argument of curDoc\r\n    var beg_act = new Date();\r\n    var result = null;\r\n    eval(\"result = \" + curDoc.action + \"(curDoc);\");\r\n    var end_act = new Date();\r\n    var atime_ms = end_act.getTime() - beg_act.getTime();\r\n\r\n    if (curDoc.verbose.scheduler &gt;= 2)\r\n      log('Callback R ' + mid + ' action took ' + toNumericFixed((atime_ms \/ 1000), 3) +\r\n        ' sec., returned ' + result);\r\n\r\n    \/\/ ==================\r\n    \/\/ Calculate next time and mutate the control document for our our helper function\r\n    \/\/ which will create another mutation such that OnUpdate of this function will pick\r\n    \/\/ it up and generate the timer (avoids the MB-38554 issue).\r\n\r\n    var hour = curDoc.hour;\r\n    var min = curDoc.min;\r\n    var date_timer = getNextRecurringDate(hour, min);\r\n\r\n    curDoc.dynamic.prev_delay =\r\n      toNumericFixed(((fired_at.getTime() \/ 1000) - curDoc.dynamic.next_sched), 3);\r\n    curDoc.dynamic.prev_sched = curDoc.dynamic.next_sched;\r\n    curDoc.dynamic.prev_etime = Math.round(fired_at.getTime() \/ 1000);\r\n    curDoc.dynamic.prev_atime = toNumericFixed((atime_ms \/ 1000), 3);\r\n\r\n    curDoc.dynamic.state = \"pending\";\r\n    curDoc.dynamic.next_sched = Math.round(date_timer.getTime() \/ 1000);\r\n    \r\n    try {\r\n      cron_bkt[mid] = curDoc;\r\n    } catch (e) {\r\n      log('Callback help: F ' + mid + ' FATAL could not update KV cron cycle ' + curDoc.action);\r\n      return;\r\n    }\r\n\r\n    if (curDoc.verbose.scheduler &gt;= 1) {\r\n      log('Callback A ' + mid + ' gen mutation #1 to doc to force schedule rearm at ' +\r\n        toLocalISOTime(date_timer));\r\n    }\r\n    if (curDoc.verbose.scheduler &gt;= 2) {\r\n      log('Callback B ' + mid + ' sched ' + curDoc.dynamic.prev_sched +\r\n        ', actual ' + curDoc.dynamic.prev_etime +\r\n        ', delay ' + curDoc.dynamic.prev_delay +\r\n        ', took ' + curDoc.dynamic.prev_atime);\r\n    }\r\n    if (curDoc.verbose.scheduler &gt;= 3) {\r\n      log('Callback C ' + mid + ' curDoc', curDoc);\r\n    }\r\n  } catch (e) {\r\n    var mid = doc.type + '::' + doc.id; \/\/ make our KEY\r\n    log('Callback E ' + mid + ' Error exception:', e);\r\n  }\r\n}<\/pre>\n<h3>\uc0c8\ub85c\uc6b4 \ub3cc\uc5f0\ubcc0\uc774\ub97c \ud2b8\ub9ac\uac70\ud558\ub294 \ub3c4\uc6b0\ubbf8 \ud568\uc218\uac00 \ud544\uc694\ud569\ub2c8\ub2e4.<\/h3>\n<p>6.6(\uc544\uc9c1 \ub9b4\ub9ac\uc988\ub418\uc9c0 \uc54a\uc740) \uc774\uc804\uc5d0\ub294 \uc2e4\ud589 \uc911\uc778 \ud0c0\uc774\uba38\uc758 \ucf5c\ubc31 \ub0b4\uc5d0\uc11c \ud0c0\uc774\uba38\ub97c \ub9cc\ub4e4 \uc218 \uc5c6\uae30 \ub54c\ubb38\uc5d0 \uba54\uc778 Eventing \ud568\uc218\uc758 OnUpdate(doc,meta) \uc9c4\uc785\uc810\uc5d0\uc11c \ubaa8\ub4e0 \ud0c0\uc774\uba38\ub97c \uc0dd\uc131\ud560 \uc218 \uc788\ub3c4\ub85d \ubcc0\ud615\uc744 \ud2b8\ub9ac\uac70\ud558\ub824\uba74 \"allow_interbucket_recursion\":true\uc640 \ud568\uaed8 \ub450 \ubc88\uc9f8 Eventing \ud568\uc218(\"allow_interbucket_recursion\":true)\uac00 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4.  \uc774 \uc791\uc5c5\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \uc218\ud589\ud569\ub2c8\ub2e4:<\/p>\n<ol>\n<li>\ud06c\ub860_\uc784\ud50c_2func_651 <strong>\uc628\uc5c5\ub370\uc774\ud2b8(\ubb38\uc11c,\uba54\ud0c0)<\/strong> \ub294 \ubcc0\uc774\ub97c \uc218\uc2e0\ud558\uace0 \ud0c0\uc774\uba38\ub97c \uc608\uc57d\ud569\ub2c8\ub2e4.<\/li>\n<li>\ud06c\ub860_\uc784\ud50c_2func_651 \ud0c0\uc774\uba38\uac00 \uc77c\uc815 \uc2dc\uac04\uc774 \uc9c0\ub098\uba74 <strong>\ucf5c\ubc31(\ubb38\uc11c)<\/strong> \ub8e8\ud2f4\uc774 \uc2e4\ud589\ub418\uba74 \uba3c\uc800 \uc6d0\ud558\ub294 \uc0ac\uc6a9\uc790 \uc791\uc5c5\uc744 \uc2e4\ud589\ud55c \ub2e4\uc74c \uc81c\uc5b4 \ubb38\uc11c\uc5d0 \ubcc0\uc774 #1\uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4(\uc7ac\uadc0\ub97c \ubc29\uc9c0\ud558\uae30 \uc704\ud574 \uc0dd\uc131 \ud568\uc218\uc5d0\uc11c\ub294 \ubcf4\uc774\uc9c0 \uc54a\uc74c).<\/li>\n<li>cron_impl_2func_651_help <strong>\uc628\uc5c5\ub370\uc774\ud2b8(\ubb38\uc11c,\uba54\ud0c0)<\/strong> \uac00 \ub3cc\uc5f0\ubcc0\uc774\ub97c \ubc1b\uc73c\uba74 \uc81c\uc5b4 \ubb38\uc11c\uc5d0 \ub610 \ub2e4\ub978 \ub3cc\uc5f0\ubcc0\uc774 #2\ub97c \ub9cc\ub4e4\uc5b4 \uc704\uc758 1\uc744 \ubb34\ud55c \uc21c\ud658\uc73c\ub85c \ud2b8\ub9ac\uac70\ud569\ub2c8\ub2e4.<\/li>\n<\/ol>\n<p>Couchbase \ub9b4\ub9ac\uc2a4 6.6\uc5d0\uc11c\ub294 \uc2e4\ud589 \uc911\uc778 \ud0c0\uc774\uba38 \ub0b4\uc5d0\uc11c \ud0c0\uc774\uba38\ub97c \uc0dd\uc131\ud560 \uc218 \uc788\uc73c\ubbc0\ub85c \ud5ec\ud37c \ud568\uc218\uac00 \uc804\ud600 \ud544\uc694\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.  \uc774\ub807\uac8c \ud558\uba74 \ud544\uc694\ud55c \ub85c\uc9c1\uc774 \ud06c\uac8c \ub2e8\uc21c\ud654\ub429\ub2c8\ub2e4. <em>cron<\/em> \uc2dc\uc2a4\ud15c<a id=\"footnote_2\"><\/a><sup>[2]<\/sup>.<\/p>\n<p>\"cron_impl_2func_651_help\"\uc758 \uc720\uc77c\ud55c \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \ud568\uc218 <strong>\uc628\uc5c5\ub370\uc774\ud2b8(\ubb38\uc11c,\uba54\ud0c0)<\/strong> \ub294 \uc544\ub798\uc640 \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"toolbar-overlay:false nums:false lang:default decode:true\">function OnUpdate(doc, meta) {\r\n  \/\/ fix for 6.5.X growing bucket ops\r\n  if (meta.id.startsWith(\"fix_timer_scan_issue:\")) upsertOneDocPerBucket(doc, meta);\r\n  \r\n  try {\r\n    \/\/ Check that doc has desired values\r\n    if (!doc.type || doc.type !== \"recurring_event\" || !doc.active || doc.active != true) return;\r\n    \/\/ doc must have 'action', 'dynamic {}', verbose {}, dynamic.state\r\n    if (!doc.action || !doc.dynamic || !doc.verbose || !doc.dynamic.state) return;\r\n    \/\/ Only process state pending this will only exist for a 'breif' time\r\n    if (doc.dynamic.state !== \"pending\") return;\r\n\r\n    var mid = doc.type + '::' + doc.id; \/\/ make our KEY\r\n    var newdoc = null;\r\n    try {\r\n      \/\/ read the current version of doc from KV, e.g. curDoc\r\n      newdoc = cron_bkt[mid];\r\n    } catch (e) {} \/\/ needed for pre 6.5, note pure 6.5+ deployment returns null sans exception\r\n    \r\n    var reason = null;\r\n    if (!newdoc || newdoc == null) {\r\n      reason = \"cron document is missing\";\r\n    } else\r\n    if (!newdoc.active) {\r\n      reason = \"cron document has active = false\";\r\n    } else\r\n    if (!newdoc.dynamic.state || newdoc.dynamic.state !== doc.dynamic.state) {\r\n      reason = \"cron document wrong dynamic.state expected \" + doc.dynamic.state;\r\n    } else\r\n    if (crc64(doc) !== crc64(newdoc)) {\r\n      reason = \"cron document changed\";\r\n    }\r\n    if (reason != null) {\r\n      if (!newdoc || newdoc == null || newdoc.verbose.scheduler &gt;= 1) {\r\n        log('OnUpdate help: X stopping schedule because ' + reason + ',', newdoc)\r\n        return;\r\n      }\r\n    }\r\n\r\n    newdoc.dynamic.state = \"rearm\";\r\n    \/\/ cron_bkt[mid] = newdoc;\r\n    if (!tryBucketKvWriteWithLog('OnUpdate help: F', mid, newdoc)) {\r\n      \/\/ Failed to write newdoc to cron_bkt[key] the error has been logged\r\n      \/\/ and there is nothing more we can do.\r\n      return;\r\n    }\r\n\r\n    if (newdoc.verbose.scheduler &gt;= 1) {\r\n      log('OnUpdate help: A ' + mid + ' mutation #2 to doc to force schedule rearm');\r\n    }\r\n    if (newdoc.verbose.scheduler &gt;= 3) {\r\n      log('OnUpdate help: B ' + mid + ',', newdoc);\r\n    }\r\n  } catch (e) {\r\n    log('OnUpdate help: E ' + meta.id + ', Error exception:', e);\r\n  }\r\n}\r\n\r\nfunction tryBucketKvWriteWithLog(tag, key, doc) {\r\n  var success = false;\r\n  var tries = 0;\r\n  while (tries &lt; 10) {\r\n    tries++;\r\n    try {\r\n      \/\/ critical that the below succeeds, because if it doesn't the cron cycle will break\r\n      cron_bkt[key] = doc;\r\n      success = true;\r\n      break;\r\n    } catch (e) {\r\n      log(tag + ' ' + key + ' WARN failed to update KV tries ' + tries, e);\r\n    }\r\n  }\r\n  if (!success) {\r\n    log(tag + ' ' + +key + ' FATAL could not update KV cron cycle, tried ' + tries + ', stoping ' + curDoc.action);\r\n  }\r\n  return success;\r\n}<\/pre>\n<h3>\ub3c4\uc6b0\ubbf8 \uae30\ub2a5\uc5d0\ub294 \uba87 \uac00\uc9c0 \uc720\ud2f8\ub9ac\ud2f0\uac00 \ud544\uc694\ud569\ub2c8\ub2e4.<\/h3>\n<p>\uc774\ub7ec\ud55c \uc720\ud2f8\ub9ac\ud2f0\ub294 <em>6.5.X \ubc84\ud0b7 \uc791\uc5c5 \uc99d\uac00\uc5d0 \ub300\ud55c \uc218\uc815 \uc0ac\ud56d<\/em> \ubaa8\ub4e0 vBucket\uc5d0\uc11c \uc774\ubca4\ud2b8 \ud0c0\uc774\uba38\uac00 \uc801\uc2dc\uc5d0 \uc2e4\ud589\ub418\ub3c4\ub85d \ud558\uc5ec \uc2dc\uac04\uc744 \uc808\uc57d\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"toolbar-overlay:false nums:false lang:js decode:true\">\/\/ FIXUP: ADDIN FUNCTON\r\n\/\/ fix for 6.5.X growing bucket ops\r\nfunction upsertOneDocPerBucket(doc, meta) {\r\n\r\n    var crcTable = makeCRC32Table();\r\n\r\n    \/\/ make one doc per bucket\r\n    var isVerbose = 0;\r\n    var isMacOS = false; \/\/ would be nice if this was an exposed constant in Eventing\r\n    var numvbs = 1024;   \/\/ default is linux\/PC\r\n    if (isMacOS) {\r\n        numvbs = 64;\r\n    }\r\n\r\n    var beg = (new Date).getTime();\r\n    var result = getKeysToCoverAllPartitions(crcTable, \"_tmp_vbs:\", numvbs);\r\n\r\n    for (var vb=0; vb&lt;numvbs; vb++) {\r\n        \/\/ brute force to fit a key prefix into a vBucket\r\n         var tst = result[vb];\r\n        if (isVerbose &gt; 1  || (isVerbose == 1) &amp;&amp; (vb &lt; 3 || vb &gt; numvbs -4)) {\r\n            log(\"KEY: \" + tst);\r\n        } else {\r\n            if (vb == 5) console.log(\"\\t*\\n\\t*\\n\\t*\");\r\n        }\r\n        \/\/ update the items to trigger a mutation for our PRIMARY fucntion\r\n        cron_bkt[tst] = { \"type\": \"_tmp_vbs\", \"vb\": vb, \"ts_millis\": beg, \"key\": tst };\r\n    }\r\n    var end = (new Date).getTime();\r\n    log(\"seeding one doc to each vBucket in primary_bucket alias (took \" + (end - beg) + \" mililis)\");\r\n}\r\n\r\n\/\/ FIXUP: ADDIN FUNCTON\r\n\/\/ fix for 6.5.X growing bucket ops\r\nfunction showHex(n) {\r\n    return n.toString(16);\r\n}\r\n\r\n\/\/ FIXUP: ADDIN FUNCTON\r\n\/\/ fix for 6.5.X growing bucket ops\r\nfunction makeCRC32Table() {\r\n    var crcTable = [];\r\n    var c;\r\n    for(var n =0; n &lt; 256; n++){\r\n        c = n;\r\n        for(var k =0; k &lt; 8; k++){\r\n            c = ((c&amp;1) ? (0xEDB88320 ^ (c &gt;&gt;&gt; 1)) : (c &gt;&gt;&gt; 1));\r\n        }\r\n        crcTable[n] = c;\r\n    }\r\n    return crcTable;\r\n}\r\n\r\n\/\/ FIXUP: ADDIN FUNCTON\r\n\/\/ fix for 6.5.X growing bucket ops\r\nfunction crc32(crcTable,str) {\r\n    var crc = 0 ^ (-1);\r\n    for (var i = 0; i &lt; str.length; i++ ) {\r\n        crc = (crc &gt;&gt;&gt; 8) ^ crcTable[(crc ^ str.charCodeAt(i)) &amp; 0xFF];\r\n    }\r\n    return (crc ^ (-1)) &gt;&gt;&gt; 0;\r\n}\r\n\r\n\/\/ FIXUP: ADDIN FUNCTON\r\n\/\/ fix for 6.5.X growing bucket ops\r\nfunction getKeysToCoverAllPartitions(crcTable,keyPrefix,partitionCount) {\r\n    var result = [];\r\n    var remaining = partitionCount;\r\n    for (var i = 0; remaining &gt; 0; i++) {\r\n      var key = keyPrefix + i;\r\n      var rv = (crc32(crcTable,key) &gt;&gt; 16) &amp; 0x7fff;\r\n      var actualPartition = rv &amp; partitionCount - 1;\r\n      if (!result[actualPartition] || result[actualPartition] === undefined) {\r\n        result[actualPartition] = key;\r\n        remaining--;\r\n      }\r\n    }\r\n    return result;\r\n}\r\n<\/pre>\n<h3>\uc774\uc81c \ub450 \uac1c\uc758 \uc774\ubca4\ud2b8 \ud568\uc218\ub97c \ubc30\ud3ec\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/h3>\n<p>\ub9ce\uc740 \ucf54\ub4dc\uc640 \ucd08\uae30 \uc2a4\ucf00\uc904\ub7ec\uc758 \ub514\uc790\uc778\uc744 \uac80\ud1a0\ud588\uc73c\ub2c8 \uc774\uc81c \ubaa8\ub4e0 \uac83\uc774 \ud568\uaed8 \uc791\ub3d9\ud558\ub294 \uac83\uc744 \ud655\uc778\ud560 \ucc28\ub840\uc785\ub2c8\ub2e4.<\/p>\n<p>\uc774 \uc608\uc81c\uc5d0\uc11c\ub294 \ubc84\ud0b7 \uc138 \uac1c\ub97c \uae30\uc5b5\ud558\uc138\uc694. <strong>travel-sample (<\/strong>\uc0d8\ud50c \uae30\ubcf8 \ub370\uc774\ud130 \uc138\ud2b8), <strong>\uba54\ud0c0\ub370\uc774\ud130<\/strong>(\uba54\ud0c0\ub370\uc774\ud130 \ubc84\ud0b7\uc740 Eventing\uc744 \uc704\ud55c \uc2a4\ud06c\ub798\uce58 \ud328\ub4dc\uc774\uba70 \ub2e4\ub978 Eventing \ud568\uc218\uc640 \uacf5\uc720\ud560 \uc218 \uc788\uc74c), \ub9c8\uc9c0\ub9c9\uc73c\ub85c <strong>\ud06c\ub860\ub370\uc774\ud130<\/strong> (\ud06c\ub860 \uc77c\uc815\uc744 \ubcf4\uad00\ud558\ub294). \uadf8\ub9ac\uace0 <strong>\uc5ec\ud589 \uc0d8\ud50c<\/strong> \ubc84\ud0b7\uc758 \ud06c\uae30\ub294 100MB\uc774\uace0 \ub098\uba38\uc9c0 \ub450 \ubc84\ud0b7\uc740 <strong>\uba54\ud0c0\ub370\uc774\ud130<\/strong> \uadf8\ub9ac\uace0 <strong>\ud06c\ub860\ub370\uc774\ud130<\/strong> \uc758 \ud06c\uae30\ub294 \ubaa8\ub450 200MB\uc5ec\uc57c \ud558\uba70 '\uc804\uc81c \uc870\uac74'\uc758 \uc9c0\uce68\uc5d0 \ub530\ub77c \uc774\ubbf8 \uc874\uc7ac\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<ul>\n<li>\uc5d0 \uc561\uc138\uc2a4\ud558\uc5ec \ud604\uc7ac \ubc84\ud0b7 \uad6c\uc131\uc744 \ud655\uc778\ud569\ub2c8\ub2e4. <strong>Couchbase \uc6f9 \ucf58\uc194 &gt; \ubc84\ud0b7<\/strong> \ud398\uc774\uc9c0\ub85c \uc774\ub3d9\ud569\ub2c8\ub2e4:<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8703 size-full\" style=\"border: #000 1px solid;margin-top: 12px\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/05\/ev_cr_1u_01_00_buckets.png\" alt=\"Eventing cron update\" width=\"2040\" height=\"650\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_00_buckets.png 2040w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_00_buckets-300x96.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_00_buckets-1024x326.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_00_buckets-768x245.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_00_buckets-1536x489.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_00_buckets-20x6.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_00_buckets-1320x421.png 1320w\" sizes=\"auto, (max-width: 2040px) 100vw, 2040px\" \/><\/li>\n<\/ul>\n<p>\uc774\ubca4\ud2b8 \uae30\ub2a5 \ubc30\ud3ec\ud558\uae30 \"<em>\ud06c\ub860_\uc784\ud50c_2func_651<\/em>'\ub97c \uc785\ub825\ud558\uba74 \ub450 \uac00\uc9c0 \ubc29\ubc95 \uc911 \ud558\ub098\ub97c \ub530\ub97c \uc218 \uc788\uc2b5\ub2c8\ub2e4:<\/p>\n<ul>\n<li>\uae30\ubcf8 \ubcf5\uc7a1\ub3c4, \ubc29\ubc95 #1 \ub2e4\uc6b4\ub85c\ub4dc\/\uac00\uc838\uc624\uae30<\/li>\n<li>\uc911\uac04 \ubcf5\uc7a1\ub3c4, \ubc29\ubc95 #2 \uc218\ub3d9\uc73c\ub85c \ud568\uc218 \ucd94\uac00, \uc798\ub77c\ub0b4\uc5b4 \ubd99\uc5ec\ub123\uae30 \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8<\/li>\n<\/ul>\n<h3>\ubc29\ubc95 #1 \ub2e4\uc6b4\ub85c\ub4dc\/\uac00\uc838\uc624\uae30<\/h3>\n<h4>\uccab \ubc88\uc9f8 \ud568\uc218 \"cron_impl_2func_651\" \uac00\uc838\uc624\uae30<\/h4>\n<p>\ud544\uc694\ud55c \ubaa8\ub4e0 \uc124\uc815\uc774 \ud3ec\ud568\ub41c \uccab \ubc88\uc9f8 \uc774\ubca4\ud2b8 \ud568\uc218\ub97c \ub2e4\uc6b4\ub85c\ub4dc\ud558\uace0 \ub2e4\uc74c \ub9c1\ud06c\ub97c \ub9c8\uc6b0\uc2a4 \uc624\ub978\ucabd \ubc84\ud2bc\uc73c\ub85c \ud074\ub9ad\ud55c \ud6c4 \ub2e4\uc74c\uc744 \uc120\ud0dd\ud569\ub2c8\ub2e4.\u00a0<strong>\ub2e4\ub978 \uc774\ub984\uc73c\ub85c \ub9c1\ud06c \uc800\uc7a5<\/strong>\u00a0\ub97c \ud074\ub9ad\ud558\uc5ec \ud30c\uc77c\uc744 \ub2e4\uc6b4\ub85c\ub4dc\ud569\ub2c8\ub2e4. <a href=\"https:\/\/raw.githubusercontent.com\/couchbaselabs\/blog-source-code\/master\/Strabala\/CronFiles\/cron_impl_2func_651.json\"><strong>cron_impl_2func_651.json<\/strong><\/a> \ub97c \ub85c\uceec \ud30c\uc77c \uc2dc\uc2a4\ud15c\uc5d0 \uc800\uc7a5\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc5d0\uc11c <strong>Couchbase \uc6f9 \ucf58\uc194 &gt; \uc774\ubca4\ud2b8 \uc124\uc815<\/strong> \ud398\uc774\uc9c0\uc5d0\uc11c <strong>\uac00\uc838\uc624\uae30<\/strong>\ub97c \ud074\ub9ad\ud558\uace0 \ud30c\uc77c\ub85c \uc774\ub3d9\ud569\ub2c8\ub2e4. <em>cron_impl_2func_651.json<\/em>\ub97c \ud074\ub9ad\ud558\uace0 \uc120\ud0dd\ud558\uc5ec \uc5fd\ub2c8\ub2e4. \ub97c \uc120\ud0dd\ud558\uace0 <strong>\uae30\ub2a5 \ucd94\uac00<\/strong> \ub300\ud654 \uc0c1\uc790\uac00 \ub098\ud0c0\ub0a9\ub2c8\ub2e4.<\/p>\n<p>\uc5d0\uc11c <strong>\uae30\ub2a5 \ucd94\uac00<\/strong> \ub300\ud654 \uc0c1\uc790\uc5d0\uc11c \uac1c\ubcc4 \ud568\uc218 \uc694\uc18c\uc5d0 \ub300\ud574 \uc544\ub798 \uc815\ubcf4\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4. JSON \ud30c\uc77c\uc5d0 \uc8fc\ubaa9\ud558\uc138\uc694. <em>cron_impl_2func_651.json<\/em> \ub294 \uc774 \uc608\uc81c\uc5d0 \ub300\ud55c \ubaa8\ub4e0 \uc124\uc815\uc744 \uc62c\ubc14\ub974\uac8c \uc0ac\uc804 \uad6c\uc131\ud569\ub2c8\ub2e4:<\/p>\n<ul>\n<li>\uc758 \uacbd\uc6b0 <strong>\uc18c\uc2a4 \ubc84\ud0b7<\/strong> \ub4dc\ub86d\ub2e4\uc6b4\uc5d0\uc11c \ub2e4\uc74c\uacfc \uac19\uc774 \uc124\uc815\ub418\uc5b4 \uc788\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4. <strong>\ud06c\ub860\ub370\uc774\ud130<\/strong>.<\/li>\n<li>\uc758 \uacbd\uc6b0 <strong>\uba54\ud0c0\ub370\uc774\ud130 \ubc84\ud0b7<\/strong> \ub4dc\ub86d\ub2e4\uc6b4\uc5d0\uc11c \ub2e4\uc74c\uacfc \uac19\uc774 \uc124\uc815\ub418\uc5b4 \uc788\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4. <strong>\uba54\ud0c0\ub370\uc774\ud130<\/strong>.<\/li>\n<li>\ub2e4\uc74c\uc744 \ud655\uc778\ud569\ub2c8\ub2e4. <strong>\ud06c\ub860_\uc784\ud50c_2func_651<\/strong>\u00a0\uc5d0\uc11c \uc0dd\uc131\ud558\ub294 \ud568\uc218\uc758 \uc774\ub984\uc785\ub2c8\ub2e4. <strong>\ud568\uc218 \uc774\ub984<\/strong> \ud14d\uc2a4\ud2b8 \uc0c1\uc790.<\/li>\n<li>[\uc120\ud0dd \ub2e8\uacc4] \ud14d\uc2a4\ud2b8 \uc785\ub825 <b>\ud06c\ub860 \uac19\uc740 \uc2a4\ucf00\uc904\ub7ec \ud30c\ud2b8 1<\/b>\uc5d0\uc11c <strong>\uc124\uba85<\/strong> \ud14d\uc2a4\ud2b8 \uc0c1\uc790.<\/li>\n<li>\uc758 \uacbd\uc6b0 <strong>\uc124\uc815<\/strong> \uc635\uc158\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc73c\ub824\uba74 \uae30\ubcf8\uac12\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/li>\n<li>\uc758 \uacbd\uc6b0 <strong>\ubc14\uc778\ub529<\/strong> \uc635\uc158\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub450 \uac1c\uc758 \ubc14\uc778\ub529\uc774 \uc788\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4.<\/li>\n<li>\ubc14\uc778\ub529\uc758 \uacbd\uc6b0, \"\ubc84\ud0b7 \ubcc4\uce6d\"\uc740 \ub2e4\uc74c\uc744 \uc9c0\uc815\ud569\ub2c8\ub2e4. <strong>\ud06c\ub860_bkt<\/strong> \uc744 \ubc84\ud0b7\uc758 \"\ubcc4\uce6d \uc774\ub984\"\uc73c\ub85c \uc785\ub825\ud558\uace0, \ubc84\ud0b7\uc758 \"\ubcc4\uce6d \uc774\ub984\"\uc73c\ub85c<br \/>\n<strong>\ud06c\ub860\ub370\uc774\ud130<\/strong> \ub97c \uc5f0\uacb0\ub41c \ubc84\ud0b7\uc73c\ub85c \uc124\uc815\ud558\uace0 \ubaa8\ub4dc\ub294 \"\uc77d\uae30 \ubc0f \uc4f0\uae30\"\ub85c \uc124\uc815\ud574\uc57c \ud569\ub2c8\ub2e4.<\/li>\n<li>\ubc14\uc778\ub529\uc758 \uacbd\uc6b0, \"\ubc84\ud0b7 \ubcc4\uce6d\"\uc740 \ub2e4\uc74c\uc744 \uc9c0\uc815\ud569\ub2c8\ub2e4. <strong>ts_bkt<\/strong> \uc744 \ubc84\ud0b7\uc758 \"\ubcc4\uce6d \uc774\ub984\"\uc73c\ub85c \uc785\ub825\ud558\uace0, \ubc84\ud0b7\uc758 \"\ubcc4\uce6d \uc774\ub984\"\uc73c\ub85c<br \/>\n<strong>\uc5ec\ud589 \uc0d8\ud50c<\/strong> \ub97c \uc5f0\uacb0\ub41c \ubc84\ud0b7\uc73c\ub85c \uc124\uc815\ud558\uace0 \ubaa8\ub4dc\ub294 \"\uc77d\uae30 \ubc0f \uc4f0\uae30\"\ub85c \uc124\uc815\ud574\uc57c \ud569\ub2c8\ub2e4.<\/li>\n<li>\ub300\ud654 \uc0c1\uc790\uc758 \uc124\uc815\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \ud45c\uc2dc\ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4:<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8704\" style=\"margin-top: 12px\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/05\/ev_cr_1u_01_add_function.png\" alt=\"Eventing cron update\" width=\"643\" height=\"640\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function.png 1286w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function-300x299.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function-1024x1019.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function-150x150.png 150w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function-768x764.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function-65x65.png 65w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function-50x50.png 50w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function-20x20.png 20w\" sizes=\"auto, (max-width: 643px) 100vw, 643px\" \/><\/li>\n<li>\ud568\uc218 \ucd94\uac00 \ub300\ud654 \uc0c1\uc790\uc5d0\uc11c \ud544\uc694\ud55c \ubaa8\ub4e0 \uc815\ubcf4\ub97c \ud655\uc778\ud55c \ud6c4 \ub2e4\uc74c\uc744 \ud074\ub9ad\ud569\ub2c8\ub2e4: \ucf54\ub4dc \ucd94\uac00\ub97c \ud074\ub9ad\ud569\ub2c8\ub2e4. \ub2e4\uc74c <strong>\ud06c\ub860_\uc784\ud50c_2func_651<\/strong> \ub300\ud654 \uc0c1\uc790\uac00 \ub098\ud0c0\ub0a9\ub2c8\ub2e4(\uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \ucf54\ub4dc\uac00 \ubbf8\ub9ac \ub85c\ub4dc\ub41c \uc0c1\ud0dc).<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8711 size-full\" style=\"border: #000 1px solid;margin-top: 12px\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/05\/ev_cr_1u_03_code_editor_done.png\" alt=\"Eventing cron update\" width=\"2040\" height=\"1542\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_03_code_editor_done.png 2040w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_03_code_editor_done-300x227.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_03_code_editor_done-1024x774.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_03_code_editor_done-768x581.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_03_code_editor_done-1536x1161.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_03_code_editor_done-20x15.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_03_code_editor_done-1320x998.png 1320w\" sizes=\"auto, (max-width: 2040px) 100vw, 2040px\" \/><\/li>\n<li>\uc774\ubca4\ud2b8 \ud654\uba74\uc73c\ub85c \ub3cc\uc544\uac00\ub824\uba74 '<strong>&lt; \uc774\ubca4\ud2b8\ub85c \ub3cc\uc544\uac00\uae30<\/strong>' \ub9c1\ud06c(\ud3b8\uc9d1\uae30 \uc544\ub798)\ub97c \ud074\ub9ad\ud558\uac70\ub098 <strong>\uc774\ubca4\ud2b8<\/strong> \ud0ed\uc744 \ud074\ub9ad\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<h4>\ub450 \ubc88\uc9f8 \ud568\uc218 \"cron_impl_2func_651_help\" \uac00\uc838\uc624\uae30<\/h4>\n<p>\ud544\uc694\ud55c \ubaa8\ub4e0 \uc124\uc815\uc774 \ud3ec\ud568\ub41c \ub450 \ubc88\uc9f8 \uc774\ubca4\ud2b8 \uae30\ub2a5\uc744 \ub2e4\uc6b4\ub85c\ub4dc\ud558\uace0 \ub2e4\uc74c \ub9c1\ud06c\ub97c \ub9c8\uc6b0\uc2a4 \uc624\ub978\ucabd \ubc84\ud2bc\uc73c\ub85c \ud074\ub9ad\ud55c \ud6c4 \ub2e4\uc74c\uc744 \uc120\ud0dd\ud569\ub2c8\ub2e4. <strong>\ub2e4\ub978 \uc774\ub984\uc73c\ub85c \ub9c1\ud06c \uc800\uc7a5<\/strong>\u00a0\ub97c \ud074\ub9ad\ud558\uc5ec \ud30c\uc77c\uc744 \ub2e4\uc6b4\ub85c\ub4dc\ud569\ub2c8\ub2e4. <a href=\"https:\/\/raw.githubusercontent.com\/couchbaselabs\/blog-source-code\/master\/Strabala\/CronFiles\/cron_impl_2func_651_help.json\"><strong>\ud06c\ub860_impl_2func_651_help.json<\/strong><\/a> \ub97c \ub85c\uceec \ud30c\uc77c \uc2dc\uc2a4\ud15c\uc5d0 \uc800\uc7a5\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc5d0\uc11c <strong>Couchbase \uc6f9 \ucf58\uc194 &gt; \uc774\ubca4\ud2b8 \uc124\uc815<\/strong> \ud398\uc774\uc9c0\uc5d0\uc11c <strong>\uac00\uc838\uc624\uae30<\/strong>\ub97c \ud074\ub9ad\ud558\uace0 \ud30c\uc77c\ub85c \uc774\ub3d9\ud569\ub2c8\ub2e4. <em>\ud06c\ub860_impl_2func_651_help.json<\/em>\ub97c \ud074\ub9ad\ud558\uace0 \uc120\ud0dd\ud558\uc5ec \uc5fd\ub2c8\ub2e4. \ub97c \uc120\ud0dd\ud558\uace0 <strong>\uae30\ub2a5 \ucd94\uac00<\/strong> \ub300\ud654 \uc0c1\uc790\uac00 \ub098\ud0c0\ub0a9\ub2c8\ub2e4.<\/p>\n<p>\uc5d0\uc11c <strong>\uae30\ub2a5 \ucd94\uac00<\/strong> \ub300\ud654 \uc0c1\uc790\uc5d0\uc11c \uac1c\ubcc4 \ud568\uc218 \uc694\uc18c\uc5d0 \ub300\ud574 \uc544\ub798 \uc815\ubcf4\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4. JSON \ud30c\uc77c\uc5d0 \uc8fc\ubaa9\ud558\uc138\uc694. <em>\ud06c\ub860_impl_2func_651_help.json<\/em> \ub294 \uc774 \uc608\uc81c\uc5d0 \ub300\ud55c \ubaa8\ub4e0 \uc124\uc815\uc744 \uc62c\ubc14\ub974\uac8c \uc0ac\uc804 \uad6c\uc131\ud569\ub2c8\ub2e4:<\/p>\n<ul>\n<li>\uc758 \uacbd\uc6b0 <strong>\uc18c\uc2a4 \ubc84\ud0b7<\/strong> \ub4dc\ub86d\ub2e4\uc6b4\uc5d0\uc11c \ub2e4\uc74c\uacfc \uac19\uc774 \uc124\uc815\ub418\uc5b4 \uc788\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4. <strong>\ud06c\ub860\ub370\uc774\ud130<\/strong>.<\/li>\n<li>\uc758 \uacbd\uc6b0 <strong>\uba54\ud0c0\ub370\uc774\ud130 \ubc84\ud0b7<\/strong> \ub4dc\ub86d\ub2e4\uc6b4\uc5d0\uc11c \ub2e4\uc74c\uacfc \uac19\uc774 \uc124\uc815\ub418\uc5b4 \uc788\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4. <strong>\uba54\ud0c0\ub370\uc774\ud130<\/strong>.<\/li>\n<li>\ub2e4\uc74c\uc744 \ud655\uc778\ud569\ub2c8\ub2e4. <strong>cron_impl_2func_651_help<\/strong>\u00a0\uc5d0\uc11c \uc0dd\uc131\ud558\ub294 \ud568\uc218\uc758 \uc774\ub984\uc785\ub2c8\ub2e4. <strong>\ud568\uc218 \uc774\ub984<\/strong> \ud14d\uc2a4\ud2b8 \uc0c1\uc790.<\/li>\n<li>[\uc120\ud0dd \ub2e8\uacc4] \ud14d\uc2a4\ud2b8 \uc785\ub825 <b>\ud06c\ub860\uacfc \uac19\uc740 \uc2a4\ucf00\uc904\ub7ec \ub3c4\uc6b0\ubbf8 \ud30c\ud2b8 1<\/b>\uc5d0\uc11c <strong>\uc124\uba85<\/strong> \ud14d\uc2a4\ud2b8 \uc0c1\uc790.<\/li>\n<li>\uc758 \uacbd\uc6b0 <strong>\uc124\uc815<\/strong> \uc635\uc158\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc73c\ub824\uba74 \uae30\ubcf8\uac12\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/li>\n<li>\uc758 \uacbd\uc6b0 <strong>\ubc14\uc778\ub529<\/strong> \uc635\uc158\uc744 \uc120\ud0dd\ud558\uba74 \ubc14\uc778\ub529\uc774 \ud558\ub098\ub9cc \uc874\uc7ac\ud558\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4.<\/li>\n<li>\ubc14\uc778\ub529\uc758 \uacbd\uc6b0, \"\ubc84\ud0b7 \ubcc4\uce6d\"\uc740 \ub2e4\uc74c\uc744 \uc9c0\uc815\ud569\ub2c8\ub2e4. <strong>\ud06c\ub860_bkt<\/strong> \uc744 \ubc84\ud0b7\uc758 \"\ubcc4\uce6d \uc774\ub984\"\uc73c\ub85c \uc785\ub825\ud558\uace0, \ubc84\ud0b7\uc758 \"\ubcc4\uce6d \uc774\ub984\"\uc73c\ub85c<br \/>\n<strong>\ud06c\ub860\ub370\uc774\ud130<\/strong> \ub97c \uc5f0\uacb0\ub41c \ubc84\ud0b7\uc73c\ub85c \uc124\uc815\ud558\uace0 \ubaa8\ub4dc\ub294 \"\uc77d\uae30 \ubc0f \uc4f0\uae30\"\ub85c \uc124\uc815\ud574\uc57c \ud569\ub2c8\ub2e4.<\/li>\n<li>\ub300\ud654 \uc0c1\uc790\uc758 \uc124\uc815\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \ud45c\uc2dc\ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4:<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8706\" style=\"margin-top: 12px\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/05\/ev_cr_1u_01_add_function_help.png\" alt=\"Eventing cron update\" width=\"643\" height=\"640\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function_help.png 1286w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function_help-300x299.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function_help-1024x1019.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function_help-150x150.png 150w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function_help-768x764.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function_help-65x65.png 65w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function_help-50x50.png 50w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function_help-20x20.png 20w\" sizes=\"auto, (max-width: 643px) 100vw, 643px\" \/><\/li>\n<li>\ud568\uc218 \ucd94\uac00 \ub300\ud654 \uc0c1\uc790\uc5d0\uc11c \ud544\uc694\ud55c \ubaa8\ub4e0 \uc815\ubcf4\ub97c \ud655\uc778\ud55c \ud6c4 \ub2e4\uc74c\uc744 \ud074\ub9ad\ud569\ub2c8\ub2e4: \ucf54\ub4dc \ucd94\uac00\ub97c \ud074\ub9ad\ud569\ub2c8\ub2e4. \ub2e4\uc74c <strong>cron_impl_2func_651_help<\/strong> \ub300\ud654 \uc0c1\uc790\uac00 \ub098\ud0c0\ub0a9\ub2c8\ub2e4(\uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \ucf54\ub4dc\uac00 \ubbf8\ub9ac \ub85c\ub4dc\ub41c \uc0c1\ud0dc).<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8729\" style=\"border: #000 1px solid;margin-top: 12px\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/04\/ev_cr_1u_02_code_editor_done_help.png\" alt=\"Eventing cron update\" width=\"1020\" height=\"770\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/ev_cr_1u_02_code_editor_done_help.png 2044w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/ev_cr_1u_02_code_editor_done_help-300x227.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/ev_cr_1u_02_code_editor_done_help-1024x774.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/ev_cr_1u_02_code_editor_done_help-768x580.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/ev_cr_1u_02_code_editor_done_help-1536x1160.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/ev_cr_1u_02_code_editor_done_help-20x15.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/ev_cr_1u_02_code_editor_done_help-1320x997.png 1320w\" sizes=\"auto, (max-width: 1020px) 100vw, 1020px\" \/><\/li>\n<li>\uc774\ubca4\ud2b8 \ud654\uba74\uc73c\ub85c \ub3cc\uc544\uac00\ub824\uba74 '<strong>&lt; \uc774\ubca4\ud2b8\ub85c \ub3cc\uc544\uac00\uae30<\/strong>' \ub9c1\ud06c(\ud3b8\uc9d1\uae30 \uc544\ub798)\ub97c \ud074\ub9ad\ud558\uac70\ub098 <strong>\uc774\ubca4\ud2b8<\/strong> \ud0ed\uc744 \ud074\ub9ad\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<h3>\ubc29\ubc95 #2 \uc218\ub3d9\uc73c\ub85c \ud568\uc218 \ucd94\uac00, \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \uc798\ub77c\ub0b4\uae30 \ubc0f \ubd99\uc5ec\ub123\uae30<\/h3>\n<h4>\uc218\ub3d9\uc73c\ub85c \"cron_impl_2func_651\" \ub9cc\ub4e4\uae30<\/h4>\n<p>\uc5d0\uc11c \uccab \ubc88\uc9f8 \uc774\ubca4\ud2b8 \ud568\uc218\ub97c \ucd94\uac00\ud558\ub824\uba74 <strong>Couchbase \uc6f9 \ucf58\uc194 &gt; \uc774\ubca4\ud2b8 \uc124\uc815<\/strong> \ud398\uc774\uc9c0\uc5d0\uc11c <strong>\uae30\ub2a5 \ucd94\uac00<\/strong>\ub97c \ud074\ub9ad\ud558\uc5ec \uc0c8 \ud568\uc218\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \uc758 <strong>\uae30\ub2a5 \ucd94\uac00<\/strong> \ub300\ud654 \uc0c1\uc790\uac00 \ub098\ud0c0\ub0a9\ub2c8\ub2e4.<\/p>\n<p>\uc5d0\uc11c <strong>\uae30\ub2a5 \ucd94\uac00<\/strong> \ub300\ud654 \uc0c1\uc790\uc5d0\uc11c \uac1c\ubcc4 \ud568\uc218 \uc694\uc18c\uc5d0 \ub300\ud574 \uc544\ub798 \uc815\ubcf4\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4:<\/p>\n<ul>\n<li>\uc758 \uacbd\uc6b0 <strong>\uc18c\uc2a4 \ubc84\ud0b7<\/strong> \ub4dc\ub86d\ub2e4\uc6b4\uc5d0\uc11c <strong>\ud06c\ub860\ub370\uc774\ud130<\/strong>.<\/li>\n<li>\uc758 \uacbd\uc6b0 <strong>\uba54\ud0c0\ub370\uc774\ud130 \ubc84\ud0b7<\/strong> \ub4dc\ub86d\ub2e4\uc6b4\uc5d0\uc11c <strong>\uba54\ud0c0\ub370\uc774\ud130<\/strong>.<\/li>\n<li>\ub9cc\ub4e4\uae30 <strong>\ud06c\ub860_\uc784\ud50c_2func_651<\/strong>\u00a0\uc5d0\uc11c \uc0dd\uc131\ud558\ub294 \ud568\uc218\uc758 \uc774\ub984\uc785\ub2c8\ub2e4. <strong>\ud568\uc218 \uc774\ub984<\/strong> \ud14d\uc2a4\ud2b8 \uc0c1\uc790.<\/li>\n<li>[\uc120\ud0dd \ub2e8\uacc4] \ud14d\uc2a4\ud2b8 \uc785\ub825 <b>\ud06c\ub860 \uac19\uc740 \uc2a4\ucf00\uc904\ub7ec \ud30c\ud2b8 1<\/b>\uc5d0\uc11c <strong>\uc124\uba85<\/strong> \ud14d\uc2a4\ud2b8 \uc0c1\uc790.<\/li>\n<li>\uc758 \uacbd\uc6b0 <strong>\uc124\uc815<\/strong> \uc635\uc158\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc73c\ub824\uba74 \uae30\ubcf8\uac12\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/li>\n<li>\uc758 \uacbd\uc6b0 <strong>\ubc14\uc778\ub529<\/strong> \uc635\uc158\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub450 \uac1c\uc758 \ubc14\uc778\ub529\uc744 \ub9cc\ub4ed\ub2c8\ub2e4:<\/li>\n<li>\ubc14\uc778\ub529\uc758 \uacbd\uc6b0, \"\ubc84\ud0b7 \ubcc4\uce6d\"\uc740 \ub2e4\uc74c\uc744 \uc9c0\uc815\ud569\ub2c8\ub2e4. <strong>\ud06c\ub860_bkt<\/strong> \uc744 \ubc84\ud0b7\uc758 \"\ubcc4\uce6d \uc774\ub984\"\uc73c\ub85c \uc785\ub825\ud558\uace0, \ubc84\ud0b7\uc758 \"\ubcc4\uce6d \uc774\ub984\"\uc73c\ub85c<br \/>\n<strong>\ud06c\ub860\ub370\uc774\ud130<\/strong> \ub97c \uc5f0\uacb0\ub41c \ubc84\ud0b7\uc73c\ub85c \uc124\uc815\ud558\uace0 \ubaa8\ub4dc\ub294 \"\uc77d\uae30 \ubc0f \uc4f0\uae30\"\ub85c \uc124\uc815\ud574\uc57c \ud569\ub2c8\ub2e4.<\/li>\n<li>\ubc14\uc778\ub529\uc758 \uacbd\uc6b0, \"\ubc84\ud0b7 \ubcc4\uce6d\"\uc740 \ub2e4\uc74c\uc744 \uc9c0\uc815\ud569\ub2c8\ub2e4. <strong>ts_bkt<\/strong> \uc744 \ubc84\ud0b7\uc758 \"\ubcc4\uce6d \uc774\ub984\"\uc73c\ub85c \uc785\ub825\ud558\uace0, \ubc84\ud0b7\uc758 \"\ubcc4\uce6d \uc774\ub984\"\uc73c\ub85c<br \/>\n<strong>\uc5ec\ud589 \uc0d8\ud50c<\/strong> \ub97c \uc5f0\uacb0\ub41c \ubc84\ud0b7\uc73c\ub85c \uc124\uc815\ud558\uace0 \ubaa8\ub4dc\ub294 \"\uc77d\uae30 \ubc0f \uc4f0\uae30\"\ub85c \uc124\uc815\ud574\uc57c \ud569\ub2c8\ub2e4.<\/li>\n<li>\uc124\uc815\uc744 \uad6c\uc131\ud55c \ud6c4 \ub300\ud654 \uc0c1\uc790\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \ud45c\uc2dc\ub429\ub2c8\ub2e4:<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8704\" style=\"margin-top: 12px\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/05\/ev_cr_1u_01_add_function.png\" alt=\"Eventing cron update\" width=\"643\" height=\"640\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function.png 1286w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function-300x299.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function-1024x1019.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function-150x150.png 150w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function-768x764.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function-65x65.png 65w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function-50x50.png 50w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function-20x20.png 20w\" sizes=\"auto, (max-width: 643px) 100vw, 643px\" \/><\/li>\n<li>\uc5d0 \ud544\uc694\ud55c \ubaa8\ub4e0 \uc815\ubcf4\ub97c \uc81c\uacf5\ud55c \ud6c4 <strong>\uae30\ub2a5 \ucd94\uac00<\/strong> \ub300\ud654 \uc0c1\uc790\uc5d0\uc11c <strong>\ub2e4\uc74c: \ucf54\ub4dc \ucd94\uac00<\/strong>. . <strong>\ud06c\ub860_\uc784\ud50c_2func_651<\/strong> \ub300\ud654 \uc0c1\uc790\uac00 \ub098\ud0c0\ub0a9\ub2c8\ub2e4. \uadf8\ub7ec\uba74 <strong>\ud06c\ub860_\uc784\ud50c_2func_651<\/strong>\u00a0\ub300\ud654 \uc0c1\uc790\uc5d0\ub294 \ucc98\uc74c\uc5d0 \ud50c\ub808\uc774\uc2a4\ud640\ub354 \ucf54\ub4dc \ube14\ub85d\uc774 \ud3ec\ud568\ub429\ub2c8\ub2e4. \uc2e4\uc81c <strong>\ud06c\ub860_\uc784\ud50c_2func_651<\/strong>\u00a0\ucf54\ub4dc\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4.<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8707\" style=\"border: #000 1px solid;margin-top: 12px\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/05\/ev_cr_1u_02_code_editor.png\" alt=\"Eventing cron update\" width=\"800\" height=\"186\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_02_code_editor.png 2042w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_02_code_editor-300x70.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_02_code_editor-1024x239.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_02_code_editor-768x179.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_02_code_editor-1536x358.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_02_code_editor-20x5.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_02_code_editor-1320x308.png 1320w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/li>\n<li style=\"list-style-type: none\"><\/li>\n<li>\ub2e4\uc74c \uc774\ubca4\ud2b8 \ud568\uc218 \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \uc18c\uc2a4(618\uc904)\ub97c \ubcf5\uc0ac\ud558\uc5ec \ub2e4\uc74c \ud50c\ub808\uc774\uc2a4\ud640\ub354 \ucf54\ub4dc \ube14\ub85d\uc5d0 \ubd99\uc5ec\ub123\uc2b5\ub2c8\ub2e4. <strong>\ud06c\ub860_\uc784\ud50c_2func_651<\/strong>\n<pre class=\"height-set:true height:800 toolbar-overlay:false nums:false lang:js decode:true\">\/* \r\nFunction \"cron_impl_2func_651\" also requires \"cron_impl_2func_651_help\"\r\n\r\nCreate a basic cron system using Eventing allows a recurring function to execute activity at a \r\nspecified time every day, hour, min, 30 sec., and 15 sec.  We use a bucket called 'crondata' \r\naliased to 'cron_bkt' which can hold one or more control documents of type = \"recurring_event\".\r\n\r\nThe following uses of timers do not work reliably in Couchbase versions 6.5 and 6.5.1\r\n  a) scheduling an Eventing timer within a timer's callback \r\n  b) overwriting an existing timer by id\r\n  \r\nIn addition the ability to cancel a timer does not exist in Couchbase versions 6.5 and 6.5.1\r\n  \r\nFor this example, we supply one real user function that builds a recurring 'static' cache document\r\nfrom bucket `travel-sample` via an N1QL query and save the result back to `travel-sample` via\r\nthe alais 'ts_bkt'.  This JavaScript function is doCronActionA(), we also provide two placeholders\r\ndoCronActionB() and doCronActionC() for additional experimentation.\r\n\r\nTest Doc:\r\n   {\r\n        \"type\":\"recurring_event\",   \/\/ The KEY will be &lt;&lt;type&gt;&gt;::&lt;&lt;id&gt;&gt;\r\n        \"id\":1,                     \/\/\r\n        \"hour\":14,                  \/\/ The hour of the day 0-23, *, *2X, *4X to trigger\r\n        \"min\":54,                   \/\/ The minute in the hour 0-59, *, *2X, *4X to trigger\r\n        \"action\":\"doCronActionA\",   \/\/ What function to run on the trigger\r\n        \"active\":false,             \/\/ Flag to arm or disable this schedule\r\n        \"verbose\" : {\r\n          \"user_func\":2,            \/\/ Logging level for the action logic : 0=none, etc. etc.\r\n          \"scheduler\":3             \/\/ Logging level for the cron logic   : 0=none, etc. etc.\r\n        },\r\n        \"dynamic\" : {\r\n          \"state\":\"arm\",            \/\/ States \"arm\"|\"rearm\"|\"pending\" if any value but \"pending\" start a schedule\r\n          \"next_sched\": 0,          \/\/ Number of seconds since epoch to next desired schedule\r\n          \"prev_sched\": 0,          \/\/ Number of seconds since epoch for previous schedule\r\n          \"prev_etime\": 0,          \/\/ Number of seconds since epoch for previous schedule actual exec time\r\n          \"prev_delay\": 0,          \/\/ Number of seconds that the timer was delayed from the schedule\r\n          \"prev_atime\": 0           \/\/ Number of seconds taken by the user 'action'\r\n        }\r\n    }\r\n    \r\n    INSERT INTO `crondata` (KEY,VALUE) VALUES (\"recurring_event::1\", \r\n    {\r\n        \"type\":\"recurring_event\",\r\n        \"id\":1,\r\n        \"hour\":14,\r\n        \"min\":54,\r\n        \"action\":\"doCronActionA\",\r\n    \t\"verbose\" : {\r\n          \"user_func\":2,\r\n          \"scheduler\":3\r\n        },\r\n        \"active\":false,\r\n\t    \"dynamic\" : {\r\n          \"state\": \"arm\",\r\n          \"next_sched\": 0,\r\n          \"prev_sched\": 0,\r\n          \"prev_etime\": 0,\r\n          \"prev_delay\": 0,\r\n          \"prev_atime\": 0\r\n\t    }\r\n    } \r\n    );\r\n\r\nNote, you can omit verbose{} and dynamic{} as they will be auto-created by this main Eventing \r\nFunction \"cron_impl_2func_651\". If verbose{} is missing the logging levels will default to \r\nverbose\" : {  \"user_func\":1, \"scheduler\":1 }\r\n\r\n    INSERT INTO `crondata` (KEY,VALUE) VALUES (\"recurring_event::1\", \r\n    {\r\n        \"type\":\"recurring_event\",\r\n        \"id\":1,\r\n        \"hour\":14,\r\n        \"min\":54,\r\n        \"action\":\"doCronActionA\",\r\n        \"active\":false\r\n    } \r\n    );\r\n\r\nN1QL : Make an index to query data without specifying keys\r\n    CREATE primary INDEX on `crondata` ;\r\n\r\nN1QL : Verify or inspect settings in schedule\t        \r\n    SELECT * FROM `crondata` WHERE type=\"recurring_event\";\r\n\r\nN1QL : Arm or set active\t    \r\n    UPDATE `crondata` SET active = true WHERE type=\"recurring_event\" AND id=1 ;\r\n    \r\nN1QL : Disarm or set inactive\t\r\n    UPDATE `crondata` SET active = false WHERE type=\"recurring_event\" AND id=1 ;\r\n    \r\nN1QL : Adjust time of trigger\t\r\n    UPDATE `crondata` SET hour = 11, min = 30 WHERE type=\"recurring_event\" AND id=1 ;\r\n\r\nN1QL : Adjust logging\t        \r\n    UPDATE `crondata` SET verbose.user_func = 1,  verbose.scheduler = 0 WHERE type=\"recurring_event\" AND id=1 ;\r\n\r\nN1QL : Delete the schedule\t    \r\n    DELETE FROM `crondata` WHERE type=\"recurring_event\" AND id=1 ;\r\n         \r\nThe action field is important it 'should' exist in this Eventing Function note it could be any \r\nJavaScript name e.g. MyFunc and you must implement like the example doCronActionA(doc) where\r\ndoc will be the currently active item of type = 'recurring_event' read from the alias bucket\r\n\u2018cron_bkt\u2019 when the timer is fired.  The action JavaScript function should return  either true\r\nor false used for logging purposes.  If the action does not exist it is an error and a warning\r\nis logged and the timer is disabled.\r\n\r\nIn Couchbase version 6.5+ to add a new cron like daily function just pause the active handler \r\ninsert your new function doCronActionB(doc) {...} then Resume the eventing handler.  The nice \r\nthing is if a timer was to be fired will the function was paused it will NOT be lost, when you \r\nresume the function it will be processed at the next available time slot.  \r\n\r\nAny change to a control structure will create a new recurring schedule or timer and cancel the \r\ncurrent previous schedule this includes changing the verbosity level. The previous timer will \r\ncontinue to run however when executed it will do a Checksum on the current control structure \r\nfrom KV against it\u2019s passed context and if different the Callback will ignore the old schedule.\r\nThis logic could be altered to process immediately if the schedule has expired search for the \r\nstring \"OnUpdate U\" in the code below.\r\n*\/\r\n\r\n\/\/ ==================\r\n\/* BEG USER FUNCTIONS TO RUN ONCE A DAY, HOUR, OR MINUTE - ANYTHING YOU WANT BELOW *\/\r\nfunction doCronActionA(doc) {\r\n  try {\r\n    \/\/ Check that doc has desired values\r\n    if (!doc.type || doc.type !== \"recurring_event\" || !doc.active || doc.active !== true) return;\r\n    if (doc.verbose.user_func &gt;= 1)\r\n      log(doc.action + ' user action controlled by ' + doc.type + '::' + doc.id);\r\n\r\n    \/\/ this is a 6.5 N1QL query (feature not available in GA prior to 6.5)\r\n    \/\/ Create an embedded N1QL iterator by issuing a SELECT statement to get the\r\n    \/\/ counts of airlines by country.  Make a new document and write it out to KV \r\n\r\n    \/\/ We will use the iterator to create a KV document representing the results of a\r\n    \/\/ HARD lengthy embedded N1QL query and write it back to KV, the idea is to keep\r\n    \/\/ a calculation up to date once a day such that it that can be read 'quickly' \r\n    \/\/ by other Eventing Functions, other Couchbase services or SDKs.   \r\n\r\n    \/\/ Consider if we had 1 million docs in a minute do we really want to use N1QL\r\n    \/\/ to recalculate something that is almost static for all 1 million documents, of \r\n    \/\/ course not, so we make an intermediate value that can be read into Eventing\r\n    \/\/ and used via a single 'light weight' KV read.\r\n\r\n    var q_iter = SELECT country,\r\n      count( * ) cnt\r\n    FROM `travel-sample`\r\n    WHERE `type` = 'airline'\r\n    GROUP BY country;\r\n\r\n    \/\/ loop through the result set and update the map 'accumulate'\r\n    var accumulate = {};\r\n    var idx = 0;\r\n    for (var val of q_iter) {\r\n      if (doc.verbose.user_func &gt;= 2)\r\n        log(doc.action + ' N1QL idx ' + idx + ', country ' + val.country + \" cnt \" + val.cnt);\r\n      accumulate[val.country] = val.cnt;\r\n      idx++;\r\n    }\r\n    \/\/ close out embedded N1QL iterator\r\n    q_iter.close();\r\n\r\n    \/\/ Now let\u2019s make a cached KV document representing a HARD length embedded N1QL\r\n    \/\/ query and write it back to KV, we need a KEY and a type and id and then we \r\n    \/\/ upsert it into the `travel-sample` bucket.\r\n\r\n    var cachedoc = {};\r\n    cachedoc.type = \"cron_cache\";\r\n    cachedoc.id = \"airlines_by_country\";\r\n    cachedoc.date = new Date();\r\n    cachedoc.data = accumulate;\r\n    var ckey = cachedoc.type + '::' + cachedoc.id;\r\n    ts_bkt[ckey] = cachedoc;\r\n    if (doc.verbose.user_func &gt;= 2) {\r\n      log(doc.action + ' upsert to KV with KEY ' + ckey + ' cachedoc ', cachedoc);\r\n    }\r\n  } catch (e) {\r\n    log(doc.action + ' Error exception:', e);\r\n    return false;\r\n  }\r\n  return true;\r\n}\r\n\r\nfunction doCronActionB(doc) {\r\n  try {\r\n    \/\/ check that doc has desired values\r\n    if (doc.type !== \"recurring_event\" || doc.active !== true) return;\r\n    if (doc.verbose.user_func &gt;= 1)\r\n      log(doc.action + ' user action controlled by ' + doc.type + '::' + doc.id);\r\n\r\n    \/\/ YOUR LOGIC HERE\r\n\r\n  } catch (e) {\r\n    log(doc.action + ' Error exception:', e);\r\n    return false;\r\n  }\r\n  return true;\r\n}\r\n\r\nfunction doCronActionC(doc) {\r\n  try {\r\n    \/\/ check that doc has desired values\r\n    if (doc.type !== \"recurring_event\" || doc.active !== true) return;\r\n    if (doc.verbose.user_func &gt;= 1)\r\n      log(doc.action + ' user action controlled by ' + doc.type + '::' + doc.id);\r\n\r\n    \/\/ YOUR LOGIC HERE\r\n\r\n  } catch (e) {\r\n    log(doc.action + ' Error exception:', e);\r\n    return false;\r\n  }\r\n  return true;\r\n}\r\n\r\n\/* END USER FUNCTIONS TO RUN ONCE A DAY, HOUR, OR MINUTE - ANYTHING YOU WANT ABOVE *\/\r\n\/\/ ==================\r\n\r\n\r\n\/\/ FIXUP: ADDIN FUNCTON\r\nfunction noopTimer(context) {\r\n    \/\/ fix for 6.5.X growing bucket ops\r\n    try {\r\n        if (context.type === \"_tmp_vbs\" &amp;&amp; context.vb === 0) { \r\n            \/\/ log(\"noopTimer timers firing, printing only for vBucket 0\");\r\n        }\r\n    } catch (e) {\r\n        log(\"OnUpdate Exception in callback noopTimer:\", e);\r\n    }\r\n}\r\n\r\n\/\/ FIXUP: ADDIN FUNCTON\r\nfunction rearmTimer(context) {\r\n    \/\/ fix for 6.5.X growing bucket ops\r\n    try {\r\n        if (context.type === \"_tmp_vbs\" &amp;&amp; context.vb === 0) { \r\n            \/\/ Update\/touch all docs in the helper_bucket the helper function will then\r\n            \/\/ mutate all 1024 of type == vbs_seed (64 on MacOS) to create a recuring cycle.\r\n            \/\/ log(\"noopTimer timer fired all 1024 vBuckets, logging only vb 0\", context);\r\n            \r\n            \/\/ generate a mutation to re-arm the HELPER function: fix_scan_issue\r\n            \/\/ which will in turn make new mutations for this Function\r\n            var cur = cron_bkt[context.key];\r\n            if (cur &amp;&amp; cur.ts_millis === context.ts_millis) {\r\n                \/\/ log(\"rearmTimer update fix_timer_scan_issue::1 in helper_bucket alias only for vBucket 0\");\r\n                var now = new Date();\r\n                cron_bkt[\"fix_timer_scan_issue::1\"] = { \"last_update\": now };\r\n            } else {\r\n                \/\/ NOOP we had multiple timer cycles, just let this one quietly stop.\r\n            }\r\n        }\r\n    } catch (e) {\r\n        log(\"OnUpdate Exception in callback rearmTimer:\", e);\r\n    }\r\n}\r\n\r\n\/\/ FIXUP: ADDIN FUNCTON\r\nfunction genNoopTimers(doc, meta, seconds) {\r\n    \/\/ fix for 6.5.X growing bucket ops\r\n    try {\r\n        \/\/ redundant but play it safe\r\n        if (doc.type === \"_tmp_vbs\") {\r\n            \/\/ Since we are using an different function a timer on all our vBuckets do immeadiately (can take up to 15 seconds)\r\n            \/\/ If we used cross bucket recursion to rearm all the timers in a recurring fashion we would add a delay of at least 40 seconds.\r\n            createTimer(noopTimer, new Date(), null, doc);\r\n            if (doc.vb === 0) { \r\n                \/\/ Update\/touch all docs in the helper_bucket the helper function will then\r\n                \/\/ mutate all 1024 of type == vbs_seed (64 on MacOS) to create a recuring cycle.\r\n                \/\/ log(\"noopTimer timer fired all 1024 vBuckets, logging only vb 0\", context);\r\n            \r\n                \/\/ generate a mutation to re-arm the HELPER function: fix_scan_issue\r\n                \/\/ which will in turn make new mutations for this Function\r\n                \r\n                \/\/ log(\"genNoopTimers make timer to rearm fix_timer_scan_issue::1\");\r\n                createTimer(rearmTimer, new Date(new Date().getTime() + seconds * 1000), null, doc);\r\n            }\r\n        }\r\n    } catch (e) {\r\n        log(\"OnUpdate Exception in genNoopTimers:\", e);\r\n    }\r\n}\r\n\r\nfunction OnUpdate(doc, meta) {\r\n  \/\/ fix for 6.5.X growing bucket ops\r\n  if (doc.type === \"_tmp_vbs\") genNoopTimers(doc, meta, 30);\r\n  if (!cron_bkt[\"fix_timer_scan_issue::1\"]) {\r\n      cron_bkt[\"fix_timer_scan_issue::1\"] = {};\r\n  }\r\n    \r\n  try {\r\n    \/\/ Check if further analysis is needed we only trigger on an active recurring_event \r\n    if (doc.type !== \"recurring_event\" || doc.active !== true) return;\r\n\r\n    var update_doc = false;\r\n    if (!doc.dynamic) {\r\n      \/\/ Add if missing doc.dynamic with defaults\r\n      doc.dynamic = {\r\n        \"state\": \"arm\",\r\n        \"next_sched\": 0,\r\n        \"prev_sched\": 0,\r\n        \"prev_etime\": 0,\r\n        \"prev_delay\": 0,\r\n        \"prev_atime\": 0\r\n      };\r\n      \/\/ we need to update the document once we have the next schedule\r\n      update_doc = true;\r\n    }\r\n    if (!doc.verbose) {\r\n      \/\/ Add if missing doc.dynamic with defaults\r\n      doc.verbose = {\r\n        \"user_func\": 1,\r\n        \"scheduler\": 1\r\n      };\r\n      \/\/ we need to update the document once we have the next schedule\r\n      update_doc = true;\r\n    }\r\n    \/\/ Do not process dynamic.state pending\r\n    if (!doc.dynamic || !doc.dynamic.state || doc.dynamic.state === \"pending\") return;\r\n\r\n    var mid = doc.type + \"::\" + doc.id; \/\/ this is the same as meta.id or the KEY\r\n    var hour = doc.hour;\r\n    var min = doc.min;\r\n\r\n    \/\/ Do an eval check the JavaScript function exists. The eval occurs in a common \r\n    \/\/ utility function shared with RecurringCallback\r\n    if (!verifyFunctionExistsViaEval(doc, mid)) {\r\n      \/\/ doc.action did not exist, we have already logged the issue\r\n      return;\r\n    }\r\n\r\n    \/\/ Get the next valid execution time\r\n    var date_timer = getNextRecurringDate(hour, min);\r\n    var next_sched = Math.round(date_timer.getTime() \/ 1000);\r\n    if (!update_doc &amp;&amp; next_sched !== doc.dynamic.next_sched) {\r\n      \/\/ the next_sched should be the same as the setting from the helper application, however\r\n      \/\/ if we undeploy\/deploy or pause\/resume we might haver to reschedule to the next time slot\r\n      log('OnUpdate U ' + mid + ' calculated next_sched !== doc.dynamic.next_sched, delta ' +\r\n        (next_sched - doc.dynamic.next_sched) + ', reschedule');\r\n      update_doc = true;\r\n    }\r\n\r\n    if (update_doc) {\r\n      \/\/ this mutation is recursive and will be suppressed, we ensure we have a dynamic structure\r\n      doc.dynamic.next_sched = next_sched;\r\n\r\n      \/\/ rather then the call a function, to trap and retry if there is a resource issue\r\n      \/\/ cron_bkt[mid] = doc;\r\n      if (!tryBucketKvWriteWithLog('OnUpdate F', mid, doc)) {\r\n        \/\/ Failed to write doc to cron_bkt[key] the error has been logged\r\n        \/\/ and there is nothing more we can do.\r\n        return;\r\n      }\r\n    }\r\n\r\n    \/\/ Schedule an Eventing timer\r\n    var timer_id = createTimer(Callback, date_timer, null, doc);\r\n    if (doc.verbose.scheduler &gt;= 1) {\r\n      log('OnUpdate A ' + mid + ' rcv mutation (initial or rearm) schedule timer at ' +\r\n        toLocalISOTime(date_timer));\r\n    }\r\n    if (doc.verbose.scheduler &gt;= 2) {\r\n      log('OnUpdate B ' + mid + ' recurring timer was created, timer_id ' + timer_id);\r\n    }\r\n  } catch (e) {\r\n    log('OnUpdate E ' + meta.id + ', Error exception:', e);\r\n  }\r\n}\r\n\r\nfunction getNextRecurringDate(hour_str, min_str) {\r\n  \/\/ Note Javascript Dates are in milliseconds\r\n  var date_now = new Date();\r\n  var date_ret = new Date();\r\n  var hour;\r\n  var min;\r\n\r\n  try {\r\n    hour = parseInt(hour_str);\r\n  } catch (e) {}\r\n  try {\r\n    min = parseInt(min_str);\r\n  } catch (e) {}\r\n\r\n  \/\/ Note, this is only a simplistic partial 'crontab' syntax with some slight extensions\r\n  \/\/ it allows once a day, once an hour, once a minute.  It also contains some non-standard \r\n  \/\/ syntax to provide the ability to execute twice a minute or four times a minute.\r\n\r\n  if (hour_str === '*4X' &amp;&amp; min_str === '*4X') {\r\n    \/\/ once every 15 seconds or four times a minute\r\n    date_ret.setMilliseconds(0);\r\n    date_ret.setSeconds(15);\r\n    while (date_ret.getTime() &lt; date_now.getTime()) {\r\n      date_ret.setSeconds(date_ret.getSeconds() + 15);\r\n    }\r\n    return date_ret;\r\n  } else\r\n  if (hour_str === '*2X' &amp;&amp; min_str === '*2X') {\r\n    \/\/ once every 30 seconds or twice a minute\r\n    date_ret.setMilliseconds(0);\r\n    date_ret.setSeconds(30);\r\n    while (date_ret.getTime() &lt; date_now.getTime()) {\r\n      date_ret.setSeconds(date_ret.getSeconds() + 30);\r\n    }\r\n    return date_ret;\r\n  } else\r\n  if (hour_str === '*' &amp;&amp; min_str === '*') {\r\n    \/\/ once a minute \r\n    date_ret.setMilliseconds(0);\r\n    date_ret.setSeconds(0);\r\n    date_ret.setMinutes(date_ret.getMinutes() + 1);\r\n  } else\r\n  if (hour_str !== '*' &amp;&amp; isNaN(hour) === false &amp;&amp; min_str === '*') {\r\n    \/\/ once a minute only for a given hour\r\n    date_ret.setMilliseconds(0);\r\n    date_ret.setSeconds(0);\r\n    date_ret.setMinutes(date_ret.getMinutes() + 1);\r\n    if (date_ret.getTime() &lt; date_now.getTime()) {\r\n      date_ret.setHours(hour);\r\n    }\r\n    if (date_ret.getTime() &gt; date_now.getTime()) {\r\n      date_ret.setDate(date_ret.getDate() + 1);\r\n      date_ret.setSeconds(0);\r\n      date_ret.setMinutes(0);\r\n      date_ret.setHours(hour);\r\n    }\r\n  } else\r\n  if (hour_str === '*' &amp;&amp; min_str !== '*' &amp;&amp; isNaN(min) === false) {\r\n    \/\/ once a hour at a given minute\r\n    date_ret.setMilliseconds(0);\r\n    date_ret.setSeconds(0);\r\n    date_ret.setMinutes(min);\r\n    \/\/ schedule for next hour\r\n    date_ret.setHours(date_ret.getHours() + 1);\r\n  } else\r\n  if (isNaN(hour) === false &amp;&amp; isNaN(min) === false) {\r\n    \/\/ once a day for a given hour and a given minute \r\n    date_ret.setMilliseconds(0);\r\n    date_ret.setSeconds(0);\r\n    date_ret.setMinutes(min);\r\n    date_ret.setHours(hour);\r\n    if (date_ret.getTime() &lt; date_now.getTime()) {\r\n      \/\/ schedule for tomorrow\r\n      date_ret.setDate(date_ret.getDate() + 1);\r\n    }\r\n  } else {\r\n    log('getNextRecurringDate illegal input hour_str &lt;' +\r\n      hour_str + '&gt; min_str &lt;' + min_str + '&gt;');\r\n    throw new Error('getNextRecurringDate illegal input hour_str &lt;' +\r\n      hour_str + '&gt; min_str &lt;' + min_str + '&gt;');\r\n    return null;\r\n  }\r\n  return date_ret;\r\n}\r\n\r\nfunction verifyFunctionExistsViaEval(curDoc, id) {\r\n  var result = false;\r\n  try {\r\n    \/\/ check for function if missing this is invalid return result\r\n    result = eval(\"typeof \" + curDoc.action + \" === 'function';\");\r\n    if (result === false) {\r\n      if (curDoc.verbose.scheduler &gt;= 1)\r\n        log(\"Warn\/Disable (No Action and No Re-Arm), because required 'action' of \" +\r\n          curDoc.action + \"(doc) does not exist, id is\", id);\r\n      return result;\r\n    }\r\n  } catch (e) {\r\n    log('verifyFunctionExistsViaEval Error exception:', e);\r\n  }\r\n  return result;\r\n}\r\n\r\nfunction toNumericFixed(number, precision) {\r\n  var multi = Math.pow(10, precision);\r\n  return Math.round((number * multi).toFixed(precision + 1)) \/ multi;\r\n}\r\n\r\nfunction toLocalISOTime(d) {\r\n  var tzoffset = (new Date()).getTimezoneOffset() * 60000; \/\/offset in milliseconds\r\n  return (new Date(d.getTime() - tzoffset)).toISOString().slice(0, -1);\r\n}\r\n\r\nfunction tryBucketKvWriteWithLog(tag, key, doc) {\r\n  var success = false;\r\n  var tries = 0;\r\n  while (tries &lt; 10) {\r\n    tries++;\r\n    try {\r\n      \/\/ critical that the below succeeds, because if it doesn't the cron cycle will break\r\n      cron_bkt[key] = doc;\r\n      success = true;\r\n      break;\r\n    } catch (e) {\r\n      log(tag + ' ' + key + ' WARN failed to update KV tries ' + tries, e);\r\n    }\r\n  }\r\n  if (!success) {\r\n    log(tag + ' ' + +key + ' FATAL could not update KV cron cycle, tried ' + tries + ', stoping ' + curDoc.action);\r\n  }\r\n  return success;\r\n}\r\n\r\nfunction Callback(doc) {\r\n  try {\r\n    var fired_at = new Date();\r\n\r\n    \/\/ Check if further analysis is needed we only trigger on a recurring_event that is active\r\n    if (doc.type !== \"recurring_event\") return;\r\n    \/\/ doc must have 'action', 'dynamic {}', verbose {}, dynamic.state\r\n    if (!doc.action || !doc.dynamic || !doc.verbose || !doc.dynamic.state) return;\r\n    \/\/ process any doc.dynamic.state BUT pending \r\n    if (doc.dynamic.state === \"pending\") return;\r\n\r\n    \/\/ ==================\r\n    \/\/ Check if still active\r\n\r\n    \/\/ We make sure that in KV the 'doc' still exists and that it is still active if not just \r\n    \/\/ return thus skipping the action and not Re-arming the timer. Note `travel-sample` is \r\n    \/\/ aliased to the map 'cron_bkt\r\n\r\n    var mid = doc.type + '::' + doc.id; \/\/ make our KEY\r\n    var curDoc = null;\r\n    try {\r\n      \/\/ read the current version of doc from KV, e.g. curDoc\r\n      curDoc = cron_bkt[mid];\r\n    } catch (e) {} \/\/ needed for pre 6.5, note pure 6.5+ deployment returns null sans exception\r\n\r\n    var reason = null;\r\n    if (!curDoc || curDoc === null) {\r\n      reason = \"cron document is missing\";\r\n    } else\r\n    if (!curDoc.active) {\r\n      reason = \"cron document has active = false\";\r\n    } else\r\n    if (!curDoc.dynamic.state || curDoc.dynamic.state !== doc.dynamic.state) {\r\n      reason = \"cron document wrong dynamic.state expected \" + doc.dynamic.state;\r\n    } else\r\n    if (crc64(doc) !== crc64(curDoc)) {\r\n      reason = \"cron document changed\";\r\n    }\r\n\r\n    if (reason !== null) {\r\n      if (!curDoc || curDoc === null || curDoc.verbose.scheduler &gt;= 1) {\r\n        log('Callback X ' + mid + \" ignore\/stop this timer's schedule because \" + reason);\r\n      }\r\n      if (!curDoc || curDoc === null || curDoc.verbose.scheduler &gt;= 4) {\r\n        log('Callback Y ' + mid + ' timer doc', doc);\r\n        log('Callback Z ' + mid + ' KV curDoc', curDoc);\r\n      }\r\n      return;\r\n    }\r\n\r\n    \/\/ ==================\r\n    \/\/ Verify user routine exists and if so eval it \r\n\r\n    \/\/ Assume curDoc.action contains something like \"doCronActionA\" and we have a function in \r\n    \/\/ this handler like \"doCronActionA(doc)\". Below we use curDoc as the end user should be \r\n    \/\/ able to alter the eval'd JavaScript function.  We will execute two (2) evals.\r\n\r\n    \/\/ First eval check the JavaScript function exists.  The eval occurs in a common \r\n    \/\/ utility function shared with RecurringCallback\r\n    if (!verifyFunctionExistsViaEval(curDoc, mid)) {\r\n      \/\/ curDoc.action did not exist, we have already logged the issue\r\n      return;\r\n    }\r\n\r\n    \/\/ Second eval execute and process the user function we execute the defined function \r\n    \/\/ with an argument of curDoc\r\n    var beg_act = new Date();\r\n    var result = null;\r\n    eval(\"result = \" + curDoc.action + \"(curDoc);\");\r\n    var end_act = new Date();\r\n    var atime_ms = end_act.getTime() - beg_act.getTime();\r\n\r\n    if (curDoc.verbose.scheduler &gt;= 2)\r\n      log('Callback R ' + mid + ' action took ' + toNumericFixed((atime_ms \/ 1000), 3) +\r\n        ' sec., returned ' + result);\r\n\r\n    \/\/ ==================\r\n    \/\/ Calculate next time and mutate the control document for our our helper function\r\n    \/\/ which will create another mutation such that OnUpdate of this function will pick\r\n    \/\/ it up and generate the timer (avoids the MB-38554 issue).\r\n\r\n    var hour = curDoc.hour;\r\n    var min = curDoc.min;\r\n    var date_timer = getNextRecurringDate(hour, min);\r\n\r\n    curDoc.dynamic.prev_delay =\r\n      toNumericFixed(((fired_at.getTime() \/ 1000) - curDoc.dynamic.next_sched), 3);\r\n    curDoc.dynamic.prev_sched = curDoc.dynamic.next_sched;\r\n    curDoc.dynamic.prev_etime = Math.round(fired_at.getTime() \/ 1000);\r\n    curDoc.dynamic.prev_atime = toNumericFixed((atime_ms \/ 1000), 3);\r\n\r\n    curDoc.dynamic.state = \"pending\";\r\n    curDoc.dynamic.next_sched = Math.round(date_timer.getTime() \/ 1000);\r\n\r\n    \/\/ rather then the call a function, to trap and retry if there is a resource issue\r\n    \/\/ cron_bkt[mid] = curDoc;\r\n    if (!tryBucketKvWriteWithLog('Callback F', mid, curDoc)) {\r\n      \/\/ Failed to write curDoc to cron_bkt[key] the error has been logged\r\n      \/\/ and there is nothing more we can do.\r\n      return;\r\n    }\r\n\r\n    if (curDoc.verbose.scheduler &gt;= 1) {\r\n      log('Callback A ' + mid + ' gen mutation #1 to doc to force schedule rearm at ' +\r\n        toLocalISOTime(date_timer));\r\n    }\r\n    if (curDoc.verbose.scheduler &gt;= 2) {\r\n      log('Callback B ' + mid + ' sched ' + curDoc.dynamic.prev_sched +\r\n        ', actual ' + curDoc.dynamic.prev_etime +\r\n        ', delay ' + curDoc.dynamic.prev_delay +\r\n        ', took ' + curDoc.dynamic.prev_atime);\r\n    }\r\n    if (curDoc.verbose.scheduler &gt;= 3) {\r\n      log('Callback C ' + mid + ' curDoc', curDoc);\r\n    }\r\n  } catch (e) {\r\n    var mid = doc.type + '::' + doc.id; \/\/ make our KEY\r\n    log('Callback E ' + mid + ' Error exception:', e);\r\n  }\r\n}<\/pre>\n<\/li>\n<\/ul>\n<ul>\n<li>\ubd99\uc5ec\ub123\uae30\ub97c \ub9c8\uce58\uba74 \uc544\ub798\uc640 \uac19\uc740 \ud654\uba74\uc774 \ub098\ud0c0\ub0a9\ub2c8\ub2e4:<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8711\" style=\"border: #000 1px solid;margin-top: 12px\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/05\/ev_cr_1u_03_code_editor_done.png\" alt=\"Eventing cron update\" width=\"1020\" height=\"771\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_03_code_editor_done.png 2040w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_03_code_editor_done-300x227.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_03_code_editor_done-1024x774.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_03_code_editor_done-768x581.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_03_code_editor_done-1536x1161.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_03_code_editor_done-20x15.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_03_code_editor_done-1320x998.png 1320w\" sizes=\"auto, (max-width: 1020px) 100vw, 1020px\" \/><\/li>\n<li>\ud074\ub9ad <strong>\uc800\uc7a5<\/strong>.<\/li>\n<li>\uc774\ubca4\ud2b8 \ud654\uba74\uc73c\ub85c \ub3cc\uc544\uac00\ub824\uba74 '<strong>&lt; \uc774\ubca4\ud2b8\ub85c \ub3cc\uc544\uac00\uae30<\/strong>' \ub9c1\ud06c(\ud3b8\uc9d1\uae30 \uc544\ub798)\ub97c \ud074\ub9ad\ud558\uac70\ub098 <strong>\uc774\ubca4\ud2b8<\/strong><\/li>\n<\/ul>\n<h4>\"cron_impl_2func_651_help\"\ub97c \uc218\ub3d9\uc73c\ub85c \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/h4>\n<p>\uc5d0\uc11c \ub450 \ubc88\uc9f8 \uc774\ubca4\ud2b8 \ud568\uc218\ub97c \ucd94\uac00\ud558\ub824\uba74 <strong>Couchbase \uc6f9 \ucf58\uc194 &gt; \uc774\ubca4\ud2b8 \uc124\uc815<\/strong> \ud398\uc774\uc9c0\uc5d0\uc11c <strong>\uae30\ub2a5 \ucd94\uac00<\/strong>\ub97c \ud074\ub9ad\ud558\uc5ec \uc0c8 \ud568\uc218\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \uc758 <strong>\uae30\ub2a5 \ucd94\uac00<\/strong> \ub300\ud654 \uc0c1\uc790\uac00 \ub098\ud0c0\ub0a9\ub2c8\ub2e4.<\/p>\n<p>\uc5d0\uc11c <strong>\uae30\ub2a5 \ucd94\uac00<\/strong> \ub300\ud654 \uc0c1\uc790\uc5d0\uc11c \uac1c\ubcc4 \ud568\uc218 \uc694\uc18c\uc5d0 \ub300\ud574 \uc544\ub798 \uc815\ubcf4\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4:<\/p>\n<ul>\n<li>\uc758 \uacbd\uc6b0 <strong>\uc18c\uc2a4 \ubc84\ud0b7<\/strong> \ub4dc\ub86d\ub2e4\uc6b4\uc5d0\uc11c <strong>\ud06c\ub860\ub370\uc774\ud130<\/strong>.<\/li>\n<li>\uc758 \uacbd\uc6b0 <strong>\uba54\ud0c0\ub370\uc774\ud130 \ubc84\ud0b7<\/strong> \ub4dc\ub86d\ub2e4\uc6b4\uc5d0\uc11c <strong>\uba54\ud0c0\ub370\uc774\ud130<\/strong>.<\/li>\n<li>\ub9cc\ub4e4\uae30 <strong>cron_impl_2func_651_help<\/strong>\u00a0\uc5d0\uc11c \uc0dd\uc131\ud558\ub294 \ud568\uc218\uc758 \uc774\ub984\uc785\ub2c8\ub2e4. <strong>\ud568\uc218 \uc774\ub984<\/strong> \ud14d\uc2a4\ud2b8 \uc0c1\uc790.<\/li>\n<li>[\uc120\ud0dd \ub2e8\uacc4] \ud14d\uc2a4\ud2b8 \uc785\ub825 <b>\ud06c\ub860\uacfc \uac19\uc740 \uc2a4\ucf00\uc904\ub7ec \ub3c4\uc6b0\ubbf8 \ud30c\ud2b8 1<\/b>\uc5d0\uc11c <strong>\uc124\uba85<\/strong> \ud14d\uc2a4\ud2b8 \uc0c1\uc790.<\/li>\n<li>\uc758 \uacbd\uc6b0 <strong>\uc124\uc815<\/strong> \uc635\uc158\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc73c\ub824\uba74 \uae30\ubcf8\uac12\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/li>\n<li>\uc758 \uacbd\uc6b0 <strong>\ubc14\uc778\ub529<\/strong> \uc635\uc158\uc744 \uc0ac\uc6a9\ud558\uc5ec \ud558\ub098\uc758 \ubc14\uc778\ub529\uc744 \ub9cc\ub4ed\ub2c8\ub2e4:<\/li>\n<li>\ubc14\uc778\ub529\uc758 \uacbd\uc6b0, \"\ubc84\ud0b7 \ubcc4\uce6d\"\uc740 \ub2e4\uc74c\uc744 \uc9c0\uc815\ud569\ub2c8\ub2e4. <strong>\ud06c\ub860_bkt<\/strong> \uc744 \ubc84\ud0b7\uc758 \"\ubcc4\uce6d \uc774\ub984\"\uc73c\ub85c \uc785\ub825\ud558\uace0, \ubc84\ud0b7\uc758 \"\ubcc4\uce6d \uc774\ub984\"\uc73c\ub85c<br \/>\n<strong>\ud06c\ub860\ub370\uc774\ud130<\/strong> \ub97c \uc5f0\uacb0\ub41c \ubc84\ud0b7\uc73c\ub85c \uc124\uc815\ud558\uace0 \ubaa8\ub4dc\ub294 \"\uc77d\uae30 \ubc0f \uc4f0\uae30\"\ub85c \uc124\uc815\ud574\uc57c \ud569\ub2c8\ub2e4.<\/li>\n<li>\uc124\uc815\uc744 \uad6c\uc131\ud55c \ud6c4 \ub300\ud654 \uc0c1\uc790\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \ud45c\uc2dc\ub429\ub2c8\ub2e4:<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8706\" style=\"margin-top: 12px\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/05\/ev_cr_1u_01_add_function_help.png\" alt=\"Eventing cron update\" width=\"643\" height=\"640\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function_help.png 1286w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function_help-300x299.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function_help-1024x1019.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function_help-150x150.png 150w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function_help-768x764.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function_help-65x65.png 65w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function_help-50x50.png 50w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_01_add_function_help-20x20.png 20w\" sizes=\"auto, (max-width: 643px) 100vw, 643px\" \/><\/li>\n<li>\uc5d0 \ud544\uc694\ud55c \ubaa8\ub4e0 \uc815\ubcf4\ub97c \uc81c\uacf5\ud55c \ud6c4 <strong>\uae30\ub2a5 \ucd94\uac00<\/strong> \ub300\ud654 \uc0c1\uc790\uc5d0\uc11c <strong>\ub2e4\uc74c: \ucf54\ub4dc \ucd94\uac00<\/strong>. . <strong>cron_impl_2func_651_help<\/strong> \ub300\ud654 \uc0c1\uc790\uac00 \ub098\ud0c0\ub0a9\ub2c8\ub2e4. \uadf8\ub7ec\uba74 <strong>cron_impl_2func_651_help<\/strong>\u00a0\ub300\ud654 \uc0c1\uc790\uc5d0\ub294 \ucc98\uc74c\uc5d0 \ud50c\ub808\uc774\uc2a4\ud640\ub354 \ucf54\ub4dc \ube14\ub85d\uc774 \ud3ec\ud568\ub429\ub2c8\ub2e4. \uc2e4\uc81c <strong>cron_impl_2func_651_help<\/strong>\u00a0\ucf54\ub4dc\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4.<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8710\" style=\"border: #000 1px solid;margin-top: 12px\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/05\/ev_cr_1u_02_code_editor_help.png\" alt=\"Eventing cron update\" width=\"800\" height=\"186\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_02_code_editor_help.png 2042w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_02_code_editor_help-300x70.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_02_code_editor_help-1024x239.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_02_code_editor_help-768x179.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_02_code_editor_help-1536x358.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_02_code_editor_help-20x5.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_02_code_editor_help-1320x308.png 1320w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/li>\n<li>\ub2e4\uc74c \uc774\ubca4\ud2b8 \ud568\uc218 \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \uc18c\uc2a4(187\uc904)\ub97c \ubcf5\uc0ac\ud558\uc5ec \ub2e4\uc74c \ud50c\ub808\uc774\uc2a4\ud640\ub354 \ucf54\ub4dc \ube14\ub85d\uc5d0 \ubd99\uc5ec\ub123\uc2b5\ub2c8\ub2e4. <strong>cron_impl_2func_651_help<\/strong>\n<pre class=\"height-set:true height:800 toolbar-overlay:false nums:false lang:js decode:true\">\/*\r\nFunction \"cron_impl_2func_651_help\" also requires \"cron_impl_2func_651\"\r\n\r\nTest Doc:\r\n   {\r\n        \"type\":\"recurring_event\",   \/\/ The KEY will be &lt;&lt;type&gt;&gt;::&lt;&lt;id&gt;&gt;\r\n        \"id\":1,                     \/\/\r\n        \"hour\":14,                  \/\/ The hour of the day 0-23, *, *2X, *4X to trigger\r\n        \"min\":54,                   \/\/ The minute in the hour 0-59, *, *2X, *4X to trigger\r\n        \"action\":\"doCronActionA\",   \/\/ What function to run on the trigger\r\n        \"active\":false,             \/\/ Flag to arm or disable this schedule\r\n        \"verbose\" : {\r\n          \"user_func\":2,            \/\/ Logging level for the action logic : 0=none, etc. etc.\r\n          \"scheduler\":3             \/\/ Logging level for the cron logic   : 0=none, etc. etc.\r\n        },\r\n        \"dynamic\" : {\r\n          \"state\":\"arm\",            \/\/ States \"arm\"|\"rearm\"|\"pending\" if any value but \"pending\" start a schedule\r\n          \"next_sched\": 0,          \/\/ Number of seconds since epoch to next desired schedule\r\n          \"prev_sched\": 0,          \/\/ Number of seconds since epoch for previous schedule\r\n          \"prev_etime\": 0,          \/\/ Number of seconds since epoch for previous schedule actual exec time\r\n          \"prev_delay\": 0,          \/\/ Number of seconds that the timer was delayed from the schedule\r\n          \"prev_atime\": 0           \/\/ Number of seconds taken by the user 'action'\r\n        }\r\n    }\r\n    \r\nNote, you can omit verbose{} and dynamic{} as they will be autocreated by the main Eventing \r\nFunction \"cron_impl_2func_651\". If verbose{} is missing the logging levels will default to \r\nverbose\" : {  \"user_func\":1, \"scheduler\":1 }\r\n*\/\r\n\r\nfunction tryBucketKvWriteWithLog(tag, key, doc) {\r\n  var success = false;\r\n  var tries = 0;\r\n  while (tries &lt; 10) {\r\n    tries++;\r\n    try {\r\n      \/\/ critical that the below succeeds, because if it doesn't the cron cycle will break\r\n      cron_bkt[key] = doc;\r\n      success = true;\r\n      break;\r\n    } catch (e) {\r\n      log(tag + ' ' + key + ' WARN failed to update KV tries ' + tries, e);\r\n    }\r\n  }\r\n  if (!success) {\r\n    log(tag + ' ' + +key + ' FATAL could not update KV cron cycle, tried ' + tries + ', stoping ' + curDoc.action);\r\n  }\r\n  return success;\r\n}\r\n\r\nfunction OnUpdate(doc, meta) {\r\n  \/\/ fix for 6.5.X growing bucket ops\r\n  if (meta.id.startsWith(\"fix_timer_scan_issue:\")) upsertOneDocPerBucket(doc, meta);\r\n  \r\n  try {\r\n    \/\/ Check that doc has desired values\r\n    if (!doc.type || doc.type !== \"recurring_event\" || !doc.active || doc.active != true) return;\r\n    \/\/ doc must have 'action', 'dynamic {}', verbose {}, dynamic.state\r\n    if (!doc.action || !doc.dynamic || !doc.verbose || !doc.dynamic.state) return;\r\n    \/\/ Only process state pending this will only exist for a 'breif' time\r\n    if (doc.dynamic.state !== \"pending\") return;\r\n\r\n    var mid = doc.type + '::' + doc.id; \/\/ make our KEY\r\n    var newdoc = null;\r\n    try {\r\n      \/\/ read the current version of doc from KV, e.g. curDoc\r\n      newdoc = cron_bkt[mid];\r\n    } catch (e) {} \/\/ needed for pre 6.5, note pure 6.5+ deployment returns null sans exception\r\n    \r\n    var reason = null;\r\n    if (!newdoc || newdoc == null) {\r\n      reason = \"cron document is missing\";\r\n    } else\r\n    if (!newdoc.active) {\r\n      reason = \"cron document has active = false\";\r\n    } else\r\n    if (!newdoc.dynamic.state || newdoc.dynamic.state !== doc.dynamic.state) {\r\n      reason = \"cron document wrong dynamic.state expected \" + doc.dynamic.state;\r\n    } else\r\n    if (crc64(doc) !== crc64(newdoc)) {\r\n      reason = \"cron document changed\";\r\n    }\r\n    if (reason != null) {\r\n      if (!newdoc || newdoc == null || newdoc.verbose.scheduler &gt;= 1) {\r\n        log('OnUpdate help: X stopping schedule because ' + reason + ',', newdoc)\r\n        return;\r\n      }\r\n    }\r\n\r\n    newdoc.dynamic.state = \"rearm\";\r\n    \/\/ cron_bkt[mid] = newdoc;\r\n    if (!tryBucketKvWriteWithLog('OnUpdate help: F', mid, newdoc)) {\r\n      \/\/ Failed to write newdoc to cron_bkt[key] the error has been logged\r\n      \/\/ and there is nothing more we can do.\r\n      return;\r\n    }\r\n\r\n    if (newdoc.verbose.scheduler &gt;= 1) {\r\n      log('OnUpdate help: A ' + mid + ' mutation #2 to doc to force schedule rearm');\r\n    }\r\n    if (newdoc.verbose.scheduler &gt;= 3) {\r\n      log('OnUpdate help: B ' + mid + ',', newdoc);\r\n    }\r\n  } catch (e) {\r\n    log('OnUpdate help: E ' + meta.id + ', Error exception:', e);\r\n  }\r\n}\r\n\r\n\/\/ FIXUP: ADDIN FUNCTON\r\n\/\/ fix for 6.5.X growing bucket ops\r\nfunction upsertOneDocPerBucket(doc, meta) {\r\n\r\n    var crcTable = makeCRC32Table();\r\n\r\n    \/\/ make one doc per bucket\r\n    var isVerbose = 0;\r\n    var isMacOS = false; \/\/ would be nice if this was an exposed constant in Eventing\r\n    var numvbs = 1024;   \/\/ default is linux\/PC\r\n    if (isMacOS) {\r\n        numvbs = 64;\r\n    }\r\n\r\n    var beg = (new Date).getTime();\r\n    var result = getKeysToCoverAllPartitions(crcTable, \"_tmp_vbs:\", numvbs);\r\n\r\n    for (var vb=0; vb&lt;numvbs; vb++) {\r\n        \/\/ brute force to fit a key prefix into a vBucket\r\n         var tst = result[vb];\r\n        if (isVerbose &gt; 1  || (isVerbose == 1) &amp;&amp; (vb &lt; 3 || vb &gt; numvbs -4)) {\r\n            log(\"KEY: \" + tst);\r\n        } else {\r\n            if (vb == 5) console.log(\"\\t*\\n\\t*\\n\\t*\");\r\n        }\r\n        \/\/ update the items to trigger a mutation for our PRIMARY fucntion\r\n        cron_bkt[tst] = { \"type\": \"_tmp_vbs\", \"vb\": vb, \"ts_millis\": beg, \"key\": tst };\r\n    }\r\n    var end = (new Date).getTime();\r\n    log(\"seeding one doc to each vBucket in primary_bucket alias (took \" + (end - beg) + \" mililis)\");\r\n}\r\n\r\n\/\/ FIXUP: ADDIN FUNCTON\r\n\/\/ fix for 6.5.X growing bucket ops\r\nfunction showHex(n) {\r\n    return n.toString(16);\r\n}\r\n\r\n\/\/ FIXUP: ADDIN FUNCTON\r\n\/\/ fix for 6.5.X growing bucket ops\r\nfunction makeCRC32Table() {\r\n    var crcTable = [];\r\n    var c;\r\n    for(var n =0; n &lt; 256; n++){\r\n        c = n;\r\n        for(var k =0; k &lt; 8; k++){\r\n            c = ((c&amp;1) ? (0xEDB88320 ^ (c &gt;&gt;&gt; 1)) : (c &gt;&gt;&gt; 1));\r\n        }\r\n        crcTable[n] = c;\r\n    }\r\n    return crcTable;\r\n}\r\n\r\n\/\/ FIXUP: ADDIN FUNCTON\r\n\/\/ fix for 6.5.X growing bucket ops\r\nfunction crc32(crcTable,str) {\r\n    var crc = 0 ^ (-1);\r\n    for (var i = 0; i &lt; str.length; i++ ) {\r\n        crc = (crc &gt;&gt;&gt; 8) ^ crcTable[(crc ^ str.charCodeAt(i)) &amp; 0xFF];\r\n    }\r\n    return (crc ^ (-1)) &gt;&gt;&gt; 0;\r\n}\r\n\r\n\/\/ FIXUP: ADDIN FUNCTON\r\n\/\/ fix for 6.5.X growing bucket ops\r\nfunction getKeysToCoverAllPartitions(crcTable,keyPrefix,partitionCount) {\r\n    var result = [];\r\n    var remaining = partitionCount;\r\n    for (var i = 0; remaining &gt; 0; i++) {\r\n      var key = keyPrefix + i;\r\n      var rv = (crc32(crcTable,key) &gt;&gt; 16) &amp; 0x7fff;\r\n      var actualPartition = rv &amp; partitionCount - 1;\r\n      if (!result[actualPartition] || result[actualPartition] === undefined) {\r\n        result[actualPartition] = key;\r\n        remaining--;\r\n      }\r\n    }\r\n    return result;\r\n}<\/pre>\n<\/li>\n<\/ul>\n<ul>\n<li>\ubd99\uc5ec\ub123\uae30\ub97c \ub9c8\uce58\uba74 \uc544\ub798\uc640 \uac19\uc740 \ud654\uba74\uc774 \ub098\ud0c0\ub0a9\ub2c8\ub2e4:<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8729\" style=\"border: #000 1px solid;margin-top: 12px\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/04\/ev_cr_1u_02_code_editor_done_help.png\" alt=\"Eventing cron update\" width=\"1020\" height=\"770\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/ev_cr_1u_02_code_editor_done_help.png 2044w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/ev_cr_1u_02_code_editor_done_help-300x227.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/ev_cr_1u_02_code_editor_done_help-1024x774.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/ev_cr_1u_02_code_editor_done_help-768x580.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/ev_cr_1u_02_code_editor_done_help-1536x1160.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/ev_cr_1u_02_code_editor_done_help-20x15.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/ev_cr_1u_02_code_editor_done_help-1320x997.png 1320w\" sizes=\"auto, (max-width: 1020px) 100vw, 1020px\" \/><\/li>\n<\/ul>\n<ul>\n<li>\ud074\ub9ad <strong>\uc800\uc7a5<\/strong>.<\/li>\n<li>\uc774\ubca4\ud2b8 \ud654\uba74\uc73c\ub85c \ub3cc\uc544\uac00\ub824\uba74 '<strong>&lt; \uc774\ubca4\ud2b8\ub85c \ub3cc\uc544\uac00\uae30<\/strong>' \ub9c1\ud06c(\ud3b8\uc9d1\uae30 \uc544\ub798)\ub97c \ud074\ub9ad\ud558\uac70\ub098 <strong>\uc774\ubca4\ud2b8<\/strong><\/li>\n<\/ul>\n<h3>\ub450 \uac00\uc9c0 \uae30\ub2a5 \ubc30\ud3ec<\/h3>\n<p>\uc774\uc81c \uc774\ubca4\ud2b8 \uae30\ub2a5\uc744 \uc2dc\uc791\ud560 \uc900\ube44\uac00 \ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc5d0\uc11c <strong>Couchbase \uc6f9 \ucf58\uc194 &gt; \uc774\ubca4\ud2b8 \uc124\uc815<\/strong>\u00a0\ud654\uba74\uc73c\ub85c \uc774\ub3d9\ud569\ub2c8\ub2e4:<\/p>\n<ul>\n<li>\ud568\uc218 \uc774\ub984\uc744 \ud074\ub9ad\ud569\ub2c8\ub2e4. <strong>cron_impl_2func_651_help<\/strong>\u00a0\uc744 \ud074\ub9ad\ud574 \ud568\uc218 \ucee8\ud2b8\ub864\uc744 \ud655\uc7a5\ud558\uace0 \ub178\ucd9c\ud569\ub2c8\ub2e4.<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8713\" style=\"border: #000 1px solid;margin-top: 12px\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/05\/ev_cr_1u_04_functon_ctl_help.png\" alt=\"Eventing cron update\" width=\"1020\" height=\"280\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_04_functon_ctl_help.png 2042w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_04_functon_ctl_help-300x82.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_04_functon_ctl_help-1024x281.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_04_functon_ctl_help-768x211.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_04_functon_ctl_help-1536x421.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_04_functon_ctl_help-20x5.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_04_functon_ctl_help-1320x362.png 1320w\" sizes=\"auto, (max-width: 1020px) 100vw, 1020px\" \/><\/li>\n<\/ul>\n<ul>\n<li>\ud074\ub9ad <strong>\ubc30\ud3ec<\/strong>.<\/li>\n<li>\uc5d0\uc11c <strong>\ubc30\ud3ec \uae30\ub2a5 \ud655\uc778<\/strong> \ub300\ud654 \uc0c1\uc790\uc5d0\uc11c \"<strong>\uc9c0\uae08\ubd80\ud130\"<\/strong> \ub97c \ud53c\ub4dc \uacbd\uacc4 \uc635\uc158\uc5d0\uc11c \uc120\ud0dd\ud569\ub2c8\ub2e4.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8535\" style=\"margin-top: 12px\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/04\/ev_cr_1_05_functon_deploy.png\" alt=\"\" width=\"382\" height=\"263\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/ev_cr_1_05_functon_deploy.png 764w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/ev_cr_1_05_functon_deploy-300x207.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/ev_cr_1_05_functon_deploy-20x14.png 20w\" sizes=\"auto, (max-width: 382px) 100vw, 382px\" \/><\/li>\n<\/ul>\n<p>\ub2e4\ub978 \uc774\ubca4\ud2b8 \ud568\uc218\ub97c \uc2dc\uc791\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uc5d0\uc11c <strong>Couchbase \uc6f9 \ucf58\uc194 &gt; \uc774\ubca4\ud2b8 \uc124\uc815<\/strong>\u00a0\ud654\uba74\uc73c\ub85c \uc774\ub3d9\ud569\ub2c8\ub2e4:<\/p>\n<ul>\n<li>\ud568\uc218 \uc774\ub984\uc744 \ud074\ub9ad\ud569\ub2c8\ub2e4. <strong>\ud06c\ub860_\uc784\ud50c_2func_651<\/strong>\u00a0\uc744 \ud074\ub9ad\ud574 \ud568\uc218 \ucee8\ud2b8\ub864\uc744 \ud655\uc7a5\ud558\uace0 \ub178\ucd9c\ud569\ub2c8\ub2e4.<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8712\" style=\"border: #000 1px solid;margin-top: 12px\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/05\/ev_cr_1u_04_functon_ctl.png\" alt=\"Eventing cron update\" width=\"1020\" height=\"365\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_04_functon_ctl.png 2042w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_04_functon_ctl-300x107.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_04_functon_ctl-1024x366.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_04_functon_ctl-768x275.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_04_functon_ctl-1536x549.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_04_functon_ctl-20x7.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_04_functon_ctl-1320x472.png 1320w\" sizes=\"auto, (max-width: 1020px) 100vw, 1020px\" \/><\/li>\n<li>\ud074\ub9ad <strong>\ubc30\ud3ec<\/strong>.<\/li>\n<li>\uc5d0\uc11c <strong>\ubc30\ud3ec \uae30\ub2a5 \ud655\uc778<\/strong> \ub300\ud654 \uc0c1\uc790\uc5d0\uc11c \"<strong>\uc9c0\uae08\ubd80\ud130\"<\/strong> \ub97c \ud53c\ub4dc \uacbd\uacc4 \uc635\uc158\uc5d0\uc11c \uc120\ud0dd\ud569\ub2c8\ub2e4.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8535\" style=\"margin-top: 12px\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/04\/ev_cr_1_05_functon_deploy.png\" alt=\"\" width=\"382\" height=\"263\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/ev_cr_1_05_functon_deploy.png 764w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/ev_cr_1_05_functon_deploy-300x207.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/ev_cr_1_05_functon_deploy-20x14.png 20w\" sizes=\"auto, (max-width: 382px) 100vw, 382px\" \/><\/li>\n<\/ul>\n<h3>\uc124\uc815 <em>cron<\/em> \uc791\uc5c5\uc744 \ubd84\ub2f9 \ub124(4) \ubc88 \uc2e4\ud589\ud569\ub2c8\ub2e4.<\/h3>\n<p>\uc774 \uc2dc\uc810\uc5d0\uc11c \uc774\ubca4\ud2b8 \ud568\uc218\ub294 \ud2b9\ud788 \ud65c\uc131=true \ud544\ub4dc\uac00 \uc788\ub294 type=\"recurring_event\"\uc758 \ubaa8\ub4e0 \ubb38\uc11c\uc5d0 \ub300\ud55c \ubcc0\ud615\uc744 \uae30\ub2e4\ub9ac\uace0 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc5d0\uc11c\u00a0<strong>Couchbase \uc6f9 \ucf58\uc194 &gt; \ucffc\ub9ac<\/strong>\u00a0\ud398\uc774\uc9c0\uc5d0\uc11c N1QL\uc744 \uc0ac\uc6a9\ud558\uc5ec '\uc5ec\ud589 \uc0d8\ud50c' \ubc84\ud0b7\uc5d0 \uc608\uc57d\ub41c \uc791\uc5c5\uc744 \uc0c8\ub85c \ub9cc\ub4e4\uaca0\uc2b5\ub2c8\ub2e4:<\/p>\n<ul>\n<li>\ub2e4\uc74c N1QL \ubb38\uc744 \uc798\ub77c\ub0b4\uc5b4 \ubd99\uc5ec\ub123\uae30\ud558\uc5ec <strong>\ucffc\ub9ac \ud3b8\uc9d1\uae30<\/strong>\n<pre class=\"toolbar-overlay:false nums:false lang:default decode:true\">INSERT INTO `crondata` (KEY,VALUE) VALUES (\r\n  \"recurring_event::1\", \r\n  {\r\n    \"type\": \"recurring_event\",\r\n    \"id\":1,\r\n    \"hour\":\"*\",\r\n    \"min\":\"0\",\r\n    \"action\": \"doCronActionA\",\r\n    \"verbose\": {\r\n      \"user_func\": 2,\r\n      \"scheduler\": 3\r\n    },\r\n    \"active\": false\r\n  }\r\n);<\/pre>\n<\/li>\n<\/ul>\n<ul>\n<li>\ud074\ub9ad <strong>\uc2e4\ud589<br \/>\n<\/strong><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8715\" style=\"border: #000 1px solid;margin-top: 12px\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/05\/ev_cr_1u_06_n1ql_add_sched.png\" alt=\"Eventing cron update\" width=\"817\" height=\"582\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_06_n1ql_add_sched.png 1634w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_06_n1ql_add_sched-300x214.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_06_n1ql_add_sched-1024x729.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_06_n1ql_add_sched-768x547.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_06_n1ql_add_sched-1536x1094.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_06_n1ql_add_sched-20x14.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_06_n1ql_add_sched-1320x940.png 1320w\" sizes=\"auto, (max-width: 817px) 100vw, 817px\" \/><\/li>\n<\/ul>\n<h3>\uccab \ubc88\uc9f8 <em>cron<\/em> \uc791\uc5c5<\/h3>\n<p>\uc774\uc804\uc5d0 \ub9cc\ub4e0 \uc81c\uc5b4 \ubb38\uc11c\ub294 \"active\":false\ub97c \uc9c0\uc815\ud588\uae30 \ub54c\ubb38\uc5d0 \ud65c\uc131\ud654\ub418\uc9c0 \uc54a\uc558\uace0, \ub610\ud55c \uc704\uc758 \uc77c\uc815\uc740 \ud55c \uc2dc\uac04\uc5d0 \ud55c \ubc88\ub9cc \uc2e4\ud589\ub418\uc9c0\ub9cc \uac00\uae4c\uc6b4 \uc2dc\uc77c \ub0b4\uc5d0 \ud14c\uc2a4\ud2b8\ud558\uc5ec \uc791\ub3d9\ud558\ub294\uc9c0 \ud655\uc778\ud558\ub824\uace0 \ud569\ub2c8\ub2e4.<\/p>\n<p>\uba3c\uc800 N1QL\uc5d0\uc11c \uc81c\uc5b4 \ubb38\uc11c\ub97c \uc870\uc791\ud560 \uc218 \uc788\ub294 \uc778\ub371\uc2a4\uac00 \ud544\uc694\ud558\uba70, \uc774 \uc791\uc5c5\uc740 \ud55c \ubc88\ub9cc \uc218\ud589\ud558\uba74 \ub429\ub2c8\ub2e4.<\/p>\n<ul>\n<li>\ub2e4\uc74c N1QL \ubb38\uc744 \uc798\ub77c\ub0b4\uc5b4 \ubd99\uc5ec\ub123\uae30\ud558\uc5ec <strong>\ucffc\ub9ac \ud3b8\uc9d1\uae30<\/strong>\n<pre class=\"toolbar-overlay:false nums:false lang:js decode:true\">\ud06c\ub860\ub370\uc774\ud130`\uc5d0 \uae30\ubcf8 \uc778\ub371\uc2a4\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4;<\/pre>\n<\/li>\n<\/ul>\n<p>\ub2e4\uc74c N1QL \ubb38\uc744 \uc798\ub77c\ub0b4\uc5b4 \ubd99\uc5ec\ub123\uae30\ud558\uc5ec <strong>\ucffc\ub9ac \ud3b8\uc9d1\uae30<\/strong>\uc774\uc81c \uc791\uc5c5\uc744 \ud65c\uc131\ud654\ud558\ub418 \ubc18\ubcf5 \uc77c\uc815\uc744 15\ucd08\ub9c8\ub2e4\ub85c \uc870\uc815\ud558\uc5ec \uc2dc\uc2a4\ud15c\uc774 \uc5b4\ub5bb\uac8c \uc791\ub3d9\ud558\ub294\uc9c0 \uc815\ud655\ud788 \ud655\uc778\ud558\uaca0\uc2b5\ub2c8\ub2e4.  \uc774\ub97c \uc704\ud574 KEY recurring_event::1\ub85c \uc81c\uc5b4 \ubb38\uc11c\ub97c \uc218\uc815\ud569\ub2c8\ub2e4.<\/p>\n<ul>\n<li>\n<pre class=\"toolbar-overlay:false nums:false lang:js decode:true\">UPDATE `crondata`\r\nSET active=TRUE, hour=\"*4X\", min=\"*4X\"\r\nWHERE type=\"recurring_event\" AND id=1 ;<\/pre>\n<\/li>\n<\/ul>\n<ul>\n<li>\ud074\ub9ad <strong>\uc2e4\ud589<br \/>\n<\/strong><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8716\" style=\"border: #000 1px solid;margin-top: 12px\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/05\/ev_cr_1u_07_n1ql_activate.png\" alt=\"Eventing cron update\" width=\"790\" height=\"420\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_07_n1ql_activate.png 1580w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_07_n1ql_activate-300x159.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_07_n1ql_activate-1024x544.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_07_n1ql_activate-768x408.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_07_n1ql_activate-1536x817.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_07_n1ql_activate-818x434.png 818w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_07_n1ql_activate-20x11.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_07_n1ql_activate-1320x702.png 1320w\" sizes=\"auto, (max-width: 790px) 100vw, 790px\" \/><\/li>\n<\/ul>\n<p>\ube44\ud45c\uc900 \uad6c\ubb38\uc778 =\"*4X\"\ub97c \uc0ac\uc6a9\ud558\uc5ec 1\ubd84\uc5d0 \ub124 \ubc88 \ubc18\ubcf5\ub418\ub294 \ud56d\ubaa9\uc744 \uc608\uc57d\ud558\uc5ec \uc791\uc5c5 \ud568\uc218\ub97c \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4. <strong>doCronActionA<\/strong> \ub97c \uc2e4\ud589\ud558\uace0 \ub85c\uadf8 \ubb38\uc744 \ud1b5\ud574 \ud568\uc218\ub97c \uc608\uc57d\ud558\ub294 \ud558\uc6b0\uc2a4\ud0a4\ud551 \ub85c\uc9c1\ub3c4 verbose=3\uc73c\ub85c \uc124\uc815\ud588\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4.<\/p>\n<p>\uc774\uc81c \uc2a4\ucf00\uc904\ub7ec\uac00 1\ubd84\uc5d0 4\ubc88 \uc2e4\ud589\ub418\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ud1b5\uacc4 \ubc0f \uc774\ubca4\ud2b8 \ud568\uc218\uc5d0 \ub300\ud55c \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ub85c\uadf8 \ud30c\uc77c\uc5d0\uc11c \ud65c\ub3d9\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <strong>\ud06c\ub860_\uc784\ud50c_2func_651 <\/strong>\uadf8\ub9ac\uace0 <strong>cron_impl_2func_651_help<\/strong>.<\/p>\n<ul>\n<li>\uc561\uc138\uc2a4\u00a0<strong>Couchbase \uc6f9 \ucf58\uc194 &gt; \ub300\uc2dc\ubcf4\ub4dc<\/strong> \ub97c \uc120\ud0dd\ud558\uba74 15\ucd08\ub9c8\ub2e4 \ud65c\ub3d9\uc774 \ud3ed\ubc1c\uc801\uc73c\ub85c \uc99d\uac00\ud558\ub294 \uac83\uc744 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4:<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8717\" style=\"border: #000 1px solid;margin-top: 12px\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/05\/ev_cr_1u_08_dashboard_activity.png\" alt=\"Eventing cron update\" width=\"1020\" height=\"532\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_08_dashboard_activity.png 2040w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_08_dashboard_activity-300x156.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_08_dashboard_activity-1024x534.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_08_dashboard_activity-768x401.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_08_dashboard_activity-1536x801.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_08_dashboard_activity-20x10.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_08_dashboard_activity-1320x688.png 1320w\" sizes=\"auto, (max-width: 1020px) 100vw, 1020px\" \/><\/li>\n<li>\uc561\uc138\uc2a4 <strong>Couchbase \uc6f9 \ucf58\uc194 &gt; \uc774\ubca4\ud2b8 \uc124\uc815<\/strong> \uc744 \ud074\ub9ad\ud558\uace0 <strong>\ub85c\uadf8<\/strong> \ubc30\ud3ec\ub41c \ub9c1\ud06c\uc758 <strong>\ud06c\ub860_\uc784\ud50c_2func_651<\/strong>\u00a0\uc774\ubca4\ud2b8 \ud568\uc218. \uc774 \ud568\uc218 \ub85c\uadf8 \ub300\ud654 \uc0c1\uc790\ub294 \ub85c\uadf8 \ubb38\uc744 \uc5ed\uc21c\uc73c\ub85c \ub098\uc5f4\ud569\ub2c8\ub2e4(\ucd5c\uc2e0 \ud56d\ubaa9\ubd80\ud130). \ucd08\uae30 \ucd9c\ub825\uc740 \ub2e4\uc74c\uacfc \ube44\uc2b7\ud569\ub2c8\ub2e4:\n<div style=\"border: 1px solid black;max-width: 1000px;padding: 4px;font-size: 60%;margin-top: 12px;margin-bottom: 12px\">2020-05-20T18:34:33.340-07:00 [INFO] \"OnUpdate B recurring_event::1 \ubc18\ubcf5 \ud0c0\uc774\uba38\uac00 \uc0dd\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4, timer_id 570927555481258455388\"<br \/>\n2020-05-20T18:34:33.340-07:00 [INFO] \"2020-05-20T18:34:45.000\uc5d0 recurring_event::1 rcv \ubcc0\uc774(\ucd08\uae30 \ub610\ub294 \uc7ac \ubb34\uc7a5) \uc2a4\ucf00\uc904 \ud0c0\uc774\uba38 \uc5c5\ub370\uc774\ud2b8\"<br \/>\n2020-05-20T18:34:33.233-07:00 [INFO] \"doCronActionA\ub97c KEY\ub85c KV\uc5d0 \uc5c5\uc11c\ud2b8 cron_cache::airlines_by_country cachedoc \" {\"type':\"cron_cache',\"id':\"airlines_by_country',\"date':\"2020-05-21T01:34:33.232Z',\"data':{\"\ubbf8\uad6d\":127,\"\uc601\uad6d\":39,\"\ud504\ub791\uc2a4\":21}}}}<br \/>\n2020-05-20T18:34:33.233-07:00 [INFO] \"\ucf5c\ubc31 R recurring_event::1 \ub3d9\uc791\uc5d0 0.013\ucd08\uac00 \uac78\ub838\uc2b5\ub2c8\ub2e4. \ucc38\uc744 \ubc18\ud658\ud588\uc2b5\ub2c8\ub2e4.\"<br \/>\n2020-05-20T18:34:33.233-07:00 [INFO] \"\ucf5c\ubc31 C recurring_event::1 curDoc\" {\"action\":\"doCronActionA\",\"active\":true,\"hour\":\"*4X\",\"id\":1,\"min\":\"*4X\",\"type\":\"recurring_event\",\"verbose\":{\"scheduler\":3,\"user_func\":2},\"dynamic\":{\"state\":\"pending\",\"next_sched\":1590024885,\"prev_sched\":1590024870,\"prev_time\":1590024873,\"prev_delay\":3.218,\u201dprev_atime\u201d:0.013}}<br \/>\n2020-05-20T18:34:33.233-07:00 [INFO] \"\ucf5c\ubc31 B recurring_event::1 sched 1590024870, \uc2e4\uc81c 1590024873, \uc9c0\uc5f0 3.218, \uac78\ub9b0 \uc2dc\uac04 0.013\"<br \/>\n2020-05-20T18:34:33.233-07:00 [INFO] \"2020-05-20T18:34:45.000\uc5d0 \uc2a4\ucf00\uc904 \uc7ac\uc7a5\uc804\uc744 \uac15\uc81c\ud558\uae30 \uc704\ud574 \ubb38\uc11c\uc5d0 recurring_event::1 \uc138\ub300 \ub3cc\uc5f0\ubcc0\uc774 #1 \ucf5c\ubc31\"<br \/>\n2020-05-20T18:34:33.232-07:00 [INFO] \"doCronActionA N1QL idx 2, \uad6d\uac00 \ud504\ub791\uc2a4 cnt 21\"<br \/>\n2020-05-20T18:34:33.232-07:00 [INFO] \"doCronActionA N1QL idx 1, \uad6d\uac00 \uc601\uad6d cnt 39\"<br \/>\n2020-05-20T18:34:33.232-07:00 [INFO] \"doCronActionA N1QL idx 0, \uad6d\uac00 \ubbf8\uad6d cnt 127\"<br \/>\n2020-05-20T18:34:33.220-07:00 [INFO] \"doCronActionA \uc0ac\uc6a9\uc790 \ub3d9\uc791\uc774 recurring_event::1\uc5d0 \uc758\ud574 \uc81c\uc5b4\ub428\"<br \/>\n2020-05-20T18:34:19.340-07:00 [INFO] \"OnUpdate B recurring_event::1 \ubc18\ubcf5 \ud0c0\uc774\uba38\uac00 \uc0dd\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4, timer_id 381384185845112994486\"<br \/>\n2020-05-20T18:34:19.340-07:00 [INFO] \"2020-05-20T18:34:30.000\uc5d0 recurring_event::1 rcv \ubcc0\uc774(\ucd08\uae30 \ub610\ub294 \uc7ac \ubb34\uc7a5) \uc2a4\ucf00\uc904 \ud0c0\uc774\uba38 \uc5c5\ub370\uc774\ud2b8\"<\/div>\n<p>\uac00\uc7a5 \uc544\ub798\ucabd\uc758 \uac00\uc7a5 \uc624\ub798\ub41c \uc904\uc740 \uc2a4\ucf00\uc904\uc744 \uc2dc\uc791\ud55c(\ub610\ub294 \uc2a4\ucf00\uc904\uc744 \ub2e4\uc2dc \ubb34\uc7a5\uc2dc\ud0a8) \ubcc0\uc774(\uc608: OnUpdate \uba54\uc2dc\uc9c0)\uc774\uba70, \ucf54\ub529\ud55c \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc758 \ucc98\uc74c \ub450 \uac1c\uc758 \uc804\uccb4 \uc2e4\ud589\uc744 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4. <strong>doCronActionA<\/strong><\/li>\n<li>\ub610\ud55c \"<em>6.5.X \ubc84\ud0b7 \uc791\uc5c5 \uc99d\uac00\uc5d0 \ub300\ud55c \uc218\uc815 \uc0ac\ud56d<\/em>\"\uc5d0 \uae30\ub85d\ub418\uc9c0\ub9cc <strong>cron_impl_2func_651_help<\/strong> \ub97c \ud074\ub9ad\ud558\uba74 \uc57d 30\ucd08\ub9c8\ub2e4 \ub2e4\uc74c\uacfc \uac19\uc740 \uba54\uc2dc\uc9c0\uac00 \ud45c\uc2dc\ub429\ub2c8\ub2e4:\n<div style=\"border: 1px solid black;max-width: 1000px;padding: 4px;font-size: 60%;margin-top: 12px;margin-bottom: 12px\">2020-05-20T18:34::49.185-07:00 [INFO] \"primary_bucket \ubcc4\uce6d\uc758 \uac01 vBucket\uc5d0 \ud558\ub098\uc758 \ubb38\uc11c \uc2dc\ub4dc\ud558\uae30(221\ubc00\ub9ac\ucd08 \uc18c\uc694)\"<\/div>\n<\/li>\n<\/ul>\n<p>\uc774 \ud2b9\uc815 \uc791\uc5c5\uc758 \ube48\ub3c4\uc640 \uc7a5\ud669\ud568\uc744 \ubaa8\ub450 \uc870\uc815\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.  \ud45c\uc900 <em>cron<\/em> \ub458 \ub2e4\uc5d0 '*' \uad6c\ubb38 <em>\uc2dc\uac04<\/em> \uadf8\ub9ac\uace0 <em>\ubd84<\/em> \ub85c \uc124\uc815\ud558\uc5ec \ud604\uc7ac \uc2e4\ud589 \uc911\uc778 \ube48\ub3c4\ubcf4\ub2e4 4\ubc30 \ub290\ub9b0 1\ubd84\uc5d0 \ud55c \ubc88\uc529 \ubc18\ubcf5\ub418\ub294 \uc2a4\ucf00\uc904\uc744 \uac00\uc838\uc635\ub2c8\ub2e4.   \ub610\ud55c \uc2a4\ucf00\uc904\ub7ec \ub85c\uc9c1\uc758 \uc0c1\uc138\ub3c4 \uc218\uc900\uc744 0\uc73c\ub85c \ub0ae\ucd94\uace0 \uc0ac\uc6a9\uc790 \ud568\uc218\ub97c 1\ub85c \ub0ae\ucd94\uc5b4 \ud638\ucd9c\ub2f9 \ud558\ub098\uc758 \uba54\uc2dc\uc9c0\ub9cc \ud45c\uc2dc\ub418\ub3c4\ub85d \ud569\ub2c8\ub2e4.<\/p>\n<p>\uc5d0\uc11c\u00a0<strong>Couchbase \uc6f9 \ucf58\uc194 &gt; \ucffc\ub9ac<\/strong>\u00a0\ud398\uc774\uc9c0\uc5d0\uc11c N1QL\uc744 \uc0ac\uc6a9\ud558\uc5ec '\uc5ec\ud589 \uc0d8\ud50c' \ubc84\ud0b7\uc5d0 \uc608\uc57d\ub41c \uc791\uc5c5\uc744 \uc0c8\ub85c \ub9cc\ub4e4\uaca0\uc2b5\ub2c8\ub2e4:<\/p>\n<ul>\n<li>\ub2e4\uc74c N1QL \ubb38\uc744 \uc798\ub77c\ub0b4\uc5b4 \ubd99\uc5ec\ub123\uae30\ud558\uc5ec <strong>\ucffc\ub9ac \ud3b8\uc9d1\uae30<\/strong>\n<pre class=\"toolbar-overlay:false nums:false lang:default decode:true\">UPDATE `crondata` \r\nSET verbose.scheduler = 0, verbose.user_func = 1, \r\n    active=true, hour=\"*\", min=\"*\" \r\nWHERE type=\"recurring_event\" AND id=1 ;<\/pre>\n<\/li>\n<\/ul>\n<ul>\n<li>\ud074\ub9ad <strong>\uc2e4\ud589<\/strong><\/li>\n<\/ul>\n<p>2\ubd84 \ub610\ub294 3\ubd84 \ud6c4\uc5d0 <strong>Couchbase \uc6f9 \ucf58\uc194 &gt; \uc774\ubca4\ud2b8 \uc124\uc815<\/strong> \uc744 \ud074\ub9ad\ud558\uace0 <strong>\ub85c\uadf8<\/strong> \ubc30\ud3ec\ub41c \ub9c1\ud06c\uc758 <strong>\ud06c\ub860_\uc784\ud50c_2func_651<\/strong>\u00a0\uc774\ubca4\ud2b8 \uae30\ub2a5.<\/p>\n<ul>\n<li>\uc774\uc81c \ubc18\ubcf5 \uc77c\uc815\uc774 1\ubd84\uc73c\ub85c \uc904\uc5b4\ub4e4\uace0 \ud6e8\uc52c \ub35c \uc7a5\ud669\ud574\uc84c\uc2b5\ub2c8\ub2e4. \uac01 \ud568\uc218 \uc2e4\ud589\ub9c8\ub2e4 \ub85c\uadf8 \uba54\uc2dc\uc9c0 \ub610\ub294 \uc904\uc774 \ud55c \uac1c\ub9cc \uc0dd\uc131\ub429\ub2c8\ub2e4(\ub2e4\uc2dc \ud55c \ubc88 \uc2dc\uac04 \uc5ed\uc21c\uc73c\ub85c).\n<div style=\"border: 1px solid black;max-width: 1000px;padding: 4px;font-size: 60%;margin-top: 12px;margin-bottom: 12px\">2020-05-20T18:43:04.231-07:00 [INFO] \"doCronActionA \uc0ac\uc6a9\uc790 \ub3d9\uc791\uc774 recurring_event::1\ub85c \uc81c\uc5b4\ub428\"<br \/>\n2020-05-20T18:42:08.233-07:00 [INFO] \"doCronActionA \uc0ac\uc6a9\uc790 \ub3d9\uc791\uc774 recurring_event::1\ub85c \uc81c\uc5b4\ub428\"<\/div>\n<p>\uc608\uc57d\ub41c \uac01 \uc0ac\uc6a9\uc790 \ud568\uc218 \uc2e4\ud589\uc5d0 \ub300\ud574 \ud558\ub098\uc758 \ub85c\uadf8 \uba54\uc2dc\uc9c0 \ub610\ub294 \uc904\ub9cc \uc804\uc1a1\ub429\ub2c8\ub2e4. <strong>doCronActionA<\/strong> (\ub2e4\uc2dc \ud55c \ubc88 \uc2dc\uac04 \uc5ed\uc21c\uc73c\ub85c).<\/li>\n<\/ul>\n<h3>\uc218\ud589 \uc911\uc778 \uc791\uc5c5\uc744 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/h3>\n<p>\uc774 \ucf54\ub4dc\ub294 \ubc18\ubcf5 \uc77c\uc815\uc5d0 \ub530\ub77c \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \ud568\uc218\ub97c \uc2e4\ud589\ud558\uae30 \uc704\ud55c \uc2e4\uc6a9\uc801\uc778 \ud504\ub808\uc784\uc6cc\ud06c\uc640 \ud568\uc218 <strong>doCronActionA<\/strong> \ub294 \uacc4\uc0b0\ub41c \uce90\uc2dc KV \ubb38\uc11c\ub97c 1\ubd84\uc5d0 \ud55c \ubc88\uc529 \uc5c5\uc11c\ud2b8(\uc0bd\uc785 \ub610\ub294 \uc5c5\ub370\uc774\ud2b8)\ud569\ub2c8\ub2e4.<\/p>\n<p>\ubc30\ud3ec\ub41c \uc774\ubca4\ud2b8 \ud568\uc218\uc758 \uacb0\uacfc\ub97c \ud655\uc778\ud558\ub824\uba74, \uc774\ubca4\ud2b8 \ud568\uc218\uc758 <strong>Couchbase \uc6f9 \ucf58\uc194 &gt; \ubc84\ud0b7<\/strong> \ud398\uc774\uc9c0\uc758 \ubb38\uc11c \ub9c1\ud06c\ub97c \ud074\ub9ad\ud558\uace0 <strong>\uc5ec\ud589 \uc0d8\ud50c<\/strong> \ubc84\ud0b7.<\/p>\n<ul>\n<li>\ud14d\uc2a4\ud2b8 \uc0c1\uc790\uc5d0 \"<strong>N1QL \uc5b4\ub514<\/strong>'\ub97c \uc785\ub825\ud569\ub2c8\ub2e4.\n<pre class=\"toolbar-overlay:false nums:false lang:default decode:true\">type=\"cron_cache\"<\/pre>\n<\/li>\n<\/ul>\n<ul>\n<li>\ud074\ub9ad <strong>\ubb38\uc11c \uac80\uc0c9<br \/>\n<\/strong>\uc774\uc81c \uc608\uc57d \ud568\uc218\uc5d0 \uc758\ud574 1\ubd84\uc5d0 \ud55c \ubc88\uc529 \uc5c5\ub370\uc774\ud2b8\ub418\ub294 \uce90\uc2dc \ubb38\uc11c cron_cache::airlines_by_country\uac00 \ud558\ub098\uc758 \ubb38\uc11c\ub85c \ud45c\uc2dc\ub429\ub2c8\ub2e4. <strong>doCronActionA<\/strong>.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8719\" style=\"border: #000 1px solid;margin-top: 12px\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/05\/ev_cr_1u_10_look_at_kv_cache_doc.png\" alt=\"Eventing cron update\" width=\"1020\" height=\"426\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_10_look_at_kv_cache_doc.png 2040w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_10_look_at_kv_cache_doc-300x125.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_10_look_at_kv_cache_doc-1024x428.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_10_look_at_kv_cache_doc-768x321.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_10_look_at_kv_cache_doc-1536x642.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_10_look_at_kv_cache_doc-20x8.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_10_look_at_kv_cache_doc-1320x551.png 1320w\" sizes=\"auto, (max-width: 1020px) 100vw, 1020px\" \/><\/li>\n<li>\uc544\uc774\ub514\ub97c \ud074\ub9ad\"<strong>\ud06c\ub860 \uce90\uc2dc::\uad6d\uac00\ubcc4 \ud56d\uacf5\uc0ac<\/strong>\"\uc758 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc5d0 \uc758\ud574 \uc5c5\ub370\uc774\ud2b8\ub418\ub294 \uce90\uc2dc\ub41c \ubb38\uc11c\ub97c \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4. <strong>doCronActionA<\/strong>.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8720\" style=\"margin-top: 12px\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/05\/ev_cr_1u_11_look_at_kv_cache_doc.png\" alt=\"Eventing cron update\" width=\"644\" height=\"377\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_11_look_at_kv_cache_doc.png 1288w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_11_look_at_kv_cache_doc-300x176.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_11_look_at_kv_cache_doc-1024x599.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_11_look_at_kv_cache_doc-768x450.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_11_look_at_kv_cache_doc-20x12.png 20w\" sizes=\"auto, (max-width: 644px) 100vw, 644px\" \/><br \/>\n\uc7a0\uc2dc \ud6c4 \ubb38\uc11c\ub97c \ub2e4\uc2dc \ud3b8\uc9d1\ud558\uba74 '\ub0a0\uc9dc' \ud544\ub4dc\uac00 \uc5c5\ub370\uc774\ud2b8\ub418\ub294 \uac83\uc744 \ubcfc \uc218 \uc788\uc73c\uba70, \ubb3c\ub860 \uc9c0\uae08\uc740 \uc18c\uc2a4 \ub370\uc774\ud130\uac00 '\uc815\uc801'\uc774\ubbc0\ub85c \uac1c\uc218\ub294 \ub3d9\uc77c\ud558\uac8c \uc720\uc9c0\ub429\ub2c8\ub2e4.<\/li>\n<\/ul>\n<h3>\uc81c\uc5b4 \ubb38\uc11c\ub97c \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/h3>\n<p>\uc774 \ucf54\ub4dc\ub294 \uac01 \uc2e4\ud589 \uc77c\uc815\uc5d0 \ub300\ud55c \uc57d\uac04\uc758 \ud1b5\uacc4\ub97c \uc720\uc9c0\ud558\uae30 \uc704\ud55c \ud504\ub808\uc784\uc6cc\ud06c\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n<p>\ubc30\ud3ec\ub41c \uc774\ubca4\ud2b8 \ud568\uc218\uc758 \ud1b5\uacc4\ub97c \ud655\uc778\ud558\ub824\uba74 \uc774\ubca4\ud2b8 \ud568\uc218\uc758 <strong>Couchbase \uc6f9 \ucf58\uc194 &gt; \ubc84\ud0b7<\/strong> \ud398\uc774\uc9c0\uc758 \ubb38\uc11c \ub9c1\ud06c\ub97c \ud074\ub9ad\ud558\uace0 <strong>\ud06c\ub860\ub370\uc774\ud130<\/strong> \ubc84\ud0b7.<\/p>\n<ul>\n<li>\ud14d\uc2a4\ud2b8 \uc0c1\uc790\uc5d0 \"<strong>N1QL \uc5b4\ub514<\/strong>'\ub97c \uc785\ub825\ud569\ub2c8\ub2e4.\n<pre class=\"toolbar-overlay:false nums:false lang:default decode:true\">type=\"recuring_event\"<\/pre>\n<\/li>\n<\/ul>\n<ul>\n<li>\ud074\ub9ad <strong>\ubb38\uc11c \uac80\uc0c9<br \/>\n<\/strong>\uc774\uc81c \uc608\uc57d\ub41c \ud568\uc218\ub97c \uad6c\ub3d9\ud558\ub294 \uc81c\uc5b4 \ubb38\uc11c recurring_event::1\uc774 \ud558\ub098\uc758 \ubb38\uc11c\ub85c \ud45c\uc2dc\ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4. <strong>doCronActionA<\/strong>.<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8721\" style=\"border: #000 1px solid;margin-top: 12px\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/05\/ev_cr_1u_12_look_at_control_doc.png\" alt=\"Eventing cron update\" width=\"1020\" height=\"426\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_12_look_at_control_doc.png 2040w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_12_look_at_control_doc-300x125.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_12_look_at_control_doc-1024x428.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_12_look_at_control_doc-768x321.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_12_look_at_control_doc-1536x642.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_12_look_at_control_doc-20x8.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_12_look_at_control_doc-1320x551.png 1320w\" sizes=\"auto, (max-width: 1020px) 100vw, 1020px\" \/><\/li>\n<li>\uc544\uc774\ub514\ub97c \ud074\ub9ad\"<strong>\ubc18\ubcf5_\uc774\ubca4\ud2b8::1<\/strong>\"\ub97c \uc785\ub825\ud558\uba74 \uc2a4\ucf00\uc904\ub7ec \ub85c\uc9c1\uc5d0 \uc758\ud574 \uc5c5\ub370\uc774\ud2b8\ub418\ub294 \uc81c\uc5b4 \ubb38\uc11c\uac00 JSON \uac1c\uccb4 \ub3d9\uc801\uc5d0 \uba87 \uac00\uc9c0 \ud1b5\uacc4\uc640 \ud568\uaed8 \ud45c\uc2dc\ub429\ub2c8\ub2e4.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8722\" style=\"margin-top: 12px\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/05\/ev_cr_1u_13_look_at_control_doc.png\" alt=\"Eventing cron update\" width=\"646\" height=\"473\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_13_look_at_control_doc.png 1292w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_13_look_at_control_doc-300x220.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_13_look_at_control_doc-1024x750.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_13_look_at_control_doc-768x562.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/05\/ev_cr_1u_13_look_at_control_doc-20x15.png 20w\" sizes=\"auto, (max-width: 646px) 100vw, 646px\" \/><br \/>\n\uc790\ub3d9\uc73c\ub85c \ucd94\uac00\ub418\ub294 \ubb38\uc11c\uc758 '\ub3d9\uc801' \ubd80\ubd84\uc5d0\ub294 \uc77c\ubd80 \ub514\ubc84\uadf8 \ud1b5\uacc4\uac00 \uc720\uc9c0\ub429\ub2c8\ub2e4:<\/li>\n<li>prev_sched: \ub9c8\uc9c0\ub9c9\uc73c\ub85c \uc2e4\ud589\ub41c \uc2a4\ucf00\uc904\uc758 \uc774\uc804 UNIX \ud0c0\uc784\uc2a4\ud0ec\ud504\uc785\ub2c8\ub2e4.<\/li>\n<li>\uc774\uc804_\uc2dc\uac04: \uc2a4\ucf00\uc904\uc774 \ub9c8\uc9c0\ub9c9\uc73c\ub85c \uc2e4\ud589\ub41c \uc2e4\uc81c UNIX \ud0c0\uc784\uc2a4\ud0ec\ud504\uc785\ub2c8\ub2e4.<\/li>\n<li>\uc774\uc804_\uc9c0\uc5f0: \uc774\uc804_\uc2a4\ucf00\uc904\uc5d0\uc11c \uc774\uc804_\uc2dc\uac04\uae4c\uc9c0\uc758 \uc9c0\uc5f0 \uc2dc\uac04\uc785\ub2c8\ub2e4.<\/li>\n<li>\uc774\uc804_\uc2dc\uac04: \uc774 \uc791\uc5c5\uc744 \uc2e4\ud589\ud558\ub294 \ub370 \uac78\ub9b0 \uc2dc\uac04, \uc989 doCronActionA\ub97c \uc2e4\ud589\ud558\ub294 \ub370 \uac78\ub9b0 \uc2dc\uac04\uc785\ub2c8\ub2e4.<\/li>\n<li>next_sched: \uc774 \uc791\uc5c5\uc5d0 \ub300\ud55c \ub2e4\uc74c \uc608\uc57d\ub41c \uc2e4\ud589\uc785\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p>\uac01 \uc77c\uc815\uc5d0 \ub300\ud574 JSON \ub3d9\uc801 \ud558\uc704 \uac1c\uccb4\uc5d0 \ubcf4\uad00\ub41c \uc774\ub7ec\ud55c \ud1b5\uacc4\ub294 \uc2a4\ucf00\uc904\ub9c1 \uc2dc\uc2a4\ud15c\uc774 \uc815\uc0c1\uc774\uace0 \uc2e4\ud589 \uc911\uc778 \uc791\uc5c5\uc774 \uc801\uc2dc\uc5d0 \uc644\ub8cc\ub418\uace0 \uc788\ub294\uc9c0 \ud655\uc778\ud558\ub294 \ub370 \uc720\uc6a9\ud569\ub2c8\ub2e4.<\/p>\n<h3>\ub370\uc774\ud130 \ubcc0\uacbd \uc2dc \uce90\uc2dc\uac00 \uc5c5\ub370\uc774\ud2b8\ub418\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4.<\/h3>\n<p>\uc758 \uc804\uccb4 \ubaa9\uc801\uc740 <strong>doCronActionA<\/strong> \ub294 \uc608\uc57d\ub41c \uc2dc\uac04 \ub610\ub294 \uadf8 \uadfc\ucc98\uc5d0\uc11c \uc791\uc5c5\uc744 \uc218\ud589\ud558\uace0 \"cron_cache::airlines_by_country\" KEY\ub85c \uce90\uc2dc \ubb38\uc11c\ub97c \uc5c5\ub370\uc774\ud2b8\ud558\ub294 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p>\ucffc\ub9ac \ubaa8\ub2c8\ud130\uc5d0\uc11c 1) \uce90\uc2dc \ubb38\uc11c\ub97c \ubcf4\uace0, 2) \uc5ec\ud589 \uc0d8\ud50c \ubb38\uc11c \uc138\ud2b8\uc5d0\uc11c \uc77c\ubd80 \ud56d\uacf5\uc0ac\ub97c \uc0ad\uc81c\ud558\uace0, 3) \ud568\uc218\uc5d0 \uc758\ud574 \uce90\uc2dc \ubb38\uc11c\uac00 \uc5c5\ub370\uc774\ud2b8\ub418\ub294\uc9c0 \ud655\uc778\ud558\uc5ec \uce90\uc2dc\uac00 \uc5c5\ub370\uc774\ud2b8\ub418\uace0 \uc788\ub294\uc9c0 \uba87 \uac00\uc9c0 \uac80\uc99d\uc744 \uc218\ud589\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4. <strong>doCronActionA<\/strong>.<\/p>\n<p>\uc5d0\uc11c\u00a0<strong>Couchbase \uc6f9 \ucf58\uc194 &gt; \ucffc\ub9ac<\/strong>\u00a0\ud398\uc774\uc9c0\uc5d0\uc11c\ub294 N1QL\uc744 \uc0ac\uc6a9\ud558\uc5ec '\uc5ec\ud589 \uc0d8\ud50c' \ubc84\ud0b7\uc758 \ub370\uc774\ud130\ub97c \ubcf4\uace0 \uc870\uc791\ud560 \uac83\uc785\ub2c8\ub2e4:<\/p>\n<ul>\n<li>\ub2e4\uc74c N1QL \ubb38\uc744 \uc798\ub77c\ub0b4\uc5b4 \ubd99\uc5ec\ub123\uae30\ud558\uc5ec<\/li>\n<li><strong>\ucffc\ub9ac \ud3b8\uc9d1\uae30<\/strong>\n<pre class=\"toolbar-overlay:false nums:false lang:js decode:true\">SELECT data FROM `travel-sample`\r\nWHERE `type` = 'cron_cache' AND id== 'airlines_by_country';<\/pre>\n<\/li>\n<li>\ud074\ub9ad <strong>\uc2e4\ud589<br \/>\n<\/strong>\ucffc\ub9ac \uc6cc\ud06c\ubca4\uce58\uc758 JSON \ubcf4\uae30\uc5d0\uc11c \ub2e4\uc74c\uc744 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4:<\/p>\n<pre class=\"toolbar-overlay:false nums:false lang:js decode:true\">[\r\n  {\r\n    \"data\": {\r\n      \"France\": 21,\r\n      \"United Kingdom\": 39,\r\n      \"United States\": 127\r\n    }\r\n  }\r\n]<\/pre>\n<\/li>\n<li>\ub2e4\uc74c N1QL \ubb38\uc744 \uc798\ub77c\ub0b4\uc5b4 \ubd99\uc5ec\ub123\uae30\ud558\uc5ec <strong>\ucffc\ub9ac \ud3b8\uc9d1\uae30<\/strong>\n<pre class=\"toolbar-overlay:false nums:false lang:js decode:true\">DELETE FROM `travel-sample`\r\nWHERE `type` = 'airline' AND callsign LIKE 'U%'<\/pre>\n<\/li>\n<li>\ud074\ub9ad <strong>\uc2e4\ud589<br \/>\n<\/strong>\ucffc\ub9ac \uc6cc\ud06c\ubca4\uce58\uc758 JSON \ubcf4\uae30\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc740 \ub0b4\uc6a9\uc774 \ud45c\uc2dc\ub429\ub2c8\ub2e4(\ubc29\uae08 \uc77c\ubd80 \ub370\uc774\ud130\ub97c \uc0ad\uc81c\ud588\uc2b5\ub2c8\ub2e4).<\/p>\n<pre class=\"toolbar-overlay:false nums:false lang:js decode:true\">{\r\n  \"results\": []\r\n}<\/pre>\n<\/li>\n<li>\uc7a0\uc2dc\ub9cc \uae30\ub2e4\ub824\uc8fc\uc138\uc694.<\/li>\n<li>\ub2e4\uc74c N1QL \ubb38\uc744 \uc798\ub77c\ub0b4\uc5b4 \ubd99\uc5ec\ub123\uae30\ud558\uc5ec <strong>\ucffc\ub9ac \ud3b8\uc9d1\uae30<\/strong>\n<pre class=\"toolbar-overlay:false nums:false lang:js decode:true\">SELECT data FROM `travel-sample`\r\nWHERE `type` = 'cron_cache' AND id== 'airlines_by_country';<\/pre>\n<\/li>\n<li><strong><span style=\"font-weight: 400\">\ud074\ub9ad <\/span>\uc2e4\ud589<br \/>\n<\/strong>\ucffc\ub9ac \uc6cc\ud06c\ubca4\uce58\uc758 JSON \ubcf4\uae30\uc5d0\uc11c 4\uac1c\uc758 \ud56d\uacf5\uc0ac\uac00 \ub354 \uc774\uc0c1 \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294 \uac83\uc744 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"toolbar-overlay:false nums:false lang:js decode:true\">[\r\n  {\r\n    \"data\": {\r\n      \"France\": 21,\r\n      \"United Kingdom\": 39,\r\n      \"United States\": 123\r\n    }\r\n  }\r\n]<\/pre>\n<\/li>\n<\/ul>\n<h3>\ub450 \ubc88\uc9f8 \uc608\uc57d\ub41c \uc791\uc5c5 \uc2dc\uc791<\/h3>\n<p>\uc774 \ucf54\ub4dc\ub294 \ubc18\ubcf5 \uc77c\uc815\uc5d0 \ub530\ub77c 1~N\uac1c\uc758 \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \ud568\uc218\ub97c \uc2e4\ud589\ud558\uae30 \uc704\ud55c \uc2e4\uc6a9\uc801\uc778 \ud504\ub808\uc784\uc6cc\ud06c\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n<p>\ud568\uc218 <strong>doCronActionA <\/strong>\ub294 \uacc4\uc18d 1\ubd84 \uc2a4\ucf00\uc904\ub85c \uc2e4\ud589\ub418\uc9c0\ub9cc \uc774\uc81c <strong>doCronActionB <\/strong>\ub97c 30\ucd08 \uac04\uaca9(1\ubd84\uc5d0 \ub450 \ubc88)\uc73c\ub85c \ud638\ucd9c\ud569\ub2c8\ub2e4.   \uc774 \ud568\uc218\ub294 \ube48 \uc178\uc774\uba70 \ud638\ucd9c\ub418\uc5c8\ub2e4\ub294 \uc0ac\uc2e4\ub9cc \uae30\ub85d\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc5d0\uc11c\u00a0<strong>Couchbase \uc6f9 \ucf58\uc194 &gt; \ucffc\ub9ac<\/strong> \ud398\uc774\uc9c0\uc758 \ub370\uc774\ud130\ub97c \ubcf4\uace0 \uc870\uc791\ud558\uae30 \uc704\ud574 N1QL\uc744 \uc0ac\uc6a9\ud558\uaca0\uc2b5\ub2c8\ub2e4.<strong>\ud06c\ub860\ub370\uc774\ud130<\/strong>' \ubc84\ud0b7\uc73c\ub85c \uc774\ub3d9\ud569\ub2c8\ub2e4:<\/p>\n<ul>\n<li>\ub2e4\uc74c N1QL \ubb38\uc744 \uc798\ub77c\ub0b4\uc5b4 \ubd99\uc5ec\ub123\uae30\ud558\uc5ec <strong>\ucffc\ub9ac \ud3b8\uc9d1\uae30<br \/>\n<\/strong><\/p>\n<pre class=\"toolbar-overlay:false nums:false lang:js decode:true\">INSERT INTO `crondata` (KEY,VALUE) VALUES (\r\n  \"recurring_event::2\", \r\n  {\r\n    \"type\":\"recurring_event\",\r\n    \"id\":2,\r\n    \"hour\":\"*2X\",\r\n    \"min\":\"*2X\",\r\n    \"action\":\"doCronActionB\",\r\n    \"verbose\": {\r\n      \"user_func\": 1,\r\n      \"scheduler\": 0\r\n    },\r\n    \"active\": true\r\n  }\r\n);<\/pre>\n<\/li>\n<li>\ud074\ub9ad <strong>\uc2e4\ud589<\/strong><\/li>\n<\/ul>\n<p>\uc774 \uc2dc\uc810\uc5d0\uc11c \uac01\uac01 \ub2e4\ub978 \uc2a4\ucf00\uc904\ub85c \uc2e4\ud589\ub418\ub294 \ub450(2) \uac1c\uc758 \uc11c\ub85c \ub2e4\ub978 \uc791\uc5c5\uc744 \uc2e4\ud589\ud558\uc5ec 2~3\ubd84 \uc815\ub3c4 \uae30\ub2e4\ub838\ub2e4\uac00 \ub85c\uadf8 \ud30c\uc77c\uc744 \ub2e4\uc2dc \uac80\uc0ac\ud569\ub2c8\ub2e4.<\/p>\n<ul>\n<li>\uc561\uc138\uc2a4 <strong>Couchbase \uc6f9 \ucf58\uc194 &gt; \uc774\ubca4\ud2b8 \uc124\uc815<\/strong> \uc744 \ud074\ub9ad\ud558\uace0 <strong>\ub85c\uadf8<\/strong> \ubc30\ud3ec\ub41c \ub9c1\ud06c\uc758 <strong><span class=\"cbui-table-cell cbui-tablerow-title ng-binding\">\ud06c\ub860_\uc784\ud50c_2func_651<\/span><\/strong>\u00a0\uc774\ubca4\ud2b8 \uae30\ub2a5.<br \/>\n\uac01 \ud568\uc218 \uc2e4\ud589\uc5d0 \ub300\ud574 \ud558\ub098\uc758 \ub85c\uadf8 \uba54\uc2dc\uc9c0 \ub610\ub294 \uc904\ub9cc \uc0dd\uc131\ub429\ub2c8\ub2e4(\ub2e4\uc2dc \ud55c \ubc88 \uc2dc\uac04 \uc21c\uc11c\uac00 \uc5ed\uc21c\uc73c\ub85c).  \ub2e4\uc74c\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <strong>doCronActionA<\/strong> 1\ubd84\uc5d0 \ud55c \ubc88\uc529 \ubc1c\uc0ac\ub418\ub294 \ub3d9\uc548<strong> doCronActionB <\/strong>\ub294 30\ucd08\uc5d0 \ud55c \ubc88\uc529 \ub450 \ubc88 \uc2e4\ud589\ub429\ub2c8\ub2e4.<\/p>\n<div style=\"border: 1px solid black;max-width: 1000px;padding: 4px;font-size: 60%;margin-top: 12px;margin-bottom: 12px\">2020-05-20T19:16:05.259-07:00 [INFO] \"doCronActionA \uc0ac\uc6a9\uc790 \ub3d9\uc791\uc774 recurring_event::1\ub85c \uc81c\uc5b4\ub428\"<br \/>\n2020-05-20T19:16:05.255-07:00 [INFO] \"recurring_event::2\uc5d0 \uc758\ud574 \uc81c\uc5b4\ub418\ub294 doCronActionB \uc0ac\uc6a9\uc790 \uc791\uc5c5\"<br \/>\n2020-05-20T19:15:37.253-07:00 [INFO] \"recurring_event::2\uc5d0 \uc758\ud574 \uc81c\uc5b4\ub418\ub294 doCronActionB \uc0ac\uc6a9\uc790 \uc791\uc5c5\"<br \/>\n2020-05-20T19:15:09.250-07:00 [INFO] \"doCronActionA \uc0ac\uc6a9\uc790 \ub3d9\uc791\uc774 recurring_event::1\uc5d0 \uc758\ud574 \uc81c\uc5b4\ub428\"<br \/>\n2020-05-20T19:15:09.249-07:00 [INFO] \"recurring_event::2\uc5d0 \uc758\ud574 \uc81c\uc5b4\ub418\ub294 doCronActionB \uc0ac\uc6a9\uc790 \uc791\uc5c5\"<br \/>\n2020-05-20T19:14:34.255-07:00 [INFO] \"recurring_event::2\uc5d0 \uc758\ud574 \uc81c\uc5b4\ub418\ub294 doCronActionB \uc0ac\uc6a9\uc790 \uc791\uc5c5\"<\/div>\n<\/li>\n<\/ul>\n<h3>[\uc120\ud0dd \uc0ac\ud56d] \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \uc77c\uc2dc \uc911\uc9c0\/\ud3b8\uc9d1\/\uc7ac\uac1c<\/h3>\n<p>\uc774\ubc88 \ud3b8\uc740 \ubcf8\uc9c8\uc801\uc73c\ub85c \ub05d\ub0ac\uc73c\ub2c8 \uc790\uc720\ub86d\uac8c \uc2e4\ud5d8\ud558\uace0 \uc218\uc815\ud558\uace0 \uc2e4\ud5d8\ud574 \ubcf4\uc138\uc694:<\/p>\n<p>\uc5d0\uc11c\u00a0<strong>Couchbase \uc6f9 \ucf58\uc194 &gt; \uc774\ubca4\ud2b8 \uc124\uc815<\/strong>\u00a0\ud654\uba74\uc73c\ub85c \uc774\ub3d9\ud569\ub2c8\ub2e4:<\/p>\n<ul>\n<li>\ud568\uc218 \uc774\ub984\uc744 \ud074\ub9ad\ud569\ub2c8\ub2e4. <strong><span class=\"cbui-table-cell cbui-tablerow-title ng-binding\">\ud06c\ub860_\uc784\ud50c_2func_651<\/span><\/strong>\u00a0\uc744 \ud074\ub9ad\ud574 \ud568\uc218 \ucee8\ud2b8\ub864\uc744 \ud655\uc7a5\ud558\uace0 \ub178\ucd9c\ud569\ub2c8\ub2e4.<\/li>\n<li>\ud074\ub9ad <strong>\uc77c\uc2dc \uc911\uc9c0<\/strong>.<\/li>\n<li>\uc5d0\uc11c <strong>\uc77c\uc2dc \uc815\uc9c0 \uae30\ub2a5 \ud655\uc778<\/strong> \ub300\ud654 \uc0c1\uc790\uc5d0\uc11c \"<strong>\uc77c\uc2dc \uc815\uc9c0 \uae30\ub2a5\"<\/strong>.<\/li>\n<li>\"<strong>\uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \ud3b8\uc9d1<\/strong>\"<\/li>\n<li>\uc790\uc2e0\uac10\uc774 \uc0dd\uacbc\ub2e4\uba74 <strong>doCronActionB <\/strong>\ud568\uc218\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc77c\ubd80 KV \uc5f0\uc0b0\uc744 \uc218\ud589\ud558\uac70\ub098 cURL\uacfc \ud1b5\ud569\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br \/>\n\ud568\uc218\uc5d0 \uac04\ub2e8\ud55c \ubcc0\uacbd \uc0ac\ud56d\ub9cc \ucd94\uac00\ud558\uace0 \uc2f6\ub2e4\uba74 \uc544\ub798\uc640 \uac19\uc774 \ud574\ubcf4\uc138\uc694:<\/p>\n<pre class=\"toolbar-overlay:false nums:false lang:js decode:true\">function doCronActionB(doc) {\r\n  try {\r\n    \/\/ check that doc has desired values\r\n    if (doc.type !== \"recurring_event\" || doc.active !== true) return;\r\n    if (doc.verbose.user_func &gt;= 1)\r\n      log(doc.action + ' user action controlled by ' + doc.type + '::' + doc.id);\r\n\r\n    \/\/ YOUR LOGIC HERE\r\n    var a = 1 + 7; \r\n    log('this is my logic, a = 1 +7 = ' + a);\r\n    \r\n  } catch (e) {\r\n    log(doc.action + ' Error exception:', e);\r\n    return false;\r\n  }\r\n  return true;\r\n}<\/pre>\n<\/li>\n<li>\ud074\ub9ad <strong>\uc800\uc7a5<\/strong>.<\/li>\n<li>\uc774\ubca4\ud2b8 \ud654\uba74\uc73c\ub85c \ub3cc\uc544\uac00\ub824\uba74 '<strong>&lt; \uc774\ubca4\ud2b8\ub85c \ub3cc\uc544\uac00\uae30<\/strong>' \ub9c1\ud06c(\ud3b8\uc9d1\uae30 \uc544\ub798)\ub97c \ud074\ub9ad\ud558\uac70\ub098 <strong>\uc774\ubca4\ud2b8<\/strong><\/li>\n<li>\ud074\ub9ad <strong>\uc774\ub825\uc11c<\/strong>.<\/li>\n<li>\uc5d0\uc11c <strong>\uc7ac\uac1c \uae30\ub2a5 \ud655\uc778<\/strong> \ub300\ud654 \uc0c1\uc790\uc5d0\uc11c \"<strong>\uae30\ub2a5 \uc7ac\uac1c\"<\/strong>.<\/li>\n<li>\uc57d 1 \ubd84 \uc815\ub3c4 \uae30\ub2e4\ub9b0 \ud6c4 \uae30\ub2a5 <strong><span class=\"cbui-table-cell cbui-tablerow-title ng-binding\">\ud06c\ub860_\uc784\ud50c_2func_651<\/span><\/strong>\u00a0\ubc30\ud3ec\ud558\ub824\uba74<\/li>\n<li>\ub97c \ud074\ub9ad\ud569\ub2c8\ub2e4. <strong>\ub85c\uadf8<\/strong> \ubc30\ud3ec\ub41c \ub9c1\ud06c\uc758 <strong><span class=\"cbui-table-cell cbui-tablerow-title ng-binding\">\ud06c\ub860_\uc784\ud50c_2func_651<\/span><\/strong>\u00a0\uc774\ubca4\ud2b8 \uae30\ub2a5.\n<div style=\"border: 1px solid black;max-width: 1000px;padding: 4px;font-size: 60%;margin-top: 12px;margin-bottom: 12px\">2020-05-20T19:20:41.343-07:00 [INFO] \"\uc774\uac83\uc774 \ub0b4 \ub17c\ub9ac\uc785\ub2c8\ub2e4, a = 1 +7 = 8\"<br \/>\n2020-05-20T19:20:41.343-07:00 [INFO] \"recurring_event::2\uc5d0 \uc758\ud574 \uc81c\uc5b4\ub418\ub294 doCronActionB \uc0ac\uc6a9\uc790 \uc791\uc5c5\"<\/div>\n<\/li>\n<\/ul>\n<h3>\uc815\ub9ac<\/h3>\n<p>\uc815\ub9ac\uc5d0\ub294 \ud568\uc218 \ubc30\ud3ec\ub97c \ucde8\uc18c\ud558\uace0 \uc0ad\uc81c\ud55c \ub2e4\uc74c \uc0dd\uc131\ud55c \ub450 \uac1c\uc758 \ubc84\ud0b7\uc744 \uc81c\uac70\ud558\ub294 \uc791\uc5c5\uc774 \ud3ec\ud568\ub429\ub2c8\ub2e4. \uc774\uac83\uc73c\ub85c \uc608\uc81c\ub97c \ub9c8\uce69\ub2c8\ub2e4.<\/p>\n<h4>\uae30\ub2a5 \uc81c\uac70<\/h4>\n<p>\uc5d0\uc11c <strong>Couchbase \uc6f9 \ucf58\uc194 &gt; \uc774\ubca4\ud2b8 \uc124\uc815<\/strong>\u00a0\ud654\uba74\uc73c\ub85c \uc774\ub3d9\ud569\ub2c8\ub2e4:<\/p>\n<ul>\n<li>\ud568\uc218 \uc774\ub984\uc744 \ud074\ub9ad\ud569\ub2c8\ub2e4. <strong><span class=\"cbui-table-cell cbui-tablerow-title ng-binding\">\ud06c\ub860_\uc784\ud50c_2func_651<\/span><\/strong>\u00a0\uc744 \ud074\ub9ad\ud574 \ud568\uc218 \ucee8\ud2b8\ub864\uc744 \ud655\uc7a5\ud558\uace0 \ub178\ucd9c\ud569\ub2c8\ub2e4.<\/li>\n<li>\ud074\ub9ad <strong>\ubc30\ud3ec \ucde8\uc18c<\/strong>.<\/li>\n<li>\uc5d0\uc11c <strong>\ubc30\ud3ec \ucde8\uc18c \uae30\ub2a5 \ud655\uc778<\/strong> \ub300\ud654 \uc0c1\uc790\uc5d0\uc11c \"<strong>\ubc30\ud3ec \ucde8\uc18c \uae30\ub2a5\"<\/strong>.<\/li>\n<li>\uae30\ub2a5 \ub300\uae30 <strong><span class=\"cbui-table-cell cbui-tablerow-title ng-binding\">\ud06c\ub860_\uc784\ud50c_2func_651<\/span><\/strong><strong>\u00a0<\/strong>\ub97c \ud074\ub9ad\ud558\uc5ec \ubc30\ud3ec\ub97c \ucde8\uc18c\ud569\ub2c8\ub2e4.<\/li>\n<li>\ud074\ub9ad <strong>\uc0ad\uc81c<\/strong>.<\/li>\n<li>\uc5d0\uc11c <strong>\uc0ad\uc81c \uae30\ub2a5 \ud655\uc778<\/strong> \ub300\ud654 \uc0c1\uc790\uc5d0\uc11c \"<strong>\uc0ad\uc81c \uae30\ub2a5\"<\/strong>.<\/li>\n<\/ul>\n<p>\uc5d0\uc11c\u00a0<strong>Couchbase \uc6f9 \ucf58\uc194 &gt; \uc774\ubca4\ud2b8 \uc124\uc815<\/strong>\u00a0\ud654\uba74\uc73c\ub85c \uc774\ub3d9\ud569\ub2c8\ub2e4:<\/p>\n<ul>\n<li>\ud568\uc218 \uc774\ub984\uc744 \ud074\ub9ad\ud569\ub2c8\ub2e4. <strong><span class=\"cbui-table-cell cbui-tablerow-title ng-binding\">cron_impl_2func_651_help<\/span><\/strong>\u00a0\uc744 \ud074\ub9ad\ud574 \ud568\uc218 \ucee8\ud2b8\ub864\uc744 \ud655\uc7a5\ud558\uace0 \ub178\ucd9c\ud569\ub2c8\ub2e4.<\/li>\n<li>\ud074\ub9ad <strong>\ubc30\ud3ec \ucde8\uc18c<\/strong>.<\/li>\n<li>\uc5d0\uc11c <strong>\ubc30\ud3ec \ucde8\uc18c \uae30\ub2a5 \ud655\uc778<\/strong> \ub300\ud654 \uc0c1\uc790\uc5d0\uc11c \"<strong>\ubc30\ud3ec \ucde8\uc18c \uae30\ub2a5\"<\/strong>.<\/li>\n<li>\uae30\ub2a5 \ub300\uae30 <strong><span class=\"cbui-table-cell cbui-tablerow-title ng-binding\">cron_impl_2func_651_help<\/span><\/strong><strong>\u00a0<\/strong>\ub97c \ud074\ub9ad\ud558\uc5ec \ubc30\ud3ec\ub97c \ucde8\uc18c\ud569\ub2c8\ub2e4.<\/li>\n<li>\ud074\ub9ad <strong>\uc0ad\uc81c<\/strong>.<\/li>\n<li>\uc5d0\uc11c <strong>\uc0ad\uc81c \uae30\ub2a5 \ud655\uc778<\/strong> \ub300\ud654 \uc0c1\uc790\uc5d0\uc11c \"<strong>\uc0ad\uc81c \uae30\ub2a5\"<\/strong>.<\/li>\n<\/ul>\n<h4>\ubc84\ud0b7 \uc81c\uac70<\/h4>\n<p>\ub2e4\uc74c \ubc84\ud0b7 \uc0ad\uc81c '<strong>\uba54\ud0c0\ub370\uc774\ud130<\/strong>' '<strong>\ud06c\ub860\ub370\uc774\ud130<\/strong>', '<strong>\uc5ec\ud589 \uc0d8\ud50c<\/strong>'(\uc5b8\uc81c\ub4e0\uc9c0 \ub2e4\uc2dc \ub9cc\ub4e4 \uc218 \uc788\uc74c).<\/p>\n<p>\uc5d0\uc11c <strong>Couchbase \uc6f9 \ucf58\uc194 &gt; \ubc84\ud0b7<\/strong> \ud398\uc774\uc9c0\uc758 \ubb38\uc11c \ub9c1\ud06c\ub97c \ud074\ub9ad\ud558\uace0 <strong>\uc5ec\ud589 \uc0d8\ud50c<\/strong> \ubc84\ud0b7.<\/p>\n<ul>\n<li><strong>\ud074\ub9ad<\/strong> \ubc84\ud0b7 \uc774\ub984\uc5d0 \"<strong>\uba54\ud0c0\ub370\uc774\ud130<\/strong>\"\ub97c \ud074\ub9ad\ud558\uc5ec \ucee8\ud2b8\ub864\uc744 \ud655\uc7a5\ud558\uace0 \ub178\ucd9c\ud569\ub2c8\ub2e4.<\/li>\n<li>\ud074\ub9ad <strong>\uc0ad\uc81c <\/strong><\/li>\n<li>\uc5d0\uc11c <strong>\ubc84\ud0b7 \uc0ad\uc81c \ud655\uc778<\/strong> \ub300\ud654 \uc0c1\uc790\uc5d0\uc11c \"<strong>\ubc84\ud0b7 \uc0ad\uc81c\"<\/strong>.<\/li>\n<li><strong>\ud074\ub9ad<\/strong> \ubc84\ud0b7 \uc774\ub984\uc5d0 \"<strong>\ud06c\ub860\ub370\uc774\ud130<\/strong>\"\ub97c \ud074\ub9ad\ud558\uc5ec \ucee8\ud2b8\ub864\uc744 \ud655\uc7a5\ud558\uace0 \ub178\ucd9c\ud569\ub2c8\ub2e4.<\/li>\n<li>\ud074\ub9ad <strong>\uc0ad\uc81c <\/strong><\/li>\n<li>\uc5d0\uc11c <strong>\ubc84\ud0b7 \uc0ad\uc81c \ud655\uc778<\/strong> \ub300\ud654 \uc0c1\uc790\uc5d0\uc11c \"<strong>\ubc84\ud0b7 \uc0ad\uc81c\"<\/strong>.<\/li>\n<li><strong>\ud074\ub9ad<\/strong> \ubc84\ud0b7 \uc774\ub984\uc5d0 \"<strong>\uc5ec\ud589 \uc0d8\ud50c<\/strong>\"\ub97c \ud074\ub9ad\ud558\uc5ec \ucee8\ud2b8\ub864\uc744 \ud655\uc7a5\ud558\uace0 \ub178\ucd9c\ud569\ub2c8\ub2e4.<\/li>\n<li>\ud074\ub9ad <strong>\uc0ad\uc81c <\/strong><\/li>\n<li>\uc5d0\uc11c <strong>\ubc84\ud0b7 \uc0ad\uc81c \ud655\uc778<\/strong> \ub300\ud654 \uc0c1\uc790\uc5d0\uc11c \"<strong>\ubc84\ud0b7 \uc0ad\uc81c\"<\/strong>.<\/li>\n<\/ul>\n<h3>\ucd5c\uc885 \uc0dd\uac01<\/h3>\n<p>\uc774 \uac00\uc774\ub4dc\uac00 \ub3c4\uc6c0\uc774 \ub418\uc168\uae30\ub97c \ubc14\ub77c\uba70, \uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc774\ubca4\ud2b8 \uc11c\ube44\uc2a4 \uc804\ubc18\uc5d0 \ub300\ud55c \uc774\ud574\ub3c4\uac00 \ub192\uc544\uc9c0\uc168\uae30\ub97c \ubc14\ub78d\ub2c8\ub2e4.<\/p>\n<p>\uc55e\uc11c Eventing\uc740 \ud568\uc218\uc640 \uad00\ub828\ub41c \uc18c\uc2a4 \ubc84\ud0b7\uc758 DCP \uc2a4\ud2b8\ub9bc\uc5d0\uc11c \ucd08\ub2f9 \uc218\ubc31\ub9cc \uac74\uc758 \uace0\uc18d \ubcc0\ud615\uc744 \ucc98\ub9ac\ud558\ub3c4\ub85d \uc124\uacc4\ub418\uc5c8\ub2e4\uace0 \uc5b8\uae09\ud588\uc2b5\ub2c8\ub2e4.  \uc774 Eventing \ud568\uc218 \ub610\ub294 \uc2a4\ucf00\uc904\ub7ec\ub294 \uc2a4\ucf00\uc904\ub7ec \ubb38\uc11c\uc758 \ucd5c\uc18c\ud55c\uc758 \ubcc0\uacbd\uc5d0\ub9cc \ubc18\uc751\ud558\uba74 \ub429\ub2c8\ub2e4.<\/p>\n<p>\uc81c\uc5b4 \ubb38\uc11c\ub97c \ucd94\uac00\ud558\ub294 \uac83\ub9cc\uc73c\ub85c \uc774 \ucf54\ub4dc\ub97c \ubcc0\uacbd\ud558\uc9c0 \uc54a\uace0 5,000\uac1c\uc758 \uc2a4\ucf00\uc904\uc744 \uc2dc\uc791\ud588\uc2b5\ub2c8\ub2e4. \uc2ec\uc9c0\uc5b4 \uc774 \uad6c\ud604\uc744 \ud14c\uc2a4\ud2b8\ud558\uae30 \uc704\ud574 \ub9e4\ubd84 120,000\uac1c\uc758 \uc2a4\ucf00\uc904\uc744 \uc2e4\ud589\ud558\uae30\ub3c4 \ud588\uc2b5\ub2c8\ub2e4(\uc608, 120,000\uac1c\ub294 \uc0c1\ub2f9\ud788 \ub9ce\uc740 \uc591\uc758 \ub3c5\ub9bd\uc801\uc778 \uc2a4\ucf00\uc904\uc785\ub2c8\ub2e4. <em>cron<\/em> \uc2a4\ucf00\uc904\uc744 \uc2e4\ud589\ud558\ub3c4\ub85d \uc124\uc815\ud588\uc2b5\ub2c8\ub2e4.)  \ub610\ud55c \ub9ac\uc18c\uc2a4 \uc800\ud558 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\ub3c4\ub85d 120,000\uac1c\uc758 sc3\uc2a4\ucf00\uc904\uc744 2\uc77c \ud6c4\ub85c \ubbf8\ub904\ub450\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uba54\uc778 \ud568\uc218\uc778 \uc2a4\ucf00\uc904\ub9c1 \uc2dc\uc2a4\ud15c\uc744 \ub9cc\ub4e4\uae30 \uc704\ud574 \ub450 \uac1c\uc758 \uc800\ub141 \ud568\uc218\ub97c \uc0ac\uc6a9\ud574\uc57c \ud569\ub2c8\ub2e4. <strong><span class=\"cbui-table-cell cbui-tablerow-title ng-binding\">\ud06c\ub860_\uc784\ud50c_2func_651<\/span><\/strong><span class=\"cbui-table-cell cbui-tablerow-title ng-binding\"> \uadf8\ub9ac\uace0 \uac04\ub2e8\ud55c \ub3c4\uc6b0\ubbf8 <\/span><strong><span class=\"cbui-table-cell cbui-tablerow-title ng-binding\">cron_impl_2func_651_help<\/span><\/strong><span class=\"cbui-table-cell cbui-tablerow-title ng-binding\"> \ub294 \uc81c\uac00 \uae30\ub300\ud588\ub358 \uac83\ub9cc\ud07c \uc6b0\uc544\ud558\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.  \uac8c\ub2e4\uac00 \ubaa8\ub4e0 vBucket\uc5d0\uc11c \ud0c0\uc774\uba38\ub97c \uc2e4\ud589\ud558\uc5ec \ubc84\ud0b7 \uc791\uc5c5 \ub204\uc218\ub97c \ud574\uacb0\ud574\uc57c \ud558\ub294 \uac83\uc740 \uc544\ubb34\ub9ac \ub9d0\ud574\ub3c4 \uc2e4\ub9dd\uc2a4\ub7ec\uc6e0\uc2b5\ub2c8\ub2e4. \ub2e4\ud589\ud788\ub3c4 \uc774\ub7ec\ud55c \ub178\ub825\uc73c\ub85c \uc778\ud574 \ubcc0\uacbd \uc0ac\ud56d\uc774 \uad6c\ud604\ub418\uc5c8\uace0 \uace7 \ucd9c\uc2dc\ub420 6.6.0 \ub9b4\ub9ac\uc2a4\uc5d0\uc11c\ub294 \uc800\ub141 \ud568\uc218 \ud558\ub098\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub354 \uae54\ub054\ud55c \uc2a4\ucf00\uc904\ub7ec\ub97c \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.   6.6\uc758 \uc8fc\uc694 \uac1c\uc120 \uc0ac\ud56d\uc740 1) \ud0c0\uc774\uba38 \ucf5c\ubc31 \ub0b4\uc5d0\uc11c \uc0c8 \ud0c0\uc774\uba38\ub97c \uc0dd\uc131\ud558\ub294 \uae30\ub2a5, 2) \ucc38\uc870\ub85c \uae30\uc874 \ud0c0\uc774\uba38\ub97c \ucde8\uc18c\ud558\uac70\ub098 \ub36e\uc5b4\uc4f0\ub294 \uae30\ub2a5, 3) \ud5a5\ud6c4 \ud0c0\uc774\uba38\uac00 \uc608\uc57d\ub41c \uc720\ud734 \uc2dc\uc2a4\ud15c\uc5d0\uc11c \ub9ac\uc18c\uc2a4 \uc0ac\uc6a9\ub7c9\uc774 \uc99d\uac00\ud558\ub294 \uac83\uc744 \uc81c\uac70\ud558\ub294 \uae30\ub2a5\uc785\ub2c8\ub2e4.<\/span><\/p>\n<p>\ub3c5\ub9bd\ud615 \ubc84\ud0b7 '<strong>\ud06c\ub860\ub370\uc774\ud130<\/strong>' \ub97c \uc0ac\uc6a9\ud558\uc5ec \uc77c\uc815\uc774\ub098 \uc81c\uc5b4 \ubb38\uc11c\ub97c \ubcf4\uad00\ud569\ub2c8\ub2e4( '<strong>\uba54\ud0c0\ub370\uc774\ud130<\/strong>' \ubc84\ud0b7\uc5d0 \ubc30\uce58\ud558\uc5ec \ub2e4\ub978 \ubc84\ud0b7\uc758 \ub370\uc774\ud130\ub97c \ucd5c\ub300\ud55c \uc720\uc5f0\ud558\uac8c \uc870\uc791\ud560 \uc218 \uc788\ub3c4\ub85d \ud588\uc2b5\ub2c8\ub2e4.    \uc81c\uc5b4 \ubb38\uc11c\ub97c \ub2e4\ub978 \ubc84\ud0b7\uc5d0 \ubc30\uce58\ud588\ub2e4\uba74 \ud574\ub2f9 \ubc84\ud0b7\uc5d0\uc11c N1QL \uc791\uc5c5\uc744 \ud560 \uc218 \uc5c6\uc5c8\uc744 \uac83\uc774\uace0(\uc774\ubca4\ud2b8 \ud568\uc218\uc5d0 \ub300\ud55c \uc18c\uc2a4 \ubc84\ud0b7\uc774\ubbc0\ub85c), \ubc30\uce58\ub41c \ubc84\ud0b7\uc758 \ub370\uc774\ud130\ub97c \uc870\uc791\ud558\uae30 \uc704\ud55c KV \uc791\uc5c5\uc73c\ub85c\ub9cc \uc81c\ud55c\ub418\uc5c8\uc744 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\ub978 \ud06c\ub860 \uc0ac\uc6a9 \uc0ac\ub840\ub3c4 \uc9c1\uc811 \uc2dc\ub3c4\ud574 \ubcf4\uc2dc\uace0 \uc608\uc57d \uc11c\ube44\uc2a4\ub97c \ud65c\uc6a9\ud558\ub294 \ub2e4\ub978 \ubc29\ubc95\ub3c4 \uc0dd\uac01\ud574 \ubcf4\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4:<\/p>\n<ul>\n<li>'\uc0ac\uc6a9\ub7c9\uc774 \uc801\uc740 \uc2dc\uac04\ub300'\uc5d0 \ub300\uaddc\ubaa8 \ub370\uc774\ud130 \uc138\ud2b8\uc758 \ud56d\ubaa9 \uc218\ub97c \ud655\uc778\ud558\uace0 \uc99d\ubd84 \uc81c\uac70\ub97c \uc218\ud589\ud569\ub2c8\ub2e4.<\/li>\n<li>N1QL\uc744 \ud1b5\ud574 \uc608\uc57d\ub41c \ubb38\uc11c \ubcf4\uac15\uc744 \uc218\ud589\ud569\ub2c8\ub2e4.<\/li>\n<li>\uc815\uae30\uc801\uc73c\ub85c \uc8fc\uc2dd \ud3ec\ud2b8\ud3f4\ub9ac\uc624\ub97c \ub2e4\uc2dc \uacc4\uc0b0\ud569\ub2c8\ub2e4.<\/li>\n<li>\ubc18\ubcf5 \uc77c\uc815\uc5d0 \ub530\ub77c N1QL\uc744 \ud1b5\ud574 TTL \ub610\ub294 \ub9cc\ub8cc \uc2dc\uac04 \uad00\ub9ac\ud558\uae30\ub294 \ub2e4\uc74c\uc744 \ucc38\uc870\ud558\uc138\uc694. <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/how-to-manage-ttl-with-couchbase-n1ql\/\">Couchbase N1QL\ub85c TTL(Time-To-Live) \ubb38\uc11c\ub97c \uad00\ub9ac\ud558\ub294 \ubc29\ubc95.<\/a><\/li>\n<li>\ubc18\ubcf5\ub418\ub294 \uc77c\uc815\uc5d0 \ub530\ub77c \uc678\ubd80 REST \uc5d4\ub4dc\ud3ec\uc778\ud2b8\uc640 \ud1b5\ud569\ud558\ub824\uba74 \ub2e4\uc74c\uc744 \ucc38\uc870\ud558\uc138\uc694. <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/using-curl-eventing-service-update\/\">\uc774\ubca4\ud2b8 \uc11c\ube44\uc2a4\uc640 \ud568\uaed8 cURL \uc0ac\uc6a9\ud558\uae30: \uc5c5\ub370\uc774\ud2b8<\/a>.<\/li>\n<li>\uc758 \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \uc5c5\ub370\uc774\ud2b8 <strong>\ud06c\ub860_\uc784\ud50c_2func_651<\/strong> \ub97c \uc0ac\uc6a9\ud558\uc5ec \uc774\uc804\uc5d0 \uc2e4\ud589\ub41c \uc0ac\uc6a9\uc790 \uc791\uc5c5\uc5d0\uc11c \ubc18\ud658\ub41c \ucc38\/\uac70\uc9d3 \uacb0\uacfc \ud50c\ub798\uadf8\ub97c \uc800\uc7a5\ud558\uae30 \uc704\ud574 JSON \ub3d9\uc801 \uac1d\uccb4\uc5d0 \uc0c8 \ud544\ub4dc 'prev_astatus'\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<h3>\uc5c5\ub370\uc774\ud2b8<\/h3>\n<p>\uc774 \ube14\ub85c\uadf8\ub294 2020\ub144 7\uc6d4 24\uc77c\uc5d0 \uc5c5\ub370\uc774\ud2b8\ub418\uc5b4 \uba54\ud0c0\ub370\uc774\ud130 \ubc84\ud0b7 \uc791\uc5c5 \uc218\uac00 \uc99d\uac00\ud558\ub294 6.5.x \ub9b4\ub9ac\uc2a4\uc5d0 \ub300\ud55c \ud574\uacb0 \ubc29\ubc95\uc744 \ucd94\uac00\ud558\uc5ec \ud5a5\ud6c4 \uc720\ud734 \uc2dc\uc2a4\ud15c\uc5d0\uc11c \ud0c0\uc774\uba38\ub97c \uc0dd\uc131\ud560 \ub54c(1\uc2dc\uac04 \uc774\uc0c1) \ud2b9\uc815 \uc774\ubca4\ud2b8 \ud568\uc218\uc5d0 \ub300\ud55c \ubcc0\uc774\ub97c \ucc28\ub2e8\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4(\uc608: 1\uc2dc\uac04 \uc774\uc0c1).<\/p>\n<h3>\ub2e4\uc74c \ub2e8\uacc4<\/h3>\n<p>\uba87 \uc8fc \ud6c4 \"<em>Couchbase Eventing\uc744 \ud1b5\ud55c \uac15\ub825\ud55c \ud734\ub300\uc6a9 \ud06c\ub860 \uac19\uc740 \uc2a4\ucf00\uc904\ub7ec \uad6c\ud604\ud558\uae30(2\ubd80)<\/em>\"\uc5d0\uc11c\ub294 \uc774\ubca4\ud2b8 \ud568\uc218\ub97c \ud3b8\uc9d1\ud558\uac70\ub098 \uc774\ubca4\ud2b8 \ud568\uc218 \ub0b4\uc5d0\uc11c \ud558\ub4dc\ucf54\ub529\ub41c \"\uc561\uc158\" \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc815\uc758\ud560 \ud544\uc694 \uc5c6\uc774 \uc77c\ub828\uc758 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uae30\ubc18 \ub3d9\uc801 N1QL \ubb38\uc744 \uc2e4\ud589\ud558\ub294 \ubc29\ubc95\uc744 \uc0b4\ud3b4\ubcfc \uc608\uc815\uc785\ub2c8\ub2e4.<\/p>\n<h3>\ub9ac\uc18c\uc2a4<\/h3>\n<ul>\n<li><em>\ub2e4\uc6b4\ub85c\ub4dc: <\/em><a href=\"https:\/\/www.couchbase.com\/blog\/ko\/downloads\/?family=server&amp;product=couchbase-server-developer\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc11c\ubc84 6.5.1 \ub2e4\uc6b4\ub85c\ub4dc<\/a><\/li>\n<li><em>\uc774\ubca4\ud2b8 \ud568\uc218: <\/em><a href=\"https:\/\/raw.githubusercontent.com\/couchbaselabs\/blog-source-code\/master\/Strabala\/CronFiles\/cron_impl_2func_651.json\">cron_impl_2func_651.json<\/a><\/li>\n<li><em>\uc774\ubca4\ud2b8 \ub3c4\uc6b0\ubbf8 \uae30\ub2a5:<\/em> <a href=\"https:\/\/raw.githubusercontent.com\/couchbaselabs\/blog-source-code\/master\/Strabala\/CronFiles\/cron_impl_2func_651_help.json\">\ud06c\ub860_impl_2func_651_help.json<\/a><\/li>\n<\/ul>\n<h3>\ucc38\uc870<\/h3>\n<ul>\n<li>\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc774\ubca4\ud2b8 \ubb38\uc11c:<br \/>\n<a href=\"https:\/\/docs.couchbase.com\/server\/current\/eventing\/eventing-overview.html\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/docs.couchbase.com\/server\/current\/eventing\/eventing-overview.html<\/a><\/li>\n<li>\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc11c\ubc84 6.5\uc758 \uc0c8\ub85c\uc6b4 \uae30\ub2a5:<br \/>\n<a href=\"https:\/\/docs.couchbase.com\/server\/6.5\/introduction\/whats-new.html\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/docs.couchbase.com\/server\/6.5\/introduction\/whats-new.html<\/a><\/li>\n<li>\uc774\ubca4\ud2b8\uc5d0 \ub300\ud55c \uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ube14\ub85c\uadf8:<br \/>\n<a href=\"https:\/\/www.couchbase.com\/blog\/ko\/tag\/eventing\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/www.couchbase.com\/blog\/tag\/eventing\/<\/a><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400\">6.5\uc758 \uae30\ub2a5\uc774 \ub9c8\uc74c\uc5d0 \ub4dc\uc168\ub294\uc9c0, \uc55e\uc73c\ub85c \ube44\uc988\ub2c8\uc2a4\uc5d0 \uc5b4\ub5a4 \ub3c4\uc6c0\uc774 \ub420\uc9c0 \uc5ec\ub7ec\ubd84\uc758 \uc758\uacac\uc744 \ub4e3\uace0 \uc2f6\uc2b5\ub2c8\ub2e4. \ub313\uae00\uc744 \ud1b5\ud574 \uc758\uacac\uc744 \uacf5\uc720\ud574 \uc8fc\uc138\uc694. <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/ko\/forums\/\"><span style=\"font-weight: 400\">\ud3ec\ub7fc<\/span><\/a><span style=\"font-weight: 400\">.\u00a0<\/span><\/p>\n<h3>\uac01\uc8fc<\/h3>\n<div style=\"font-size: 75%\">\n<p><a href=\"#footnote_1\"><sup>[1]<\/sup><\/a> Eventing Service\uc758 \ud0c0\uc774\uba38 \uad6c\ud604\uc740 \uc218\ubc31\ub9cc \uac1c\uc758 \ubd84\uc0b0 \ud0c0\uc774\uba38\ub97c \ube60\ub978 \uc18d\ub3c4\ub85c \ucc98\ub9ac\ud558\ub3c4\ub85d \uc124\uacc4\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ub2e8\uc77c \uc774\ubca4\ud2b8 \ub178\ub4dc\ub294 \ucd08\ub2f9 10\ub9cc \uac1c \uc774\uc0c1\uc758 \ud0c0\uc774\uba38\ub97c \ucc98\ub9ac\ud560 \uc218 \uc788\uc73c\uba70, \ud0c0\uc774\uba38\uac00 \uc190\uc2e4\ub418\uc9c0 \uc54a\ub3c4\ub85d \uac00\ub2a5\ud55c \ud55c \ube68\ub9ac \ud0c0\uc774\uba38\ub97c \uc2e4\ud589\ud558\ub294 \uac83\ub9cc\uc774 \uc720\uc77c\ud55c \uc57d\uc18d\uc785\ub2c8\ub2e4. \ud604\uc7ac \uc2a4\uce94 \uac04\uaca9\uc740 \uc2e4\ud589 \uc900\ube44\uac00 \uc644\ub8cc\ub41c \ud0c0\uc774\uba38\ub97c \uc218\uc9d1\ud558\ub294 \ub370 7\ucd08\uc774\ubbc0\ub85c \uc57d\uac04\uc758 \uc9c0\uc5f0\uc744 \uc608\uc0c1\ud574\uc57c \ud569\ub2c8\ub2e4. \ud0c0\uc774\uba38 \uc2a4\ucf00\uc904\ub9c1\uc5d0 \ub300\ud55c \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 \ub2e4\uc74c\uc744 \ucc38\uc870\ud558\uc138\uc694. <a href=\"https:\/\/docs.couchbase.com\/server\/6.5\/eventing\/eventing-timers.html#wall-clock-accuracy\">\ud0c0\uc774\uba38: \ubcbd\uc2dc\uacc4 \uc815\ud655\ub3c4<\/a> \ub97c \ucc38\uc870\ud558\uc138\uc694.<\/p>\n<p><a href=\"#footnote_2\"><sup>[2]<\/sup><\/a> \uc870\uc815\ud558\uc5ec <em>\ud5c8\uc6a9_\uc778\ud130\ubc84\ud0b7_\uc7ac\uadc0<\/em> \uc5d0 <em>true<\/em> \ub97c \uc0ac\uc6a9\ud558\uba74 \ubb34\ud55c \uc7ac\uadc0 \ub8e8\ud504\ub97c \uc2dc\uc791\ud560 \uc218 \uc788\ub294 \uc774\ubca4\ud2b8 \ub85c\uc9c1\uc774 \uc2e4\uc218\ub85c \ubc1c\uc0dd\ud558\ub294 \uac83\uc744 \ubc29\uc9c0\ud558\uae30 \uc704\ud574 Couchbase \uc11c\ubc84\uc5d0 \uc124\uc815\ub41c \uac00\ub4dc\ub97c \uc81c\uac70\ud558\uac8c \ub429\ub2c8\ub2e4.  \uc774\uac83\uc740 \uc798\ubabb\ub41c \uac83\uc740 \uc544\ub2c8\uc9c0\ub9cc \uc7ac\uadc0\ub97c \ud65c\uc6a9\ud560 \ub54c \uc2e4\uc218\ud558\uae30 \uc27d\uc2b5\ub2c8\ub2e4.  Couchbase \ubc84\uc804 6.6\uc5d0\uc11c\ub294 \uc774\ubca4\ud2b8 \ub85c\uc9c1\uc744 \uc870\uc815\ud560 \ub54c \ub450(2) \uac1c\uc758 \uc774\ubca4\ud2b8 \ud568\uc218\uc5d0\uc11c \ud558\ub098\uc758 \ub2e8\uc21c\ud654\ub41c \uc774\ubca4\ud2b8 \ud568\uc218(1)\ub85c \ucd95\uc18c\ud560 \uc218 \uc788\uc73c\uba70, \uc870\uc815\ud560 \ud544\uc694\uac00 \uc5c6\uc2b5\ub2c8\ub2e4. <em>\ud5c8\uc6a9_\uc778\ud130\ubc84\ud0b7_\uc7ac\uadc0<\/em> \uc124\uc815\ud569\ub2c8\ub2e4.<\/p>\n<p><a href=\"#footnote_3\"><sup>[3]<\/sup><\/a> \ub450 \uac00\uc9c0 \uc8fc\uc694 \uc81c\ud55c \uc0ac\ud56d\uc774 \uc874\uc7ac\ud569\ub2c8\ub2e4. \uccab\uc9f8, \ubb38\uc11c\uac00 \ub2e8\uae30\uac04\uc5d0 \uc5ec\ub7ec \ubc88 \uc218\uc815\ub418\ub294 \uacbd\uc6b0 \uc911\ubcf5 \uc81c\uac70\ub85c \uc778\ud574 \ud638\ucd9c\uc774 \ub2e8\uc77c \uc774\ubca4\ud2b8\ub85c \ud569\uccd0\uc9c8 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub458\uc9f8, \ub9cc\ub4e4\uae30 \uc791\uc5c5\uacfc \uc5c5\ub370\uc774\ud2b8 \uc791\uc5c5\uc744 \uad6c\ubd84\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.  \uc81c\uc548\uc758 \uacbd\uc6b0 <em>cron<\/em> \ud568\uc218\uc5d0 \ub300\ud55c \uc81c\ud55c\uc740 \ubb38\uc81c\uac00 \ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/p>\n<p><a href=\"#footnote_4\"><sup>[4]<\/sup><\/a> \uc815\ud655\ud55c \ud06c\ub860\ud0ed \uc2dc\ub9e8\ud2f1\uc744 \uad6c\ud604\ud558\uc9c0 \uc54a\uc740 \uc774\uc720\ub294 \uad6c\ud604\ud560 \uc218 \uc788\uc5c8\uc9c0\ub9cc \ucf54\ub4dc\uc758 \uc591\uc774 \ub108\ubb34 \ub9ce\uc558\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4. <a href=\"https:\/\/github.com\/kelektiv\/node-cron\">https:\/\/github.com\/kelektiv\/node-cron<\/a> \ud328\ud0a4\uc9c0\ub97c \ubaa8\uba58\ud2b8 \ubc0f \ubaa8\uba58\ud2b8 \uc2dc\uac04\ub300\uc758 \uc885\uc18d\uc131(\ubaa8\ub450 \ub9e4\uc6b0 \ud070 \ud328\ud0a4\uc9c0)\uacfc \ud568\uaed8 \uc0ac\uc6a9\ud574\uc57c \ud569\ub2c8\ub2e4.  getNextRecurringDate(hour_str, min_str)\ub294 \uc720\uc5f0\uc131\uc740 \ub5a8\uc5b4\uc9c0\uc9c0\ub9cc \uac04\ub2e8\ud558\uace0 \uc0ac\uc6a9 \uc0ac\ub840\uc5d0 \uc801\ud569\ud569\ub2c8\ub2e4.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>This is the first of a multi-part series to leverage the Couchbase Eventing Service to run multiple scheduled tasks at specific recurring intervals in a cron like fashion completely inside the database without requiring additional infrastructure via a single general-purpose [&hellip;]<\/p>","protected":false},"author":42711,"featured_media":8494,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1814,1815,1821,2225,1816,1819,2273,2389,1812],"tags":[],"ppma_author":[9113],"class_list":["post-8489","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-design","category-best-practices-and-tutorials","category-couchbase-architecture","category-cloud","category-couchbase-server","category-data-modeling","category-eventing","category-solutions","category-n1ql-query"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Implementing a Scheduler Via Couchbase Eventing (Part 1)<\/title>\n<meta name=\"description\" content=\"In this tutorial, you&#039;ll learn about running fixed user routines and JavaScript functions defined inside an Eventing Function.\" \/>\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\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Implementing a Scheduler Via Couchbase Eventing (Part 1)\" \/>\n<meta property=\"og:description\" content=\"In this tutorial, you&#039;ll learn about running fixed user routines and JavaScript functions defined inside an Eventing Function.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/ko\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T17:50:02+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T05:40:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Schema_Orloj_pragueorlojhzenilc-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1920\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Jon Strabala, Principal Product Manager, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jon Strabala, Principal Product Manager, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"73\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/\"},\"author\":{\"name\":\"Jon Strabala, Principal Product Manager, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c991579f88217edee79ffedb6fc914cc\"},\"headline\":\"Implementing a Scheduler Via Couchbase Eventing (Part 1)\",\"datePublished\":\"2020-05-22T17:50:02+00:00\",\"dateModified\":\"2025-06-14T05:40:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/\"},\"wordCount\":8614,\"commentCount\":3,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Schema_Orloj_pragueorlojhzenilc-scaled.jpg\",\"articleSection\":[\"Application Design\",\"Best Practices and Tutorials\",\"Couchbase Architecture\",\"Couchbase Capella\",\"Couchbase Server\",\"Data Modeling\",\"Eventing\",\"Solutions\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/\",\"name\":\"Implementing a Scheduler Via Couchbase Eventing (Part 1)\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Schema_Orloj_pragueorlojhzenilc-scaled.jpg\",\"datePublished\":\"2020-05-22T17:50:02+00:00\",\"dateModified\":\"2025-06-14T05:40:23+00:00\",\"description\":\"In this tutorial, you'll learn about running fixed user routines and JavaScript functions defined inside an Eventing Function.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Schema_Orloj_pragueorlojhzenilc-scaled.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Schema_Orloj_pragueorlojhzenilc-scaled.jpg\",\"width\":2560,\"height\":1920,\"caption\":\"Prague Astronomical Clock\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Implementing a Scheduler Via Couchbase Eventing (Part 1)\"}]},{\"@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\/c991579f88217edee79ffedb6fc914cc\",\"name\":\"Jon Strabala, Principal Product Manager, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/9c6045b0c2f7b07b0ee10f94ad748a25\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/db52a9f6d84faba430dd38106cdbc16ff02c2066b103b5f6b4cfcde40e83c683?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/db52a9f6d84faba430dd38106cdbc16ff02c2066b103b5f6b4cfcde40e83c683?s=96&d=mm&r=g\",\"caption\":\"Jon Strabala, Principal Product Manager, Couchbase\"},\"description\":\"Jon Strabala is a Principal Product Manager, responsible for the Couchbase Eventing Service. Before joining Couchbase, he spent more than 20 years building software products across various domains, starting with EDA in aerospace then transitioning to building enterprise software focused on what today is coined \u201cIoT\u201d and \u201cat-scale data.\u201d Jon worked for several small software consultancies until eventually starting and managing his own firm. He has extensive experience in NoSQL\/NewSQL, both in contributing and commercializing new technologies such as compressed bitmaps and column stores. Jon holds a bachelor\u2019s degree in electrical engineering and a master's in computer engineering, both from the University of Southern California, and an MBA from the University of California at Irvine.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/ko\/author\/jon-strabala\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc774\ubca4\ud305\uc744 \ud1b5\ud55c \uc2a4\ucf00\uc904\ub7ec \uad6c\ud604\ud558\uae30(1\ubd80)","description":"In this tutorial, you'll learn about running fixed user routines and JavaScript functions defined inside an Eventing Function.","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\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/","og_locale":"ko_KR","og_type":"article","og_title":"Implementing a Scheduler Via Couchbase Eventing (Part 1)","og_description":"In this tutorial, you'll learn about running fixed user routines and JavaScript functions defined inside an Eventing Function.","og_url":"https:\/\/www.couchbase.com\/blog\/ko\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/","og_site_name":"The Couchbase Blog","article_published_time":"2020-05-22T17:50:02+00:00","article_modified_time":"2025-06-14T05:40:23+00:00","og_image":[{"width":2560,"height":1920,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Schema_Orloj_pragueorlojhzenilc-scaled.jpg","type":"image\/jpeg"}],"author":"Jon Strabala, Principal Product Manager, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Jon Strabala, Principal Product Manager, Couchbase","Est. reading time":"73\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/"},"author":{"name":"Jon Strabala, Principal Product Manager, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c991579f88217edee79ffedb6fc914cc"},"headline":"Implementing a Scheduler Via Couchbase Eventing (Part 1)","datePublished":"2020-05-22T17:50:02+00:00","dateModified":"2025-06-14T05:40:23+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/"},"wordCount":8614,"commentCount":3,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Schema_Orloj_pragueorlojhzenilc-scaled.jpg","articleSection":["Application Design","Best Practices and Tutorials","Couchbase Architecture","Couchbase Capella","Couchbase Server","Data Modeling","Eventing","Solutions","SQL++ \/ N1QL Query"],"inLanguage":"ko-KR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/","url":"https:\/\/www.couchbase.com\/blog\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/","name":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc774\ubca4\ud305\uc744 \ud1b5\ud55c \uc2a4\ucf00\uc904\ub7ec \uad6c\ud604\ud558\uae30(1\ubd80)","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Schema_Orloj_pragueorlojhzenilc-scaled.jpg","datePublished":"2020-05-22T17:50:02+00:00","dateModified":"2025-06-14T05:40:23+00:00","description":"In this tutorial, you'll learn about running fixed user routines and JavaScript functions defined inside an Eventing Function.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Schema_Orloj_pragueorlojhzenilc-scaled.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/04\/Schema_Orloj_pragueorlojhzenilc-scaled.jpg","width":2560,"height":1920,"caption":"Prague Astronomical Clock"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/implementing-a-robust-portable-cron-like-scheduler-via-couchbase-eventing-part-1\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Implementing a Scheduler Via Couchbase Eventing (Part 1)"}]},{"@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\/c991579f88217edee79ffedb6fc914cc","name":"Jon Strabala, \uc218\uc11d \uc81c\ud488 \uad00\ub9ac\uc790, Couchbase","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/9c6045b0c2f7b07b0ee10f94ad748a25","url":"https:\/\/secure.gravatar.com\/avatar\/db52a9f6d84faba430dd38106cdbc16ff02c2066b103b5f6b4cfcde40e83c683?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/db52a9f6d84faba430dd38106cdbc16ff02c2066b103b5f6b4cfcde40e83c683?s=96&d=mm&r=g","caption":"Jon Strabala, Principal Product Manager, Couchbase"},"description":"\uc874 \uc2a4\ud2b8\ub77c\ubc1c\ub77c\ub294 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc774\ubca4\ud2b8 \uc11c\ube44\uc2a4\ub97c \ub2f4\ub2f9\ud558\ub294 \uc218\uc11d \uc81c\ud488 \uad00\ub9ac\uc790\uc785\ub2c8\ub2e4. Couchbase\uc5d0 \uc785\uc0ac\ud558\uae30 \uc804\uc5d0\ub294 \ud56d\uacf5\uc6b0\uc8fc \ubd84\uc57c\uc758 EDA\ub97c \uc2dc\uc791\uc73c\ub85c \uc624\ub298\ub0a0 \"IoT\"\uc640 \"\ub300\uaddc\ubaa8 \ub370\uc774\ud130\"\uc5d0 \ucd08\uc810\uc744 \ub9de\ucd98 \uc5d4\ud130\ud504\ub77c\uc774\uc988 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uad6c\ucd95\uc73c\ub85c \uc804\ud658\ud558\ub294 \ub4f1 20\ub144 \uc774\uc0c1 \ub2e4\uc591\ud55c \uc601\uc5ed\uc5d0\uc11c \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc81c\ud488\uc744 \uad6c\ucd95\ud588\uc2b5\ub2c8\ub2e4. Jon\uc740 \uc5ec\ub7ec \uc18c\uaddc\ubaa8 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \ucee8\uc124\ud305 \ud68c\uc0ac\uc5d0\uc11c \uadfc\ubb34\ud558\ub2e4\uac00 \uacb0\uad6d \uc790\uc2e0\uc758 \ud68c\uc0ac\ub97c \uc124\ub9bd\ud558\uace0 \uacbd\uc601\ud558\uac8c \ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uadf8\ub294 \uc555\ucd95 \ube44\ud2b8\ub9f5\uacfc \uceec\ub7fc \uc2a4\ud1a0\uc5b4\uc640 \uac19\uc740 \uc0c8\ub85c\uc6b4 \uae30\uc220\uc5d0 \uae30\uc5ec\ud558\uace0 \uc0c1\uc6a9\ud654\ud558\ub294 \ub370 \uc788\uc5b4 NoSQL\/NewSQL\uc5d0 \ub300\ud55c \ud3ed\ub113\uc740 \uacbd\ud5d8\uc744 \uac00\uc9c0\uace0 \uc788\uc2b5\ub2c8\ub2e4. Jon\uc740 \uc11c\ub358 \uce98\ub9ac\ud3ec\ub2c8\uc544 \ub300\ud559\uad50\uc5d0\uc11c \uc804\uae30\uacf5\ud559 \ud559\uc0ac \ubc0f \ucef4\ud4e8\ud130\uacf5\ud559 \uc11d\uc0ac \ud559\uc704\ub97c, \uce98\ub9ac\ud3ec\ub2c8\uc544 \ub300\ud559\uad50 \uc5b4\ubc14\uc778 \ucea0\ud37c\uc2a4\uc5d0\uc11c MBA\ub97c \ucde8\ub4dd\ud588\uc2b5\ub2c8\ub2e4.","url":"https:\/\/www.couchbase.com\/blog\/ko\/author\/jon-strabala\/"}]}},"authors":[{"term_id":9113,"user_id":42711,"is_guest":0,"slug":"jon-strabala","display_name":"Jon Strabala, Principal Product Manager, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/db52a9f6d84faba430dd38106cdbc16ff02c2066b103b5f6b4cfcde40e83c683?s=96&d=mm&r=g","author_category":"","last_name":"Strabala, Principal Product Manager, Couchbase","first_name":"Jon","job_title":"","user_url":"","description":"\uc874 \uc2a4\ud2b8\ub77c\ubc1c\ub77c\ub294 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc774\ubca4\ud2b8 \uc11c\ube44\uc2a4\ub97c \ub2f4\ub2f9\ud558\ub294 \uc218\uc11d \uc81c\ud488 \uad00\ub9ac\uc790\uc785\ub2c8\ub2e4. Couchbase\uc5d0 \uc785\uc0ac\ud558\uae30 \uc804\uc5d0\ub294 \ud56d\uacf5\uc6b0\uc8fc \ubd84\uc57c\uc758 EDA\ub97c \uc2dc\uc791\uc73c\ub85c \uc624\ub298\ub0a0 \"IoT\"\uc640 \"\ub300\uaddc\ubaa8 \ub370\uc774\ud130\"\uc5d0 \ucd08\uc810\uc744 \ub9de\ucd98 \uc5d4\ud130\ud504\ub77c\uc774\uc988 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uad6c\ucd95\uc73c\ub85c \uc804\ud658\ud558\ub294 \ub4f1 20\ub144 \uc774\uc0c1 \ub2e4\uc591\ud55c \uc601\uc5ed\uc5d0\uc11c \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc81c\ud488\uc744 \uad6c\ucd95\ud588\uc2b5\ub2c8\ub2e4. Jon\uc740 \uc5ec\ub7ec \uc18c\uaddc\ubaa8 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \ucee8\uc124\ud305 \ud68c\uc0ac\uc5d0\uc11c \uadfc\ubb34\ud558\ub2e4\uac00 \uacb0\uad6d \uc790\uc2e0\uc758 \ud68c\uc0ac\ub97c \uc124\ub9bd\ud558\uace0 \uacbd\uc601\ud558\uac8c \ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uadf8\ub294 \uc555\ucd95 \ube44\ud2b8\ub9f5\uacfc \uceec\ub7fc \uc2a4\ud1a0\uc5b4\uc640 \uac19\uc740 \uc0c8\ub85c\uc6b4 \uae30\uc220\uc5d0 \uae30\uc5ec\ud558\uace0 \uc0c1\uc6a9\ud654\ud558\ub294 \ub370 \uc788\uc5b4 NoSQL\/NewSQL\uc5d0 \ub300\ud55c \ud3ed\ub113\uc740 \uacbd\ud5d8\uc744 \uac00\uc9c0\uace0 \uc788\uc2b5\ub2c8\ub2e4. Jon\uc740 \uc11c\ub358 \uce98\ub9ac\ud3ec\ub2c8\uc544 \ub300\ud559\uad50\uc5d0\uc11c \uc804\uae30\uacf5\ud559 \ud559\uc0ac \ubc0f \ucef4\ud4e8\ud130\uacf5\ud559 \uc11d\uc0ac \ud559\uc704\ub97c, \uce98\ub9ac\ud3ec\ub2c8\uc544 \ub300\ud559\uad50 \uc5b4\ubc14\uc778 \ucea0\ud37c\uc2a4\uc5d0\uc11c MBA\ub97c \ucde8\ub4dd\ud588\uc2b5\ub2c8\ub2e4."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/8489","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\/42711"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/comments?post=8489"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/8489\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media\/8494"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media?parent=8489"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/categories?post=8489"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/tags?post=8489"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/ppma_author?post=8489"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}