โ๏ธ celery
๐celery ๊ณต์ ๋ฌธ์
python ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ก, ๋ถ์ฐ ๋ฉ์์ง ์ ๋ฌ์ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ ๋น๋๊ธฐ ์์
ํ(Asynchronous Task Queue)
- ๋น๋๊ธฐ ์์
์ ์ฆ๊ฐ์ ์ธ ์๋ต์ ์ ๊ณตํ๊ธฐ ์ด๋ ค์ด ์์
์ ์ํ ํ ๋ ํ์ฉ / ์ค์๊ฐ ์ฒ๋ฆฌ์ ์ค์

Task Queue
- ์ค๋ ๋ ๋๋ ๋จธ์ ์ ์์
์ ๋ถ์ฐ ์ํค๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ
- task๋ผ๋ ํ๋์ ์์
๋จ์๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฐ๋๋ค (ํจ์๋ช
๊ฐ๋ฅ)
- ์์
์๋ฅผ Worker๋ผ๊ณ ํ๋ค
- ์ ๋ด ์์ปค ํ๋ก์ธ์ค๋ task queue๋ฅผ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋ง
- celery๋ ํด๋ผ์ด์ธํธ์ ์์ปค ์ฌ์ด๋ฅผ ์ค์ฌํ๋ ๋ธ๋ก์ปค ์ฌ์ฉํ๋ฉฐ ๋ฉ์ธ์ง๋ก ํต์
- ๋ธ๋ก์ปค๋ก Redis ์ RabbitMQ ์ฃผ๋ก ์ฌ์ฉ (RabbitMQ๊ฐ ๋ ์ ๋ง๋๋ค๊ณ ํจ)
celery ํน์ง
- ํ๊ฒฝ์ค์ ํ์ผ์ด ํ์ ์์ด์ ์ฌ์ฉ ๋ฐ ์ ์ง ์ฝ๋ค
- ๊ณ ๊ฐ์ฉ์ฑ ์์ปค ๋ฐ ํด๋ผ์ด์ธํธ๋ connection์ ์ค, ์คํจํ์๋ ์๋ Retry
- ๋น ๋ฅด๋ค. ๋ถ๋น ์๋ฐฑ๋ง ๊ฑด์ task ์ฒ๋ฆฌ
- ์ ์ฐํ๋ค. celery ๊ฑฐ์ ๋ชจ๋ ๋ถ๋ถ์ ์์ฒด์ ํ์ฅ, ์ฌ์ฉ๊ฐ๋ฅ
Celery Worker์ ๋์
Celery๋ Tasks ๋ฅผ Prefetch๋ฐฉ์์ผ๋ก ๊ฐ์ ธ์ ์ฒ๋ฆฌ
- Worker๊ฐ ๋ฏธ๋ฆฌ ์ฒ๋ฆฌํ๋ ค๋ ์์
์ฌ์ด์ฆ๋งํผ ๋ฏธ๋ฆฌ ๊ฐ์ ธ์ ๋๊ธฐ ์์ผ๋
- ์งํ ์ค์ธ ์์
์ด ์๋ฃ๋๋ฉด ๋ฏธ๋ฆฌ ๋๊ธฐ ์์ผ๋ Task ๊บผ๋ด์์ ์ฒ๋ฆฌ
worker_prefetch_multiplier opt์ผ๋ก ๋ช๊ฐ์ ์์
์ ๋ฏธ๋ฆฌ ๊ฐ์ ธ์ ๋๊ธฐ ํ ๊ฑด์ง ์ ํ ๊ฐ๋ฅ
Prefetch
- ์ฅ์
- ๋ฏธ๋ฆฌ Worker์ ๋ฉ๋ชจ๋ฆฌ๋ก ์ฎ๊ฒจ๋์ Broker์ ํต์ ํ์ ์ค์ผ ์ ์๋ค.
- ๋จ๊ธฐ ์์
์ผ๋ก ์ด๋ฃจ์ด์ง Worker์ธ ๊ฒฝ์ฐ ํ๋ฒ์ prefetch ๋ง์ด ๊ฐ์ ธ์ฌ ์๋ก ์ง์ฐ ์๊ฐ ์คํ ์๊ฐ์์ ์ด๋์ ๋ณผ ์ ์๋ค.
- ๋จ์
- Worker์์ ์ฒ๋ฆฌํ๋ Task๋ค์ ์๊ฐ ๋ถ๊ท์นํ ๊ฒฝ์ฐ ํ ๋น ํ ์คํ๋๊ธฐ๊น์ง ๊ธด ์๊ฐ ํ์, ๋์ค์ Broker๋ก ์ ๋ฌ๋์ด ๋ค๋ฅธ Worker์ ํ ๋น๋ Task๋ณด๋ค ๋ฆ์ ์ ์๋ค. (๊ธด ์๊ฐ์ Task, ์งง์ ์๊ฐ์ Task์ฒ๋ฆฌํ๋ Worker ๋ถ๋ฆฌ๋ก ํด๊ฒฐ)
- ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋ฐ๋ผ ๋ถ๋ฆฌ ํ๋ค๊ฒฝ์ฐ prefetch๊ฐ ๋ ๋นํจ์จ์ ์ผ ์ ์๋ค.
Celery ์ค์น
$ pip install 'celery[redis]'
celery๋ชจ๋๊ณผ redis ์ฐ๋์ ์ํ dependency๋ฅผ ํ๋ฒ์ ์ค์น (Redis์ค์น ํ์ง ์์๋ ์์กด์ฑ ํจํค์ง๋ ์ค์น ๋๋ค.
โ๏ธRedis
celery์์ ๋ฐ์ดํฐ ์ ์ฅ ์ฅ์น์ธ redis๋ฅผ ๋ฉ์์ง ๋ธ๋ก์ปค ์ฉ๋๋ก ์ฌ์ฉ
๋ฐ์ดํฐ ๊ฒ์์ ์ํด DB์ ์ ๊ทผ ์ ๋ฉ๋ชจ๋ฆฌ์์ Cache๋ฅผ ๊ฐ์ ธ๋ค ์จ ์๋๊ฐ ๋น ๋ฅด๋ค.
๋ธ๋ก์ปค๋ ์์
๋ฉ์ธ์ง๋ฅผ ์ ๋ฌ๋ฐ์ ๋๊ธฐ์ด(Queue)์ ๋ณด๊ดํ๋ค๊ฐ ์ ์ ํ ์์
์(Worker)๊ฐ ๋ฉ์ธ์ง๋ฅผ ๊ฐ์ ธ๊ฐ์ ์์
(Job)์ ์ํํ๊ฒ ๋๋ค
Key-Value๊ฐ์ ์ด์ฉํด ์ฒ๋ฆฌํ ์์
์ Celery์ ๋ณด๋ธ ๋ค์ Cache ์์คํ
์์ ํด๋น Key๋ฅผ ์์ ๋ ๋ฐฉ์์ผ๋ก ๋์
Redis ์ค์น
$ wget http://download.redis.io/redis-stable.tar.gz
$ tar xvzf redis-stable.tar.gz
$ cd redis-stable
$
$ redis-server
$ redis-cli ping
> PONG