From a27013215d811b2aa5c8a1ebb21993ac51a554a9 Mon Sep 17 00:00:00 2001 From: Jafar Aziz Date: Mon, 17 Jun 2024 02:29:02 +0700 Subject: [PATCH] chore: just test if this project can be running or not --- .env.example | 5 ++++ docs/parallel.excalidraw.svg | 21 +++++++++++++++ readme.md | 51 ++++++++++-------------------------- 3 files changed, 40 insertions(+), 37 deletions(-) create mode 100644 .env.example create mode 100644 docs/parallel.excalidraw.svg diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..52d4c6a --- /dev/null +++ b/.env.example @@ -0,0 +1,5 @@ +HOST=0.0.0.0 + +PORT=8000 + +WORKERS=3 diff --git a/docs/parallel.excalidraw.svg b/docs/parallel.excalidraw.svg new file mode 100644 index 0000000..6c8fd93 --- /dev/null +++ b/docs/parallel.excalidraw.svg @@ -0,0 +1,21 @@ + + + eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO19Z3PjSpLt9/srOnq/XHUwMDBlMZXla1wiNjbkPeVFie9tKGglilY0oqSJ+e+bye5cdTAwMTZBglx1MDAwMEjRXGLs233jtqGBXG6FypMnK7NO/vuvb9++d99ape//+va99FrI1SrFdq7//Vx1MDAxZvT6S6ndqTRcdTAwMWL4XHUwMDE2XHUwMDFm/LvT7LVcdTAwMGKDTz52u63Ov/75z3quXS11W7VcXKHkvVQ6vVxcrdPtXHUwMDE1K02v0Kz/s9It1Tv/Q7+nc/XSf7ea9WK37Vxyf0iqVKx0m+1cdTAwMWY/q1Qr1UuNblx1MDAwN6/+//Df3779e/C7b3TtUqGbazzUSoMvXGbeXHUwMDFhXHUwMDBlUFxuM/5qutlcdTAwMThcZlx1MDAxNpQ0Rluw4uNcdTAwMTOVzjb+vG6piG+Xccyl4Tv00vfnfGGz9m6OststXeikXHUwMDFivVx1MDAxZP1cXFx1MDAxZf7YcqVWu+y+1X5MRa7w2Gv7XHUwMDA21em2m9VSplLsPtJPXHUwMDFme/3je50mzsLwW+1m7+GxUep0fs324NVmK1eodN/oOox9vPpjXHUwMDE2/vVt+Mor/stcdTAwMTntOcu5XHUwMDExXGZcdTAwMTS3ani79P2UcFx1MDAxZedOMa0sXHUwMDAzZlx1MDAxOVx1MDAxZlx1MDAxYthWs4bPXHUwMDAyXHUwMDA39l/gXGZcdTAwMTT4cGj5XFyh+oDja1x1MDAxND8+023nXHUwMDFhnVaujU9s+Ln+z1u2WnqWMy65VJJr6z4+8ViqPDx28SPGcE9cdGZwKE5wrodjKVxyXHUwMDFlipLWXHUwMDFhvJXhV2lcdTAwMDCtg+JwfVxmXq1upFOVs439dOWsv9vfusze2Ob+95/v/+/wgbVxXHUwMDAxXHUwMDFl0IVcdTAwMWK9Ws0/543izzn/9/CiP1x1MDAxN5z4+cp/hlx1MDAxM0Gf31x1MDAxOV+o/sU6smC7pdfh7PhW1+3jXXHnvKyv3vtv51x1MDAxN9u3XHUwMDBmucPjt+9cdTAwMWaf+09g+L1WMfdjsYJcdTAwMDGrtGHGXHUwMDE4Jj/er1VcdTAwMWHV8XurNVx1MDAwYtXh+v7LdyNcdTAwMDHDXHUwMDFhXHUwMDE5p9/oXHUwMDFkXHUwMDBitSngOFxiKZWa2qYm33XCbVxuhFSeUlx1MDAxY1x1MDAwNLNGXHUwMDE57pv0XHUwMDFmRiVcdTAwMTdoVP9VLpdcbs5cdTAwMDVcclxuJ9vTlimujVx1MDAxMMJZKYNcdTAwMTYl1LhccoE10lhcXChiZUY08kbAWlx1MDAxNrmgh6NqNrqXlXd6dNyOvLqbq1dqbyPLZbDScaa38O1cXKVRan9cdTAwMWZ5a6NWeaCF/72AQ/a/iau/W0G39fGBbrM1fLfw62pcdTAwMDfTOI9mu/JQaeRqV+Fjwdsv7f96sOBx5Vs1nVx1MDAxMr1LdysjjTrSW1wisoZ7S9C4mjVMb9nnqt1O1d9cdTAwMWVbXHUwMDFixjy1L3dcdTAwMWbOXHUwMDFlXHUwMDFlXeItXHUwMDFi/ZOnrHPKol1cdTAwMDFcdTAwMWHViGVzkFx1MDAxZVx1MDAxOOnQm2pnXHUwMDFjeqO5LDunirZcXFx1MDAwZVo2ekdcdTAwMGYtwGh0lkqDdMNZ/7BsLrWH4IJQRFx1MDAxZsBcdTAwMDH7QOanpVx1MDAwYoXvcDZcdTAwMWPjb+Qt+eGdejh7r1x1MDAxNG5cdTAwMGbfwGTfd1x1MDAwZvZOznze8lx1MDAxZpMv++PL+1x1MDAxN9VS63hTd8snp1x1MDAwZntb1cJD+ul+9Kf8+vm5drvZn/a6pWLbvd+UXHUwMDFmMlx1MDAxN1x1MDAxZNhXfGMv37lqLOC6UH58Kbxe2ZPO4TtURFa5VO95XHUwMDAx1+Xv7e7t5tvB3sZ19lmePZXau6BcdTAwMTdw3ePjTqZXrTylNpvtdpF3705cdTAwMWKn5emum1x1MDAxNJaDllx1MDAxM4qFXHUwMDFjXS0yXHUwMDAwNYSlOCycvFpcdTAwMTOPhcZ4SmvnuFx1MDAxNlxiI3x4XHUwMDE5uoBcdTAwMDDnaYPIIzXydmf12MBcdTAwMTZcdTAwMTc5gOae0VI7iYzLajNcdTAwMWNHXHUwMDA0zyFcdTAwMDBndnXYty4k51x1MDAwNFnFt0xcdTAwMTNcdTAwMDP0T9OceqVY9DOIMaZcdTAwMTPj+MeZzsRcdTAwMDEtn+s4Mf7qL/vmgFx1MDAwYlYwZqa3b/OoT45cdTAwMGLnx43D3epe61x1MDAxMjqXmada4u1bMe5JwOBBXHQjkWdcZi2YLkD0gium0LilY07JsYFccu2bl11Jymiqk+dlns9/juqA0LhcdTAwMDLAaG018i5wgY1cdTAwMDFcdTAwMWO7NVx1MDAwMszwy5PN/Ty/n91/eKq0L1S1t12/2lx1MDAxNHs7Jz7HtJ5cXKh8c/jWei+Wq/3aZv+yX3t43r3nK+BCSfHVXFyE70goJVx1MDAxY4bo2kxty5NnM/G2bFx1MDAxMSW1llx1MDAxONdcdTAwMDNTaDEjtqy0p4VcdTAwMTVcdTAwMTajXHUwMDAxKdCExDy2XHUwMDFj7atcdTAwMDE8hj/FcZx5XHUwMDAzzE23KcE5d1x1MDAxYaOtOH+9Qlx1MDAwM15cdTAwMTeH/sN1foMlefNcdTAwMTjXNu7Ng6NZuitH51x1MDAxNU7VXHLHXHUwMDAwWaghmY8z//7rgzmA+m5W86NUt5tv5Fqpq+Sbf6Qr51xmXHUwMDFkqHXOXHUwMDFhQHdunFxi5+pL9+VAXHRcdTAwMDeG1s6QWlxipodP5lx1MDAxN1x1MDAxNiDnoKBcdTAwMDOG0/flWLBCZ76b61x1MDAxNlx1MDAxZjcvr7ba5uWqf40hTGun8jdcbryFb+1cdTAwMDaIuVx1MDAwNY6x5PTGPHkyXHUwMDEzb8xGecxxKYXlSMGVXHUwMDFkNWZpPclcdTAwMTjt7mmmpVxm34Kc25dz4Vx0bZVEV45cdTAwMGVaK1x1MDAxZLTnoC+3XGZcdTAwMTRSdJMg810zV86X5MpjXFxbiCvnK3TlksP4q1x1MDAxZsZvhFTWmFx1MDAxOVx1MDAxMlx1MDAxMLZ52XhqVnKsfXZyre3b8UvuKfnGXHUwMDFm6cmRwntcbumMM2iXgN4zyZ5cXClcZr9cZtKv5CDBXG5cdTAwMWT5S/Oy3dNcdTAwMTdcdTAwMTVdq7js9tnl6/lLrr2CXHUwMDFk/8Q4cq3CbFx1MDAxOTgoh0OYoU5g8mwm3pjRkyuOTlx1MDAxYVx1MDAxY3egR21ZXG7wNGXvlLbGYaCyREfOPYVWKlx1MDAxZLIryTSfYM5cdTAwMTOCcqRcdTAwMWZUi/PHk3/ak4tlbbFHu7ZcdTAwMTBPLlbpyVVoLYFSXHUwMDBl3EzGn7+os3quWytcdC1cdTAwMWFcdTAwMTfn0Hy5fqgm3/gjPbky3DNoYIw4vlx1MDAxNGIuXHUwMDFhv+yQnOMjQ+qhXHUwMDEztD23Qk/eKdvbeqHo7jerRye7XHUwMDA1xe+bZ6lcdTAwMTXUXHUwMDA0JMaTu/BcXLhcdTAwMDUqcvMnWuOMefJsJt6YjfbwY1x1MDAxOG4ztCPfXHUwMDE2xCBVXHUwMDA20rNcdTAwMGVJjcb/uW+2XHUwMDE278jBXHUwMDEziivhpnbiyLTQelx1MDAwNcTVzP5x4mFOXFwuyYnHeLVcdTAwMTAnLlx1MDAxN+vEf2DOXHUwMDA0o+e+co+A0VuNlFLNsFx1MDAxMVx1MDAxN51lTKrRXHUwMDBiZj20eMs0KGutz3lcdTAwMGVicW7ItzKtJefoYsNcdTAwMTPkZWZcdTAwMGKMfc6DXHUwMDAz8lx1MDAwNKThzEkuXHUwMDE4XHUwMDE1+lxyw1x1MDAwNF8tIH5cdTAwMDZRQVx1MDAwYlx1MDAwMYJcdTAwMGJ/9u9cdTAwMTdcZjBcdTAwMWNcdTAwMWZSXHUwMDAwu7qq36CD5vFcdTAwMGU62vidZf7FP63xd7q5dnez0ihWXHUwMDFhXHUwMDBmo1x1MDAwM/t5vGSaupVcdTAwMDFcXFx1MDAxNHo0SuY5IVx1MDAxMVaJ2CnJ+PBMXHUwMDA1TWuuNfBcdTAwMTdcdTAwMWUgSFNcclx1MDAxMlx1MDAwZVx1MDAxY/HXXHUwMDA07r3UKMaPKTr7NjImoXGlWoPP30mh2ZBuflxmXG6dXHUwMDA3XHUwMDExQSGdVbisuFx1MDAwZTKmWq7T3WrW65Uuzv1Zs9Lojs/xYDI3XGI1XHUwMDFlS7nAXHUwMDAywJvyvzdcdTAwMGUvLbri6IpcdTAwMWL+7dvQ/Fx1MDAwNv/4+Pv//mPip4XxrDRcdTAwMDatXHUwMDE0jEYnXHUwMDA3/m+nwGnPMktcdTAwMGLfIctmJu5y4YY2uF7QxoZcdTAwMTf8y//n7EgrwjdKaPNcdTAwMWSQbkxfilx1MDAxNM0311x1MDAxNGklmlx1MDAxYy5vrZxxaE7LQlo0XCJAgmeVcTiOXHSVXHUwMDBi3Fx1MDAxOWSBUkmEJLQ1X+L5Y8+ERoghXVxcJdJcdTAwMWacjcfZXHUwMDE0PnVcdTAwMDdcdTAwMTKNXFwggmrOnPF9arFAXHUwMDFiTcZGXHUwMDA3JVx1MDAwN7CDobJmkqFLXHKOilx1MDAwYk8ridG9xs/gnLrgqNZcbmmlh/GGk7hCyO3J4Ukj+oV+xGNcdTAwMTLwRqXhTklcdTAwMTmPtCGGNrjauIktXG5mhYiIYlx1MDAwNS5cdTAwMWM7S8VndKY9sTBcdTAwMGLMs2qQPEIwRZc2XG6zgnlcdTAwMWNDLI2/KSaUWVx1MDAxNs5KT4OjKlx1MDAwZmlcdTAwMTH5J5WIKetxXGaoXHUwMDAxXHUwMDE3XHUwMDFihlx1MDAxOc73YD5cYq2iXHUwMDFiia9cdTAwMTL5XHUwMDAztNNcdTAwMTBaXFz/iKCMo3dcdTAwMWRU/Fx1MDAwNskjXHUwMDE4Tyk0TGKQXHUwMDA26EOfXHUwMDAz2ugk9MigkKpcdTAwMWEpXHUwMDEwLSz+XHKBxVx1MDAwNlx1MDAwN6WRilNcIpSOQGEgXHUwMDE2fCDrXHUwMDA0s0hANa55bYlBWCus/9sp5EBcbp+ARCvFebF+/lx1MDAxOVx1MDAwNrNhdja4XsDEXHUwMDE2xmchNIkvaZNcdTAwMTnX2fS7hdGJ0OTiLFx1MDAwNlx1MDAwYoKjkUhNp4DHkvhCe9JIiZTWUZHPsvisxuePXHUwMDExqlx1MDAwMs01+tnhvpdv69/SOWaMXHUwMDA3cVFJpaQvXHUwMDA3+Vx1MDAwYmc12lx1MDAxZYvf+v+Ds1NcdTAwMTFaXHJcZlx1MDAxZj8zwmKAas1cdTAwMDSctVx1MDAxZVIsXHUwMDFjt2LWSsWYXHUwMDBl3PxUOFx1MDAxYp1cIlx1MDAxY1x1MDAxYlx1MDAxNHpSY/FBc/SpXGIxQT6rPFwid0hcdTAwMDKtRlx1MDAxYSjEmlx1MDAwMy14XHUwMDBlXHUwMDE3Nt5cdTAwMTI+XHUwMDBikDBcdTAwMDKMVHzHLYBcdTAwMTJCXHUwMDAyc1x1MDAxZrdcdTAwMWGOs2F2NngzYGGLgllw4ae1OS15xWfgs9FHQVx1MDAxM4qzhkohOXowcPQgYbRQUijlOWVcdTAwMDCc5UYyf25kgSjL8adcZk1cdTAwMDOHXHUwMDEyRFnnoe91XHUwMDE471x1MDAwMFx1MDAxZJTklpdSXHUwMDEwXHUwMDAwWiQwwFx1MDAxMVx1MDAxMVx1MDAxMs5nP74zU1x1MDAwNrXSbz63yv27o5tq4eq9cn94m3+ys2Y6XHUwMDE3XHUwMDAz4uOgs1h4XHUwMDA3xbVcdTAwMTL4PyBRM0pOgFKEW6c1XHUwMDAyXHUwMDA2rlx1MDAxNS00l4FJXycoXHJd/vQrNXHlz1xigGFZ6YjyMo0809lZKkwmL9CEw5/lwqPtbyExklx1MDAxN1KPwZ9AcPTBXHUwMDFmXHUwMDBiL1x1MDAxNZ2LZTLpWWIqllx1MDAxMoJcbplvXHUwMDEwXHUwMDAwg2lpSaUvOrYy9O+Xc26Xnnuljm/BLzTlXHUwMDFj4+XHU86BwSy9bEyzUKvmtMmL5FNPn3VuMFPRhfejx8xp66lyUyhcdTAwMTZcdTAwMGL7id+kS3GhPDrNjChG9STWjdp1yllPW0lZPoWkwfLwcpP5Jdu4J1x1MDAxMdlcdTAwMTWORlqtJki24SjojFxiZVx1MDAxZZlzTlx1MDAwNzPP6FxutYs/mt005evnnfLp9vb7duqx9PraS9tm0ivDXso3sFltVWU+nd+9ybDX66uX3Iy8RmKIMVx1MDAwM7x8ylf6z1x1MDAxMI07S4njQO6pp49cdTAwMTUm33XCzVxuhPNcdTAwMWNDPygwfEXXM5ZiTDmxKqtcdTAwMDJgOFx1MDAxMouGpbjE4JNNdayKXHUwMDBiYVx1MDAxY+kwrMyO5nCZivFPcfVPucxCrddBr9j5rM+MUm2L8SDjXHUwMDBlMziUpXtMYC70wCTQdrHRhk/vMrM7N4+HsFvix5n7zcs7viVlXHUwMDFkkm7bgoGHzIFpx6VBijC234r2xlxm4Vx1MDAxY3CQ0jHf0lq0bXNcclx1MDAxZZo2w59Fxy2MmWDbaMlcdTAwMWXntMdntHTa+EXkPoo2XHUwMDA1UnZcdTAwMTWr0SjqnWqju925b+RcdTAwMWGsd6Q3bu6rl/7QdC29alayjbvK7ubDWfb8fuuwfnp0/Mymrbd+aL6/1CFfOUulOmLvetvywiWM/pR56q1X4a2Bh7NgLdCXO+WmVy2ePJtcdLdoXHRcdTAwMWN9pLNcdTAwMDCGStnEqFxmI6hFXHUwMDFhdKjAKlx1MDAwNdBGKqRcdTAwMGJcdTAwMDNr1lx1MDAxM+gvQovSyJBxXGaAXHUwMDExLfi4+lCFXHUwMDExl41cdTAwMTZx9dcrNOX5XHUwMDFju5hh+U9y7LQrIZjARzc4XHUwMDE141x1MDAwYiq+Up41xu8tSp7VfN7RW1x1MDAxYlq/grxcdTAwMTBZq5hcdTAwMDFcdTAwMTTs+fn1+1lmy1x1MDAxNevXpddi8zqdXHUwMDExt0lcdTAwMDdcdTAwMDWBdo8uVUkkzoZcdD7K4K32lCFdcfStiFx1MDAxYWouPcJQaVZcdTAwMGJcdTAwMWVwqVxmaVwiKG1hQu2KkVx1MDAxZVxyXHUwMDAzeVx1MDAxN1x1MDAxM84gdlx1MDAwNCCB4ISRUlNyMGGF7n377PLwYNtcdTAwMTR27d1uXHUwMDExbmq7Z93n42ndu9lq9k53K9nL3FbmJZ3uXTXPalvTuffI6+4jebzMnLS62bw8vilcdTAwMTZOm/m921x1MDAwNVxct5oyrcxOZefKMvnwer910668LkJcdTAwMTKW25NyduP4+v6u3GuWNt666u1qZ1x1MDAwMde9aFx1MDAxZT65Z/Ny0j98v97bq+1cdTAwMWTtbSzwuNpK6Fx1MDAxM1x1MDAxM6G7XHUwMDFkjk44amGmL0CZvFqTjpSCe0ibMIrgmqOrXHUwMDFki4eA0qa0XHUwMDE1wjSiKMynYlx1MDAxZFx1MDAxOVx1MDAwZknnMamVVcySoqadkFx1MDAxZI2nUFx1MDAxY/lcdTAwMWZQhj05cDlcdTAwMWaF0jOYwEIp1PLFX2OIxeLEX+dgUk6EXHUwMDE2qOFcbsR4XHUwMDFjQWr63VB1UFx1MDAxM5W7p5t0I2/KZ7iQN+vv+aRcdTAwMDOE1MzjXHUwMDAy8djg/TojYZRLUWKRXHUwMDEzd3FCcmphXHUwMDExXjsxz+n0KciUxI9cYqEou2CUXHUwMDE1llx1MDAwNVx1MDAxMlxmXHUwMDE4I+JcYl3sXklcdTAwMTM203u8dp++yFx1MDAxNo7TrVx1MDAxNFxcXFw0/WLnvynb6u/fl8u9Lcjwx/fL7dr+U/64dr5cdTAwMDK2lVx1MDAxODbgP6xcdTAwMWRIKSqF/3MzfeA0eTqTbu2WXHUwMDBlcFBbXHUwMDBiS9k4K8aOV6GTJiMjXHUwMDExmkHl8VxcolKRfEBcYm/Q/clJ5sC4z22pkLwsXoTHllx1MDAwZiTJ5OdiXGZi3mzKp1x1MDAxOcOS1WVjnOeC1GXn4Fxu6FvCz8FLrZnWZoZo4uK6li27QuG81bmv7lVa9v3i4CHx8Fx1MDAxMU1cdTAwMTZcdTAwMTBcXMBRgzmBXHUwMDE2a4xajpLNXHUwMDE0XFxBKDovSKfGKFx1MDAwNFRcdTAwMDFcdTAwMTlcdTAwMWKJoY5T8Z2vklx1MDAwNFx1MDAxYitkXG7yIPOgr7LATneOXHUwMDFl+MbLjn6/fFrBPkdimFx1MDAwMmfhmVSDy05YMUOVxOTpTLqpWzpcdTAwMDSvpFx1MDAxY9THXHUwMDBiJ0dN3WnP0dalQOhDVPCdXHUwMDFmXFw4UTBcdTAwMWXOOZ39clb6Q/9cdTAwMTl4glx1MDAxMIKrKfZccpJk7/PRhC/LzSxZuTbGbS5IuXYumqDCszNWUoGcm54lXFzm39vF49Rb+qaU6afM604rdfuYeOiIZlx0VH+lQOBcdTAwMWbccodmOZfc5TJpXHUwMDAyXHUwMDFkw6BcdTAwMGVAYp1wY4U84TJ/c9G/tI3L91d+uFlNpTOF3amFbefIWySHJ6jQ8lxmxSlDPlx1MDAwM0uYPJlJN3VkXHRCaC7Q81x1MDAxYUVcdTAwMDdcdTAwMDJHTV1ccqRynHCD/lx1MDAxYlx1MDAxOOgvjyYgIVx1MDAwMdLhoKxcdTAwMGW3MElcdTAwMTRvilx1MDAxYVxyTeqWcr32XHUwMDEw52Ncbl+WgliyMm6M61xckDLuXFxMwYVcdTAwMWZcXLLoXHUwMDFhpeQwPVW4zuTfetXDx/xZ/aF2371/adavXHUwMDBmXHUwMDEyj1x1MDAxZjFUwUnPXG7JqLW1MEJCeHnXXHUwMDE3U1x1MDAwNadIz1x1MDAwMFxcXFxxV5JwY5W9bO73XG6v6lVsymKu/qbT/cPszcZcbioyksNcdTAwMTTCa7a00Vx1MDAwNkDa6anC5NlMuqlbkp536HTB0V4qjFg6Z8ZTkprYXHUwMDAzs1xm/FtzS2BcbormXHUwMDFjXHUwMDE5XHR6elx1MDAwZZ8r5iR2Z5lV61x1MDAxNFx1MDAxYcxHXHUwMDE03FxmRrJcZqKwLPXdXHUwMDE4x7kg9d1oolx1MDAxMCG+XHUwMDFivlx1MDAxNYmuyChcXIHT5yyjs7hJXHUwMDA1XHUwMDBlOtNhuFx1MDAwMkWdn6nB/ShH4KRkxrSxdLpcXGtcdTAwMWKOXHUwMDFj85xuVuA5JGVWaEeaXHUwMDFhbIKGjlx1MDAxMUgjqKSMYUBEazxcdTAwMDBcdTAwMWGkTCXwXHUwMDA2XHUwMDEyVFx1MDAwMr54jZ1cdTAwMTn9qe9pTaWxXHUwMDEzXVf0LVSc11dy9u2XXHUwMDA0g/QoXHTkcNz0WIRcYiowTKVcdTAwMGJcdTAwMTGdu1x1MDAxY1x1MDAxOdKINi9MUIUg5+ScNFx1MDAxNDM7XHUwMDA1ay5cblx1MDAwMeBJjP+dRmaP616NSekq5+FcdTAwMWJgMXBcdTAwMTcwkHyNu2CoXHUwMDE5XHUwMDBlrlx1MDAxN7DA4eX+8v/5XHRcdTAwMThcdTAwMGWvXHUwMDFkXHUwMDExXFxcdTAwMWLqwDeDXHUwMDA2eiShXVdcdTAwMTjGUI3OuVx1MDAxOU7NjtSSRHbw+dPBfyswXHUwMDEwI4HdXHRcdTAwMWHo1nlUVYJwpJUyIIN1YtxcYlx1MDAwNTJWmfdcdTAwMGZcbi9cdTAwMDCFx6V7jVxuijcuXGKGo4nc6JhGlHvNcLF+jMl4uEI4fkjRUlx1MDAwN7PmOMw8xEzhtDFcdTAwMTJ/Z3ZcdTAwMDQ3XHLBMDIoXG7P8E6dnVx1MDAwMoUnWyH9XG7Y38JAWPiOnI2BsDW4cJBcdTAwMDVOL/RcdTAwMTNdp5BYXHUwMDEw5tTylXBY01x1MDAwM1x1MDAxOINgRGguJFx1MDAxMlx1MDAxZe1AXHUwMDBitSQmzD1cdTAwMDNaSqZp3846OWG7jDRinWWCcmeAUXZQTZKOPeFcdTAwMWHhcWqSf0B4IVR4RNbXJ3nxgXfKI2lCpaRcdTAwMDXmSJTyc1x1MDAxOFx1MDAxY52fXHUwMDFmXHUwMDE5kl/UXHUwMDE3XHUwMDE5XHUwMDA1XHUwMDBm+lx1MDAwNeVcdTAwMDExQ1x1MDAxMl+kilRcYo5pnTBcdTAwMTitk/Q8XHUwMDFkdYwwyEGc/9sp0omV1CGOOzcouI9Vm1xmt8NcdTAwMWZcdTAwMTdcdTAwMWM3wYXBMITnLST6VG1mkZCJTlx1MDAwMydcdTAwMTiGLelcdTAwMTkpqpFmjI1zYeFJJ1x1MDAwMSM4rkjdJVxcQmZcdTAwMWUgls5D2sQsLlx1MDAwMaesT0rZn7VA7yxJXpCjO5ZcdTAwMTNcdTAwMGVU4Vx1MDAwMsJ4KtHyXHUwMDEyv1x1MDAwYlxuj4n+XHUwMDFhboP9XCLwgVx1MDAwMUlcdTAwMTZyhoTGXHUwMDExIHxcdTAwMGWHo7OfY4Pyi/5cblx1MDAxN+xhRN2tcCFcdTAwMWJaZE5IXHUwMDE2XHUwMDFj05rhsGF0n4DEXHUwMDE1XHSvXHUwMDE4Ya+c43wwXGZfjVx1MDAxMtRUQMc2sVxiM0P6XHUwMDE1MMBcdTAwMDWCcOjRNVLHw5hrXHUwMDA2XHUwMDExgOizvlx0XHUwMDA1YcM86vuApmLRZUo5xL/BUVx1MDAxNi08JfE/sjY0t+VoXmJI4lmjuFx1MDAxMEDmY9yEY61cXILHubaMS4tGbybsXHUwMDBiW+GoXHUwMDFil4nNXHUwMDFlfy3Kfnxnptzv3l3+8TB1+trYaVn31LptdkzrZrk52lkh/Kiafj6SorJnXHUwMDE5y5bSVVHRh1wihLVaakBhMFxiQ1xm0cMjIVx1MDAxZmBcdNJjXHUwMDEySYGm/5XCXGLnc1xiPlx1MDAwM7nXJCBvXHUwMDExs5Dg09+DY6LUKy5Qw1x1MDAxZLXyZmvehVxiuEaQ1ojPiuJ+X3qWfqWQX3uDXsuaKFx1MDAxOOfxfYjCzXhwwaBcdTAwMDXPXGLjYWVcdTAwMDH+NPd4/SD1WmCcTc+kJ9tZwkFcdTAwMWMseNTYjuPT4iN91Fx1MDAwNlVcdTAwMDGDmEk7Meh2XCL9WbdForgg0ThN/OaHNMEna1x1MDAwNyValp6mXHUwMDA2KFx1MDAxOVx0ffkpRF1EQn+50sYxZGYx0sZz1P1JXHUwMDFk3q5BXHUwMDEzXHUwMDAxxycz/TZmtOtKqNWngFnqeW80XHUwMDFhXHUwMDFiXHUwMDEz1oydQ1x1MDAwNlxynlx1MDAxMlx1MDAxYaNcdTAwMTKKTUc2OsftvoRcdTAwMGJQQLTdl8tcdTAwMDVXmCDrhtONjoL/wFx1MDAxNnQoXHUwMDEzXCJoKYwnXHJcdTAwMTiD4YDCkD9cdTAwMThBg6TjUb5Y7neSNYZcXCF31rS8y6W+OLnIXHUwMDE18s+X2ytQXHUwMDEwirzuXHUwMDFjwo6R171r9eGuVlfs4Kx3VH5hXHUwMDFiu1x1MDAwN+5oXHUwMDAx11x1MDAxNdv2Zqcg6pvQ71x1MDAxZbxsVFx1MDAxZvVtsTTddZfAjT9FVIRcclx1MDAxN0pB23BoQjPs+U1eVUnHLItcdTAwMWNRMMfpXHUwMDE4onN6TDlBKlx1MDAwZum11kYrhpQzfMdvXG7Ailx1MDAxMY1cdTAwMTae5Fbij1wi2j+BqpjhwD+oieRcdTAwMWGsjN3nS1xuNVEzLOhJ1GR6zehaM1f89v9cdTAwMWL5XFwth+t5WWJIMV56nJNcZlx1MDAwNlx1MDAxNVx1MDAxY9JUzES5SFx1MDAwYlx1MDAwZt1RMlx1MDAxMW1UXHUwMDE0lbhcYphB3iBcdTAwMWHzkmrigkmyYo6RXHUwMDFlZ4qNligjXHUwMDFm8bTBt3CJOs5V+JHnaWKRMKlZ0NZzYEhcdTAwMTjSgpZ+wdtcdTAwMGZcdTAwMDNnlH3HIFx1MDAxZYFcYkBR68CAcDRcdTAwMGVcdTAwMWbhgfk3pH6jLSV5ffzUaHSvT1x1MDAxZrb72SN9fiSu9fHsbvNTh6Tn7lwiNcNmXHUwMDEzXHUwMDFibCFxakOvqLl9sIKRk9YpXHUwMDE4RlV0XHUwMDE4WFxituY7O6Grn36lJiz84Vx1MDAxNf/y/zkrweGajb867KE32EP2KyDEKj5MXFyfSUc/RD70KWbQy1xcaV/Lsp9cZsd5TjucfMDPaCPDz3LOhX+f6lwipVx1MDAxNO1cdTAwMWRNcWwzXHUwMDE5/EbNu/WSlDZSMW7+69tIUfe9cMOmxrvKwfSJsp57uytXzjKXcJTZfLhot85cXDHx1Vxu1Fx1MDAxNINcdTAwMDFGKFo5kn5cdTAwMWLLlHGjPdrYxlx1MDAxOMEo4Fx1MDAxMF41loyeXHUwMDE4XG6kYTZezOW2+n53tNMvXHUwMDE2Ni6uXnZOUoWTcjPn97NruSOTMVx1MDAwZumDY7GTs9n24+M+K7+bt5013jlZXHUwMDAyVftcdTAwMTRcdTAwMDFcdTAwMDA/oVx1MDAxZq9qUk5cdTAwMGJcdTAwMDTt6Xc4Jj+lhONcdTAwMDS12lx1MDAxMGibzlx1MDAwMbOBXHUwMDAzmlx1MDAxNlx1MDAxNodcdTAwMTLLbbThLNU54yiTXHUwMDAzXHUwMDEw87GFeXdDktloI8aXJqDRhlx1MDAxM6FbXCJOW0GljjPU2Fx1MDAxY7eKVZfNXHUwMDE3e839TKNcdJup9nviu+9Qo1xykjvgzlwiXG678Vx1MDAxZFx1MDAxMSpBVWiHdMLORlx1MDAwNFx1MDAwNF/eZ1x1MDAwM4TFeELHJml+T85QfezsyKf8bepI2Y1cdTAwMGK5aSv7V1PrOVx1MDAxYZO5qtw8l7PwtvdS2X/u91x1MDAwZe3pXHUwMDAyOEOf10zqcbf00in3en3Xr0Pn/WRcdTAwMDHXzewrXGYyLo/fdvtNp95APVWPXHUwMDE2kXXqmtJcdTAwMDOYtM2/PFx1MDAxZpzI9uV+Oa9cdTAwMTara7l8juOXb1x1MDAwZkjYXG5jXHUwMDA0czM01Z28rJKOaIKOpErHpVx1MDAwNtrK5WO7XHUwMDFjVnqagULIXHUwMDAz7ThfXjC0kIZcdTAwMTiAsIvENb5/9tpwXHUwMDFkO4NcdTAwMTEslOssvyNGXGZcdTAwMDNIRkdcZlx1MDAxM16cwtFuhJtFvlKpXFxps3fdO8rx93xWZ65ON05V0lx1MDAxMVx1MDAwMqM9T1x1MDAwYlx1MDAwN0JqKj1cdTAwMDMz2jNcdTAwMDfN0XPMcIGGa6zhvm3SxHXEkJwjI1KxWyXPR1x1MDAwN1x1MDAwN6/PtUru5LRxeXZcdTAwMDWV0l1mpNb0N+VF9qHfe2/u4YibXHUwMDA12N+u7fSvXG4r4EWJ4Vx1MDAwM6DDda41smXjhJ3hRO3E6Uy6tVtBW1x1MDAwZZxOMjvgyo1cdTAwMWQjYMpcdTAwMDPHrJX4XHUwMDFlNVx1MDAxY5zH2JffXHUwMDEwXHUwMDAzmGRS0LGWNbL4uVxig6/s6DdriFx1MDAxMe07k9BcdTAwMTBDhXbXQ3JskErrWcrXt453XHUwMDFls/I6e90qXlxc5epHe6l08rdMo7lcdTAwMDJyXHUwMDA0T2hnnEM3bqWL0Kb6aqlrTefXhIktXk9cdTAwMTJwrJAqsENzVN+wXHUwMDA36d2Xh/PNcrMs7jv3K9iSSFxmVeAqNI9qhDHaMTn9zsHk2Uy6raOZkTy00JLaYlx1MDAxODZm61p4zJLYXHUwMDE1hvMg+Fx1MDAxMqWuXHUwMDE30Fx1MDAxMVx1MDAwM1x1MDAwNjpZnMeKICXJ3ucjXG5yXHUwMDA2XHUwMDFiWVx1MDAwNlFYVkuMXHUwMDE4x5mAllx1MDAxOMDCt1x1MDAxZNFFkkLCXGZcIpZCvZ+oo+Ptt7fWadVm6483t6f9xINHNFGQXHUwMDE4ZmhSh1RSkOHO1XdvqTxcdTAwMDFAafw6/OFcdFx1MDAxM3nCUzt7XHUwMDAyNSi/7u89Q63/XFxqnd3u/Z1SXGaChXfJ0+g2Z2uyOXk6k27raGdGSk3li0qho1x1MDAxZT0qXCKp6TZDIFDckuCaXFxik83FNMVcdTAwMTCAeMXiVWKSZPPzcVx1MDAwNTODnSyDKyyrKUaM70xAU1xmkOEnzWhbTHIxg7BJu5s+KG5Cg2dzd/fZfHc/01adxONHXGZXoCpKdMNcdTAwMDKnylCp9pclIGLJXHUwMDAyKa8oy1hcXNlFkoBjhWTB3ueNrlx1MDAxZF7l++83XHUwMDE3XHUwMDE5+1LrlS7EXG7qJ5JDXHUwMDE2RGj+XHUwMDAx0ZPhqpsh/TB5NpNu62hmXHUwMDBlfsj4W6fHslx1MDAwZui3PUOygFx1MDAxOK2DtnYuS19BU1xmR28qY/8+ROF3bYpcdTAwMTHjOL+4KYaQ4UFcdTAwMDZJmFxup2Y41Fx1MDAxMZ3JTSpw0KFcdTAwMGVLXHUwMDEyQVx1MDAwZVxyVvmbbf+oYzJcdTAwMWXjaKbIIYT151x1MDAwM1x1MDAxM9dcdTAwMTRcdTAwMDMpXHUwMDA2l1xcxYLGl3KAXHUwMDA1aFAu4rRpqOxuZGnRt9CmXHUwMDE4dvg8vi26KUZk/nJkSP6mXHUwMDE43JphvfvHmP50xYi84Fd1xVx1MDAxMOH9T/HeXHUwMDA05zM0NYvms2uKwlx1MDAwZd/mRpDoKy5tPd+R2WX2xKDjT4CLzSTo0Mzvi8KBplx1MDAxOFwiqCO5IFx1MDAxOI4mcqNj+tNcdTAwMTTD9+66NMWQ4f3mgfSLMVx1MDAxY5tcdTAwMDGFo0tcdTAwMTVcdTAwMTKMwlx1MDAwNMK4KpnD+Vx1MDAxZEvMI1x1MDAxNbZcZt9cdTAwMDCFXHUwMDBlSURIM319V1xmzlx1MDAxNFx1MDAxOftcdTAwMWYuvFx1MDAxYS480lx1MDAxNcOqIFxiL6grRnSKfmRI/q5cdTAwMTiKSVx1MDAxOVx1MDAwNOE/XTGirvdlXTGEXGJPXFzgo1RUljv9nkR0KjixOIyPi1x1MDAwZUZgtEFuTo/vSaBcdTAwMTM0XHUwMDA0XHUwMDAzpEslpG9vN3FtMVx1MDAxNFx07MdWUf+B4cWQ4ZG2XHUwMDE4LLglsaiuXHUwMDE40enPsTGNdMWY0KrjT1eMqOstsytGdFx1MDAwNpmHi6pzYFxuXHUwMDA0cfCpgbhVqvfuOi+1w/1SQe7n8mzz8SWXdCBcdTAwMTZcYsRg0U7Qb2rpfH0l6PtKaFx1MDAwZlx1MDAwM1x1MDAxNUF1ZtLoiL3hhFxi/jDLqNFSXFxcdTAwMTb5+qzITnZcdTAwMWFX5sS507t8dvf2yrytfZL4sXOQveg9NPhhKldJpd/rOLy3v5Mwj/CVXHUwMDFljFx1MDAxMyuLwS0y4Fx1MDAxOZI9k6cz4fYsSfPXOmr3zmh3QY5GuIpOgi7KoJerzUNcdTAwMWLbysTq9K3QlOfK/5ov66GwVGmeXHUwMDE4p5dcdTAwMDRpXHUwMDFlXHUwMDE3fnJcdTAwMTXpoVx1MDAxYvCOqUFB3F6k2+3Wm9jYlPneeW9na7v5nnRQQPrkKaUt09Rv28pRJ68xdMY1qml/k5RSw3e9vlxcnMc6PTh+XHUwMDFiXHUwMDE3bf2e/n17t7ZTr+TKl/Jk77B3e/qkni6nXHUwMDE259kvpDtP59mNbqZxUL6/uN46L/Tup/PvkddcdTAwMTWyWj27fj64S21cXF5tXHUwMDFjpe9N6r24iOua59f6WeOuVaxsZFx1MDAxZXulQkXVX1x1MDAxN3DdrLh4OuH1vcr1TWtndytzXG6F3ds14zkgI/rCONpcdTAwMTU2M1xisE9eVkmHNME90ihlSPpcdTAwMThGaWNH7LSUXHUwMDFlbcxgXFxOoMeWXHUwMDE3uCxEnIdyvsqI2CO1a0N2vuxcdTAwMDTd8rV5Ylx1MDAxOEBcIrR5qMg6nPTQc+KKTb+zofnx1kX74Oz19EjvvOYy6Vqnf5V0hJCaeVx1MDAxOH4woFx1MDAxM7YkfDVcdTAwMTZcYjmPukpccnpHKYjYYP5yaVx1MDAxZVx1MDAxY6PVTsWSXHUwMDFlVts+vshXn5uHqdeTTFZsb+XvRlx1MDAxYar/nqyob/ObxePjzt59dUs9nW/m33JvxVx1MDAxNbCixLBcdTAwMDHOw21dXHIqx2ZcdTAwMTFcdTAwMWadPJ1Jt3XS4pNcbrSwzlx1MDAxOe6rLlx1MDAxZNi6pkQonTc0oCRjc0lrLF+Zx1otSWAoblx1MDAxMzNJ9j5cdTAwMWZb+OozdMtcdTAwMTLmifGbXHRcdTAwMTDmXHUwMDAxXGIvXHRcdTAwMDJjXHUwMDE10udcdTAwMTmwo5JLN1+z75vPjcrbXuVp83hcdTAwMGZE8mW9XCJ5gqbSr4GtMjnIS3xcdTAwMTVPiD1Bx0iUxzhcdTAwMTm3YZok2FghTdh7LJ62XHUwMDFlmqXMZuulf+Eu39XVk1vBZkRiaIKAcGlccoVrXHUwMDFiZlxuXHQmT2fSTd1yz1hpaC6oWHNsXHUwMDFmlFx1MDAwYlx1MDAwZslcdTAwMDFD3LNcdTAwMGWBb66QYOmyPNRk1um/XHJHsGxcdTAwMDZcdTAwMDNZXHUwMDA2R1iWJk+Mz0yCJk+E9KdcdTAwMWN0RJ6hWm3v+LHfOOhuXHUwMDFjdVxu1ydO7G+d1faOXHUwMDEyj1x1MDAxYtFcdTAwMTRcdTAwMDHDXHUwMDBiXHJA1Vx1MDAwYlxcc6OTe8jeXCLXXHUwMDE2XCI2pZok0FghQ7h9ONdcdTAwMTnX7cHtlT19u2JpKFx1MDAxY9i/U1pB6NDyXHRnnKWDXG7TXHUwMDFi+uTZTLqhI0Fw1C5cdTAwMTK5gKZ27aNlqdpYT3Bh6eBcdTAwMDbzXHUwMDFmxkuoXHUwMDFjXHUwMDBmt9xwI2LbXHUwMDFiJcng52NcdJ8qU11cdTAwMDM1nlx1MDAxOLeZXHUwMDAwNVx1MDAxZVx1MDAxZaHmxa1cdTAwMTZSz5KTbFdcdTAwMWZvc+mnt/u93aPDo/prpipLa55xMJxOVINTjNFcdTAwMTlcdTAwMTJIrHBcdTAwMWZngzNcYlrEZSOTXHUwMDA0XHUwMDFiK+RcdLnzx1vpbu7PzDGHo07zrCqzU5dZzlEukVx1MDAxY57gwlx1MDAxM1x1MDAwZVx1MDAxONTi2jIzdECePJ1JN3VLXHUwMDEyvlZqzoVTJPM7autCeFpKOlx1MDAwYqpcdTAwMDBcdTAwMDOkhKvxILHDpcNdnMJvklxmfj6eoGcwkmXwhKWJ8UT7zS9cdTAwMTbjUTw826BcdTAwMDFtiVx1MDAwZY1MXHJcdTAwMWPRudukXHUwMDAyXHUwMDA3XHUwMDFkfFNgKDmoxs9cdTAwMWZribRfWlxmPjhcdTAwMWR600s6f7xcYilcdTAwMWXBqLe7jFx1MDAxNYH4UlxusIBzb58qZJry3Ft0JdG3MClcdTAwMWU0XHUwMDE1n/xAUFx1MDAwM1x1MDAwMpeYM8Fbn+rYW3TGcmRIfilcdTAwMWX0KcGjeCNKPIDLOTCkdTr19tso8ahwRTSquZbUgWRqXGaOprNricFcbq1NXHUwMDFhg1RKUfO25Fxu8VhHrXbtXHUwMDFmXGJeXHUwMDA1XHUwMDA0j+nwXGI1XHUwMDAx8Fx1MDAxNoTB0Vx1MDAxY250TCM6PFx1MDAxMiA4qFx1MDAxMSFcdTAwMWVQYs1R+LdcdTAwMTDi0TI8o4Y3poWYRYgnujghwVx1MDAxOEzdroSm5rqK+cpWfjBh4yFcdTAwMDRcdTAwMGLLXHUwMDAwXHUwMDE3r2VJVuLBVWg0pUf+4PAqqPCIXHUwMDEyj1x1MDAxMpMkIFx1MDAxNqLEXHUwMDEznZhcdTAwMWZcdTAwMTnSiFx1MDAxMlx1MDAwZintTFx1MDAxONNcdTAwMWYlnvDrfZlcdTAwMTKPgtCdTINEXHUwMDE5wOnpcTg6XHUwMDA1nFhcdTAwMWNcdTAwMTZoUbh+nVx1MDAxMEgkfLf7XHUwMDAzhp1H/c1cdTAwMTGltaUnvVx1MDAxNFx1MDAxOF6EXGZcdTAwMGZHVFx1MDAwMCb+cOHVcOFcdTAwMTFcdTAwMTlcdTAwMWXFg5I3Q1x1MDAxZFx1MDAxZUs1dVx1MDAwNj6pw1x1MDAxM534XHUwMDFjXHUwMDFilE+HXHUwMDA3QWRcdTAwMDJcdTAwMTVcdTAwMWXK8Fxmjlx1MDAxOa87XGKvjVxmTzhcdTAwMDJzXHUwMDEzisDI8Wk/Yoaak4fm+0tcdTAwMWTylbNUqiP2rrctL1xcQtJcdTAwMTHYWI9RnYdFM+LSt5H2s1ekxMdcdTAwMDLOgqDMmnTLUULjTHtoXHUwMDFhdFx1MDAwZVxyvVx1MDAxZTdigvxcdTAwMGUoXHUwMDBmh4lcdTAwMDRcdTAwMDZwVUmr2Fx1MDAwNCqM0a9FJlx1MDAxY1x1MDAwN8NfjLJcdTAwMWbfmSnv2+vv1I5vTndcdTAwMWZdl+1t1LLp3cdUdfb87DIh/Kiafj6SorKHoJstpauiolx1MDAwZkVcYlpcdTAwMDKjXGZcdTAwMTZcdTAwMGVcdTAwMGLxw5CKXVx1MDAwMC9cdTAwMTFhqIxcdTAwMDBtnsq/mPokke65t7ty5SxzXHRHmc2Hi3brzFx1MDAxNUMkLVx1MDAxOfpxp1x1MDAwMCGLI49cdTAwMTZcdTAwMTP03UB7htapXHUwMDFilFhwroKPe51AXHUwMDFjXHUwMDA2qItmI1x1MDAxZNfAtV/Ec7DnTFx1MDAxME8pS2kxdjCxm8rhdjy4XsCCZ8TxsJJcdTAwMDDDQlx1MDAwNVx0XHUwMDFjbdOYXHUwMDE5aPRkM0s4iGNE5zliXHUwMDE11JxcdTAwMDeZNFx1MDAxZq1cdTAwMDdAau1cdTAwMDH12MCJwCeplrOdIcDTTFx1MDAxM7/5oUTwuaJBJFx1MDAwMJR9jKXSSUnlXHUwMDBmb2DFqfx26blX6vjsYaGZ/Fx1MDAxOC4znslcdTAwMGZcZmapiXyp2PjLv+xcdTAwMWS9v1x1MDAxMXKWLr3RynNcdDV4M0hcdTAwMDcqiZbikL6J0e1LoVx1MDAxMdYpXHUwMDAwYtJq5lx1MDAxOCyJtYH1MOyl6NxohH45weC5tp7VXFyywaa4VkGdNVxuXHUwMDEy0LnEnVxuWEvOdtHgXHUwMDBm8qL0clnb7aSPXHUwMDFkr1ZbxdT6cjbJaZNcdTAwMDaQI1x0wX2xwJBcdTAwMWVJz6KP0Vx1MDAxYYDM0LnPUbZoVbfRMSmJxMVcIu9cdTAwMTdcdTAwMGV/2SCNXHUwMDA07kkqL8P4XHUwMDA2SL1L2MCg1oqyXHSLtq1cdTAwMTlj1FxiRVtcdTAwMTilWFx1MDAxNu+WO+2oZ6/hXCI+XHUwMDA3XHUwMDE1bsSDd8fNd1GMXHJcIsq1XHUwMDA321x1MDAwNlJOr4o32cxcdTAwMTJcdTAwMGXh4KSHz1x1MDAwN32/tpqqNEcxXFxRMVx1MDAxNlx1MDAxOItcdTAwMGKXXHRcdTAwMDTyXHUwMDA0UzZcdTAwMTiAXHUwMDAxXHUwMDE3sCaczX1Z+eVyOVtcZpNZKGf76+dcdTAwMDP7nmu1Lrs4x1x1MDAxZnCOz75S/DlRw3n9/lIp9TcnirjSL1pcdTAwMDRcdTAwMDNcZiFjLVxyvPR//vrP/1x1MDAwMVx1MDAwNd70PiJ9 + + + + + ContainerMain WorkerWorker 1Worker 2Worker 3Worker 4requestclustersContainerMain WorkerWorker 1Worker 2Worker 3Worker 4requestload balancerrequestContainerMain WorkerWorker 1Worker 2Worker 3Worker 4ContainerMain WorkerWorker 1Worker 2Worker 3Worker 4requestrequest \ No newline at end of file diff --git a/readme.md b/readme.md index 0d45fdf..6ed225e 100644 --- a/readme.md +++ b/readme.md @@ -85,42 +85,11 @@ We validate the request using custom function from [`helpers/validator.R`](./hel ### Parallel Processing -Parallel processing in Rplumber use `future` and `promises` packages, that package will process incoming request in another Rsession called worker. - -```mermaid -%%{init: {'theme': 'base', 'themeVariables': { 'fontSize': '10px', 'fontFamily': 'Mono'}}}%% - -graph LR - -subgraph bi[ ] - B[Request] -end - -subgraph vpc[Docker] - subgraph 1[R Plumber API] - MAIN -.-> WORKER1 - MAIN -.-> WORKER2 - MAIN -.-> WORKER3 - subgraph inside[R Plumber Session] - MAIN[Main Worker] - B --> MAIN - end - - subgraph parallel[Parallel] - WORKER1(Worker 1) - WORKER2(Worker 2) - WORKER3(Worker 3) - end - end -end - -linkStyle 0 stroke:#555,stroke-width:0.5px -linkStyle 1 stroke:#555,stroke-width:0.5px -linkStyle 2 stroke:#555,stroke-width:0.5px -linkStyle 3 stroke:#555,stroke-width:0.5px -``` +Parallel processing in Rplumber use `future` and `promises` packages, that package will process incoming request in another Rsession called worker. Or if your have enough resources you can run multi container in kubernetes clusters or docker swarms and put load balancer on top of it, to distribute incoming traffict. + +![Parallel](./docs/parallel.excalidraw.svg) -Use this method for long process endpoints that takes too much time, so the API can continue processing incoming requests even while working on others. You can add to any endpoint like this +Worker only created in one containers, and to use workers add total workers in your env variables and use this method for long process endpoints that takes too much time, so the API can continue processing incoming requests even while working on others. You can add to any endpoint like this ```r # routes/task.R @@ -151,9 +120,17 @@ Some of the examples of test case can be found in the form of `test-*.R` files i ## Deploy -Deploying docker images it’s easy, you can deploy it like other images in Kubernetes, Docker Swarm, Cloud in GCP / AWS, or a VPS. If you wanna check this boilerplate, you can deploy to Railway by clicking this button below, just for example. +Deploying docker images it’s easy, you can deploy it like other images in Kubernetes, Docker Swarm, Cloud in GCP / AWS, or a VPS. + +## Resources + +I have blog post about this projects, check it out -[![Deploy on Railway](https://railway.app/button.svg)](https://railway.app/template/Sjd0PA?referralCode=O5j9Uf) +- [Project Setup, Logging, and Error Handling](https://jafaraziz.com/blog/rest-api-with-r-part-1/) +- [Routing and Request Validation](https://jafaraziz.com/blog/rest-api-with-r-part-2/) +- [Deploy with Docker](https://jafaraziz.com/blog/rest-api-with-r-part-3/) +- [Testing and CI / CD](https://jafaraziz.com/blog/rest-api-with-r-part-4/) +- [Parallel Processing and Performance](https://jafaraziz.com/blog/rest-api-with-r-part-5/) ## Last...