1. Message Queue
๊ฐ. ๊ธฐ๋ณธ ๊ฐ๋
1) ๊ฐ๋
โข
์ ์: ๋น๋๊ธฐ ํต์ ์์คํ
์ผ๋ก ์๋ก ๋ค๋ฅธ ์์ฉํ๋ก๊ทธ๋จ ๊ฐ ๋ฐ์ดํฐ ์ก์์ ์ ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํจ
โข
ํน์ง
โ ๋น๋๊ธฐ ํต์ ์ ํน์ฑ์ ๋ฐ๋ผ ๋์ฐฉ์ง์ ์์ฉํ๋ก๊ทธ๋จ์ด ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ ์ํฉ์ด ์๋ ๊ฒฝ์ฐ, ์์ ๋ฐ์ดํฐ ์ ์ฅ์์ ๋ฉ์์ง๋ฅผ ๋ณด๊ดํจ
โ ๋ฐ์ดํฐ ์์ ์ ์ฅ์์ ๊ฒฝ์ฐ, ์ผ๋ฐ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ ๋ฐฉ์๊ณผ ํ์ผ ๊ธฐ๋ฐ ๋ฐฉ์์ด ์กด์ฌํจ
2) ๋์ ํ๋ฆ
โข
Producer๊ฐ ๋ถ์ฐ ๋น๋๊ธฐ ์ฒ๋ฆฌํ ์์
(tasks) ์์ฑ
โ Producer: Message Writer
โข
Broker๊ฐ ๊ฐ๊ฐ์ ์์
(task)์ ๋ํด consumer์๊ฒ ๋ถ์ฐ ์ ๋ฌ
โ Broker: Message Broker
โข
Consumer๊ฐ ์ ๋ฌ ๋ฐ์ ์์
์ ์ฒ๋ฆฌ
โ Consumer: Message Reader
โข
Result Backend๊ฐ ์ฒ๋ฆฌ๋ ์์
์ ์ ์ฅ
๋. ์ฃผ์ ์ปดํฌ๋ํธ
1) Broker
โข
Broker: Message Broker
โข
์์ฑ๋ task์ ๋ํด task queue๋ก ๊ด๋ฆฌํจ
โข
task๋ฅผ ์ ์ ํ ๊ฒฝ๋ก์ ๋ฐ๋ผ Consumer ๋ด worker์๊ฒ ์ ๋ฌ
โข
ex) RabbitMQ, Redis ๋ฑ์ด ์์
2) Consumer
โข
Consumer: Message Reader
โข
ํ๋ ์ด์์ worker๋ก ๊ตฌ์ฑ๋์ด ์์
3) Result Backend
โข
์ฒ๋ฆฌ๋ ์์
์ ์ ์ฅํ๊ธฐ ์ํด ๊ด๋ จ ์ค์ ํ์
โ ์ฒ๋ฆฌ๋ ์์
์ ์ ์ฅํ๋ ๊ฒ์ ๊ธฐ๋ณธ ์ธํ
์ด ์๋
2. RabbitMQ
๊ฐ. ๊ฐ๋ ์ ๋ฆฌ
1) ๊ธฐ๋ณธ ์ฉ์ด
โข
Queue: ๋ฒํผ์ ์ผ์ข
์ผ๋ก Broker์ ๋ฉ์์ง ์ ์ฅ์
โข
Exchange: ๋ฉ์์ง๋ฅผ ํน์ ํ๋ก ์ ๋ฌํด์ฃผ๋ ์ค๊ฐ์
โ Exchange๋ Virtual Host๋ณ๋ก ์ ์๋จ
โ bindings, routing keys, header attributes๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฉ์์ง ์ค๊ฐํจ
โข
Routing Key: Message ์ฃผ์
โ Exchange์์ Routing Key๋ฅผ ์ฝ์ด์ ์ด๋ค Queue๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ผ์ง๋ฅผ ๊ฒฐ์ ํ ๋ ์ฌ์ฉํจ
โข
Virtual Host: ๋ณต์์ virtual host๋ฅผ ๋ ์ผ๋ก์จ ํ๋์ RabbitMQ Instance์์ virtual host๋ณ๋ก Queue์ Exchange์ ๋ํ ์ ๊ทผ๊ถํ์ ๋ค๋ฅด๊ฒ ์ค์ ํ ์ ์๋ค
โข
binding: ํน์ queue์ exchange์ ์ฐ๊ฒฐ ์ค์
โข
Acknowledgements(or Ack): consumer๊ฐ ๋ฉ์์ง๋ฅผ ์ ๋ฐ์๋ค๋ ํ์๋ก Broker์๊ฒ ๋ณด๋ด๋ ๋ต์ฅ
โข
AMQP(Advanced Message Queuing Protocol): ์์คํ
๊ฐ ๋ฉ์์ง ์ก์์ ์ ๋ํ open standard protocol
โ Broker Vendor๋ ํ๋ซํผ์ ์ข
์๋์ง ์๊ณ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ด ํน์ง
โข
Delivery Tag: ์์ ๊ฐ ํ์ํจ
The Delivery tag uniquely identifies the delivery on a channel. If the delivery tag is set to 1, multiple messages can be acknowledged with a single method. If set to zero, the delivery tag refers to a single message.
Plain Text
๋ณต์ฌ
2) Exchange Types
โข
Direct Exchange: ๋ฉ์์ง ๋ด routing key์ ์ผ์นํ๋ binding key๋ฅผ ๊ฐ์ง๊ณ ์๋ queue๋ก ๋ฉ์์ง ๋ผ์ฐํ
โข
Default Exchange: ์ผ์ข
์ Direct Exchange๋ก ๋ฉ์์ง ๋ด routing key์ ์ผ์นํ๋ ์ด๋ฆ์ ๊ฐ์ง๊ณ ์๋ queue๋ก ๋ฉ์์ง ๋ผ์ฐํ
โ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๋ exchange๋ฅผ ์ด์ฉํ๊ณ , exchange์ ์ด๋ฆ์ ๋น ๋ฌธ์์ด๋ก ์ ์๋์ด ์๋ค
โข
Topic Exchange: ๋ฉ์์ง์ routing key์ Queue์ routing pattern์ ๋งค์นญ์ฌ๋ถ๋ฅผ ํ ๋๋ก ํด๋น๋๋ queue๋ก ๋ฉ์์ง ๋ผ์ฐํ
โ ๋ฉ์์ง์ routing key๋ ๋ง์นจํ๋ก ๊ตฌ๋ถ๋๋ words list์ ํํ
โ ํ์ routing pattern๋ ๋ง์นจํ๋ก ๊ตฌ๋ถ๋์ง๋ง *, #์ ํน์๋ฌธ๋ฅผ ํ์ฉํ์ฌ ๋ณต์์ routing key๋ฅผ ๋งค์นญํ ์ ์๋๋ก ๊ตฌ์ฑ๋จ
โ : ํด๋น ๊ตฌ๊ฐ์ ๋ชจ๋ ๋จ์ด ํฌํจ
ex) ๋ฉ์์ง๊ฐ ์ด๋ฌํ ํ์(ํ์ฌ.๋ณธ๋ถ.์ง์ฑ
)์ ๋ฐ๋ฅผ ๊ฒฝ์ฐ, ogq.*.leader์ ํจํด์ด ์ง์ ๋ ํ๋ ogq์ ๋ชจ๋ ๋ณธ๋ถ์ ๋ฆฌ๋๋ค์ ๋ํ ๋ฉ์์ง๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌํจ
โ #: ์ดํ ๋ชจ๋ ๊ตฌ๊ฐ์ ํด๋น
ex) ๋ฉ์์ง๊ฐ ์ด๋ฌํ ํ์(ํ์ฌ.๋ณธ๋ถ.์ง์ฑ
)์ ๋ฐ๋ฅผ ๊ฒฝ์ฐ, ogq.#์ ํจํด์ด ์ง์ ๋ ํ๋ ogq์ ๋ชจ๋ ๋ณธ๋ถ์ ๋ชจ๋ ๊ตฌ์ฑ์์ ๋ํ ๋ฉ์์ง๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌํจ
โข
Fanout Exchange: ๋ฐ์ธ๋ฉ๋์ด ์๋ ๋ชจ๋ ํ๋ก ๋ฉ์์ง ๋ผ์ฐํ
โ routing key๋ pattern๊ณผ๋ ๊ด๊ณ ์์ด ๋ฐ์ธ๋ฉ๋ ๋ชจ๋ ํ๋ก๋ก ๋ฉ์์ง๋ฅผ ๋ผ์ฐํ
ํ๋ค
โข
Headers Exchange: ๋ฉ์์ง ๋ด ํค๋ ์์ฑ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฉ์์ง ๋ผ์ฐํ
โ routing key ๋์ header attributes ๊ธฐ๋ฐ์ผ๋ก ๋งค์นญ๋๋ ํ๋ก ๋ฉ์์ง๋ฅผ ๋ผ์ฐํ
ํ๋ค
๋. ๊ธฐ๋ณธ ์ค์
1) ์์ / ์ข ๋ฃ
โข
RabbitMQ ์ค์น
โ brew install rabbitmq
โข
ํ๊ฒฝ๋ณ์ ์ค์
โ ์ ํ์ธ: echo $SHELL
โ (zsh์ ๊ฒฝ์ฐ) ํ๊ฒฝ๋ณ์ ์ค์ : vim ~/.zshrc
โ .zshrc ๋ด๋ถ์ ๋ค์๊ณผ ๊ฐ์ด ์ถ๊ฐ: PATH=$PATH:/usr/local/sbin
โข
RabbitMQ Server ์์
โ rabbitmq-server
โข
RabbitMQ Server ํ๋ก์ธ์ค ์ข
๋ฃ
โ ์๋ฒ๋ฅผ ํ๋ก์ธ์ค๊ฐ ์์ฃฝ์์ ๊ฒฝ์ฐ, ๊ด๋ จ ํ๋ก์ธ์ค ๊ฐ์ ์ข
๋ฃ
sudo lsof -i :25672
sudo kill -2 <PID>
Shell
๋ณต์ฌ
2) ์ค์
RabbitMQ URL ๊ตฌ์ฑ: amqp://user:password@host:5672/virtual_host
โข
์ฌ์ฉ์ ์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ ์์ฑ
โ rabbitmqctl add_user maxwell passwordOfmaxwell123
โ ์ฌ์ฉ์ ์ด๋ฆ: maxwell
โ ์ฌ์ฉ์ ๋น๋ฐ๋ฒํธ: passwordOfmaxwell123
โข
๊ฐ์ ํธ์คํธ ์์ฑ
โ rabbitmqctl add_vhost maxwell_vhost
โ ๊ฐ์ ํธ์คํธ ์ด๋ฆ: maxwell_vhost
โข
์ฌ์ฉ์ ํ๊ทธ ์์ฑ
โ rabbitmqctl set_user_tags maxwell maxwell_tag
โ ์ฌ์ฉ์ ์ด๋ฆ: maxwell
โ ํ๊ทธ ์ด๋ฆ: maxwell_tag
โข
๊ฐ์ ํธ์คํธ์ ๋ํ ์ฌ์ฉ์ ๊ถํ ์์ฑ
โ rabbitmqctl set_permissions -p maxwell_vhost maxwell ".*" ".*" ".*"
โ first ".*": ๋ชจ๋ entity์ ๋ํ ์ค์ ๊ถํ
โ second ".*": ๋ชจ๋ entity์ ๋ํ ์ฐ๊ธฐ ๊ถํ
โ third ".*": ๋ชจ๋ entity์ ๋ํ ์ฝ๊ธฐ ๊ถํ
โข
๋ฑ๋ก๋ ์ฌ์ฉ์ ๋ชฉ๋ก ํ์ธ
โ rabbitmqctl list_users
โ ๋ค์๊ณผ ๊ฐ์ด ํ์ธ ๊ฐ๋ฅ
3) Docker ๊ธฐ๋ฐ ์ด๊ธฐ ์ค์
โข
๋จ์ ์ค์น ๋ฐ ์คํ ๋ช
๋ น: docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 --restart=unless-stopped rabbitmq:management
โ management์ default admin ์ ๋ณด
โ default username: guest
โ default password: guest
โข
๊ฐ์ ํธ์คํธ ๋ฐ ์ฌ์ฉ์ ๋ฑ๋ก ์คํ ๋ช
๋ น
โ docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 --restart=unless-stopped -e RABBITMQ_DEFAULT_USER=cg_user -e RABBITMQ_DEFAULT_PASS=password -e RABBITMQ_DEFAULT_VHOST=cg_vhost rabbitmq:management
โ docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 --restart=unless-stopped -e RABBITMQ_DEFAULT_USER=ogq -e RABBITMQ_DEFAULT_PASS=magicogqworld -e RABBITMQ_DEFAULT_VHOST=backgrounds rabbitmq:management
โข
๋๋ docker Image ์ ์ํด์ ์ง์ ์คํ
โ docker exec -it <docker image> /bin/bash
3. Redis
๊ฐ. ๊ธฐ๋ณธ ์ค์
1) ์์ / ์ข ๋ฃ
โข
redis ์ค์น
โ brew install redis
โข
redis ์คํ
โ redis-server
โข
redis ์๋ฒ ์ ์ ์ค์น ํ์ธ
โ redis server ์คํํ ์ํ์์ ์๋ ๋ช
๋ น์ ๋ค๋ฅธ ํฐ๋ฏธ๋์์ ์
๋ ฅ
โ redis-cli ping
โ ์๋ต์ผ๋ก โPONGโ์ ๋ฐ์ผ๋ฉด ์ ์ ์ค์น
โข
redis ์๋ฒ ์ ์ง
โ redis-cli shutdown
โข
celery[redis] ์ค์น ํ์
โ ๋ฏธ์ค์น ์ Cellery๊ฐ Redis๋ฅผ ์ฐพ์ง๋ชปํ๊ณ NonType ๋ฐํ ์ด์ ๋ฐ์
โ pip install celery[redis]
2) ์ค์
โข
broker url ์์
โ ์์ ์ฝ๋
3) Redis Server Error
โข
ํ์
โข
ํด๊ฒฐ๋ฐฉ๋ฒ
โ ps -ef |grep redis
โ kill -9 <PID>
Reference
โข
rabbitmq with docker, https://hub.docker.com/_/rabbitmq
โข
Redis Server Error, https://velog.io/@sunaaank/Redis-server-error
โข
RabbitMQ server ์ข
๋ฃ, https://stackoverflow.com/questions/63263177/cant-start-rabbitmq-server-after-installation
โข
๊ธฐ๋ณธ๊ฐ๋
์ฐธ๊ณ , https://www.cloudamqp.com/blog/what-is-message-queuing.html
โข
RabbitMQ ์ฉ์ด ์ ๋ฆฌ, https://www.cloudamqp.com/blog/rabbitmq-and-amqp-concepts-dictionary-a-z.html
โข
Exchange, Routing Keys & Bindings, https://www.cloudamqp.com/blog/part4-rabbitmq-for-beginners-exchanges-routing-keys-bindings.html