celery & redis

Simba_bยท2022๋…„ 10์›” 27์ผ
1
post-thumbnail

โœ”๏ธ 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๋ฐฉ์‹์œผ๋กœ ๊ฐ€์ ธ์™€ ์ฒ˜๋ฆฌ

  1. Worker๊ฐ€ ๋ฏธ๋ฆฌ ์ฒ˜๋ฆฌํ•˜๋ ค๋Š” ์ž‘์—… ์‚ฌ์ด์ฆˆ๋งŒํผ ๋ฏธ๋ฆฌ ๊ฐ€์ ธ์™€ ๋Œ€๊ธฐ ์‹œ์ผœ๋‘ 
  2. ์ง„ํ–‰ ์ค‘์ธ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ๋ฏธ๋ฆฌ ๋Œ€๊ธฐ ์‹œ์ผœ๋‘” 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 ์‹คํ–‰
$ redis-cli ping # ์ •์ƒ ์„ค์น˜๋˜์—ˆ๋Š”์ง€ ํ™•์ธ
> PONG

0๊ฐœ์˜ ๋Œ“๊ธ€