Message Queue
Message Queue
ํ๋ก์ธ์ค ๋๋ ํ๋ก๊ทธ๋จ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ตํํ ๋ ์ฌ์ฉํ๋ ํต์ ๋ฐฉ๋ฒ ์ค์ ํ๋๋ก,
๋ฉ์์ง ์งํฅ ๋ฏธ๋ค์จ์ด(Message Oriented Middleware:MOM)๋ฅผ ๊ตฌํํ ์์คํ
๋ฉ์์ง ์งํฅ ๋ฏธ๋ค์จ์ด (MOM)
์์ฉ ์ํํธ์จ์ด ๊ฐ์ ๋ฐ์ดํฐ(๋น๋๊ธฐ ๋ฉ์์ง) ํต์ ์ ์ํ ์ํํธ์จ์ด
- ๋ฉ์์ง : ์์ฒญ, ์๋ต, ์ค๋ฅ ๋ฉ์์ง ํน์ ๋จ์ํ ์ ๋ณด ๋ฑ์ ์์ ๋ฐ์ดํฐ
๋ฉ์์ง ์งํฅ ๋ฏธ๋ค์จ์ด๋ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ ๊ณผ์ ์์ ๋ณด๊ดํ๊ฑฐ๋ ๋ผ์ฐํ ๋ฐ ๋ณํํ ์ ์๋ค๋ ์ฅ์ ์ ๊ฐ์ง๋ค.
- ๋ฉ์์ง์ ๋ฐฑ์ ์ ์ ์งํจ์ผ๋ก์จ ์ง์์ฑ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ์ก์์ ์ธก์ ๋์์ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ ์ ์งํ ํ์๊ฐ ์๋ค
- ํ๋์ ๋ฉ์์ง๋ฅผ ์ฌ๋ฌ ์์ ์์๊ฒ ๋ฐฐํฌ๊ฐ ๊ฐ๋ฅํ๋ค
- ์ก์์ ์ธก์ ์๊ตฌ์ ๋ฐ๋ผ ๋ฉ์์ง๋ฅผ ๋ณํํ ์ ์๋ค
=> ๋ฉ์์ง ํ๋ ๋ฉ์์ง๋ฅผ ์์๋ก ์ ์ฅํ๋ ๊ฐ๋จํ ๋ฒํผ๋ค !
๋ฉ์์ง๋ฅผ ์ ์ก ๋ฐ ์์ ํ๊ธฐ ์ํด ์ค๊ฐ์ ๋ฉ์์ง ํ๋ฅผ ๋๋๋ค.
๋ฉ์์ง ํ๋ฅผ ์ด์ฉํ๋ ๋ฐฉ์์ ์ผ๋์ผ ํต์ ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๋ฉ์์ง ํ์ ํน์ง
- ๋น๋๊ธฐ(Asynchronous) : ๋ฐ์ดํฐ๋ฅผ ์์ ์์๊ฒ ๋ฐ๋ก ๋ณด๋ด์ง ์๊ณ ํ์ ๋ฃ๊ณ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋์ค์ ์ฒ๋ฆฌ ๊ฐ๋ฅํ๋ค.
- ๋ฎ์ ๊ฒฐํฉ๋(Decoupling) : ์์ฐ์ ์๋น์ค์ ์๋น์ ์๋น์ค๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ํ๋ํ๊ฒ ๋จ์ผ๋ก์จ ์๋น์ค ๊ฐ ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ง๋ค.
- ํ๋ ฅ์ฑ(Resilience) : ์ผ๋ถ๊ฐ ์คํจํ๋๋ผ๋ ์ ์ฒด์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
- ์ฉ์ฅ์ฑ(Redundancy) : ์คํจํ ๊ฒฝ์ฐ ์ฌ์คํ์ด ๊ฐ๋ฅํ๋ค
- ๋ณด์ฅ์ฑ(Guarantees) : ๋ฉ์์ง ํ๋ ํ์ ๋ณด๊ด๋๋ ๋ชจ๋ ๋ฉ์์ง๊ฐ ๊ฒฐ๊ตญ ์๋น์ ์๋น์ค์๊ฒ ์ ๋ฌ๋๋ค๋ ์ผ๋ฐ์ ์ธ ๋ณด์ฅ์ ์ ๊ณตํ๋ค.
- ํ์ฅ์ฑ(Scalable) : ์์ฐ์ ์๋น์ค ํน์ ์๋น์ ์๋น์ค๋ฅผ ์ํ๋ ๋๋ก ํ์ฅํ ์ ์๊ธฐ ๋๋ฌธ์ ํ์ฅ์ฑ์ด ์ข๋ค.
๋ฉ์์ง ํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
์ผ๋ฐ์ ์ธ ํด๋ผ์ด์ธํธ-์๋ฒ ๊ตฌ์กฐ์์๋ ์ฌ์ฉ์๊ฐ ์์ฒญ์ ํ๋ฉด ์๋ฒ๋ ๊ทธ์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ํ ํ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ต์ ํ๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๊ฐ๋จํ ์๋ฒ ๊ตฌ์กฐ์์๋ ๊ตณ์ด ๋ฉ์์ง ํ๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๋ค.
์ฌ์ฉ์๊ฐ ์๋ต์ ๊ธฐ๋ค๋ ค์ผ ํ๋ HTTP ์์ฒญ์ ๋ฐ๋ก ์ฒ๋ฆฌํ์ง ์๊ณ ์ค๊ฐ์ ๋ฉ์์ง ํ๋ฅผ ๋๋ ๊ฒฝ์ฐ๋ ๋ฐ๋์งํ์ง ์๋ค.
๋ฉ์์ง ํ๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ํฉํ๋ค.
๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ฐฐ์น ์์ ์ด๋, ์ฑํ ์๋น์ค, ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๋ ํ์ฉ๋๋ค.
์๋ฅผ ๋ค์ด 1๋ง ๊ฐ์ ์์ฒญ์ด ๋ฐ์ํ์ ๋ ๋ชจ๋ ์์ฒญ์ ์๋ฒ๋ก ๋ณด๋ด๋ ๊ฒ์ด ์๋๋ผ ๋ฉ์์ง ํ์ ๋ณด๋ด๊ณ , ์๋ฒ ์ธก์์๋ ์ฒ๋ฆฌํ๋๋ฐ ์ด์ ์์ ์ ๋์ ์์ฒญ๋ค๋ง ๋ฉ์์ง ํ์์ ๊ฐ์ ธ์์ ์ฒ๋ฆฌํด์ค๋ค๋ฉด ์๋ฒ์ ๋ถ๋ด์ ์ค์ผ ์ ์๋ค.
- ๋ค๋ฅธ ๊ณณ์ API๋ก๋ถํฐ ๋ฐ์ดํฐ ์ก์์ ๊ฐ๋ฅ
- ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋น๋๊ธฐ ํต์ ๊ฐ๋ฅ
- ์ด๋ฉ์ผ ๋ฐ์ก ๋ฐ ๋ฌธ์ ์ ๋ก๋ ๊ฐ๋ฅ
- ๋ง์ ์์ ํ๋ก์ธ์ค๋ค์ ์ฒ๋ฆฌ ๊ฐ๋ฅ
๋ํ์ ์ธ ๋ฉ์์ง ํ
RabbitMQ, ActiveMQ, Kafka
RabbitMQ
- AMQP(Advanced Message Queuing Protocol) ํ๋กํ ์ฝ์ ๊ตฌํํด ๋์ ์คํ์์ค ๋ฉ์ธ์ง ๋ธ๋ก์ปค
- AMQP : ๋ฉ์์ง ์งํฅ ๋ฏธ๋ค์จ์ด๋ฅผ ์ํ ๊ฐ๋ฐฉํ ํ์ค ์์ฉ ๊ณ์ธต ํ๋กํ ์ฝ
- ์ ๋ขฐ์ฑ, ์์ ์ฑ๊ณผ ์ฑ๋ฅ์ ์ถฉ์กฑํ ์ ์๋๋ก ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณต
- ๋ฉ์์ง ํ๊ฐ ๋์ฐฉํ๊ธฐ ์ ์ ๋ผ์ฐํ ๋๋ฉฐ ํ๋ฌ๊ทธ์ธ์ ํตํด ๋ ๋ณต์กํ ๋ผ์ฐํ ๋ ๊ฐ๋ฅ
- ๋ก์ปฌ ๋คํธ์ํฌ์ ์๋ ์ฌ๋ฌ RabbitMQ ์๋ฒ๋ฅผ ๋ ผ๋ฆฌ์ ์ผ๋ก ํด๋ฌ์คํฐ๋ง ํ ์ ์๊ณ ๋ ผ๋ฆฌ์ ์ธ ๋ธ๋ก์ปค๋ ๊ฐ๋ฅํ๋ค.
- ๊ด๋ฆฌ UI๊ฐ ์์ด์ ํธํ๊ฒ ๊ด๋ฆฌ ๊ฐ๋ฅํ๋ค.
- ๊ฑฐ์ ๋ชจ๋ ์ธ์ด์ ์ด์์ฒด์ ๋ฅผ ์ง์ํ๋ค.
์ฌ์ฉํ๋ ์ผ์ด์ค
- ์์ฒญ์ ๋ง์ ์ฌ์ฉ์์๊ฒ ์ ๋ฌํ ๋
- ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ์๊ฐ์ด ๊ธธ ๋
- ๋ง์ ์์ ์ด ์์ฒญ๋์ด ์ฒ๋ฆฌ๋ฅผ ํด์ผํ ๋
ํด๋นํ๋ ์์ฒญ์ ๋ค๋ฅธ API์๊ฒ ์์ํ๊ณ ๋น ๋ฅธ ์๋ต์ ํ ๋ ๋ง์ด ์ฌ์ฉํ๋ค. MQ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ ์ ์๋ค๋ ์ฅ์ ๋ ๊ฐ์ง๋ค.
ActiveMQ
- Java๋ก ๋ง๋ ์คํ์์ค ๋ฉ์์ง ๋ธ๋ก์ปค
- JMS๋ฅผ ํตํด ๋ค์ํ ์ธ์ด์ ํ๋กํ ์ฝ ์ง์(Java, C, C++, C#, Ruby, Perl, Python, PHP ํด๋ผ์ด์ธํธ ์ง์)
- Message Groups, Virtual Destinations, Wildcards์ Composite Destinations ์ง์
- JMS 1.1๊ณผ J2EE 1.4๋ฅผ ์๋ฒฝํ๊ฒ ์ง์ํ๋ฉฐ, transient, persistent, transactional, ๊ทธ๋ฆฌ๊ณ XA ๋ฉ์์ง ์ง์
- Spring ์ง์์ผ๋ก ActiveMQ๋ Spring ์ ํ๋ฆฌ์ผ์ด์ ์ ๋งค์ฐ ์ฝ๊ฒ ์๋ฒ ๋ฉ ๋ ์ ์์ผ๋ฉฐ, Spring์ XML ์ค์ ๋ฉ์ปค๋์ฆ์ ์ํด ์ฝ๊ฒ ์ค์ ๊ฐ๋ฅ
- ๊ณ ์ฑ๋ฅ์ ํด๋ฌ์คํฐ๋ง, ํด๋ผ์ด์ธํธ-์๋ฒ, Peer ๊ธฐ๋ฐ ํต์ ์ ์ง์์ ์ํ ์ค๊ณ๊ฐ ๋์ด ์์
- REST API๋ฅผ ํตํด ์น ๊ธฐ๋ฐ ๋ฉ์์ง API๋ฅผ ์ง์
AMQP vs JMS
- AMQP๋ ISO ์์ฉ ๊ณ์ธต์ MOM ํ์ค์ด๋ฉฐ, JMS๋ MOM์ Java์์ ์ง์ํ๋ ํ์ค API์ด๋ค.
- JMS๋ ๋ค๋ฅธ Java ์ ํ๋ฆฌ์ผ์ด์ ๋ผ๋ฆฌ ํต์ ์ด ๊ฐ๋ฅํ์ง๋ง, ๋ค๋ฅธ MOM์ ํต์ ์ ๋ถ๊ฐ๋ฅ(AMQP, SMTP ๋ฑ)
- AMQP๋ ํ๋กํ ์ฝ๋ง ๋ง๋ค๋ฉด ๋ค๋ฅธ AMQP๋ฅผ ์ฌ์ฉํ ์ ํ๋ฆฌ์ผ์ด์ ๋ผ๋ฆฌ ํต์ ์ด ๊ฐ๋ฅ
- JMS ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ AMQP๋ฅผ ์ง์ํ์ง ์๋๋ค.
Kafka
- ๋์ฉ๋์ ์ค์๊ฐ ๋ก๊ทธ ์ฒ๋ฆฌ์ ํนํ๋์ด ์ค๊ณ๋ ๋ฉ์์ง ์์คํ
- ๋ถ์ฐ ์์คํ ์ ๊ธฐ๋ณธ์ผ๋ก ์ค๊ณ๋์๊ธฐ ๋๋ฌธ์, ๊ธฐ์กด ๋ฉ์์ง ์์คํ ์ ๋นํด ๋ถ์ฐ ๋ฐ ๋ณต์ ๊ตฌ์ฑ์ ์์ฝ๊ฒ ํ ์ ์๋ค.
- AMQP ํ๋กํ ์ฝ์ด๋ JMS API๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋จ์ํ ๋ฉ์์ง ํค๋๋ฅผ ์ง๋ TCP๊ธฐ๋ฐ์ ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ ํ๋กํ ์ฝ์ ์ํ ์ค๋ฒํค๋๋ฅผ ๊ฐ์์ํจ๋ค.
- ํ์ผ ์์คํ ์ ๋ฉ์์ง๋ฅผ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๋ณ๋์ ์ค์ ์ ํ์ง ์์๋ ๋ฐ์ดํฐ์ ์์์ฑ(durability)์ด ๋ณด์ฅ๋๋ค..
- ๋ฉ์์ง๋ฅผ pull ๋ฐฉ์์ผ๋ก ๊ฐ์ ธ์ค๋ฏ๋ก, ๋ฉ์์ง๋ฅผ ์์๋์๋ค๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ batch consumer์ ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.
- ๋ค์์ ๋ฉ์์ง๋ฅผ batchํํ๋ก broker์๊ฒ ํ ๋ฒ์ ์ ๋ฌํ ์ ์์ด TCP/IP ๋ผ์ด๋ํธ๋ฆฝ ํ์๋ฅผ ์ค์ผ ์ ์๋ค.
RabbitMQ vs ActiveMQ vs Kafka ?
์ผ๋ฐ์ ์ผ๋ก RabbitMQ, ActiveMQ๋ ์ ๋ขฐ์ฑ ์๋ ๋ฉ์์ง ๋ธ๋ก์ปค๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ฌ์ฉํ๊ณ ,
Kafka๋ ์ฒ๋ฆฌ๋์ด ๋ง์ ๋ถ์ฐ ๋ฉ์์ง ์์คํ ์ ์ฌ์ฉ๋๋ค.
RabbitMQ : ๋น ๋ฅด๊ณ ์ฝ๊ฒ ๊ตฌ์ฑ ํ ์ ์์ผ๋ฉฐ ์ง๊ด์ .
- AMQT ํ๋กํ ์ฝ์ ๊ตฌํํด๋์ ํ๋ก๊ทธ๋จ, ์ ๋ขฐ์ฑ, ์ ์ฐํ ๋ผ์ฐํ , UI์ ํธ๋ฆฌ์ฑ
ActiveMQ : ํจ์จ์ ์ด๊ณ ์ฌ์ฉํ๊ธฐ ์ฌ์ด ์คํ ์์ค.
- ์๋ฐ๋ก ๋ง๋ ์คํ์์ค ๋ฉ์์ง ๋ธ๋ก์ปค
- ๋ค์ํ ์ธ์ด์ ํ๋กํ ์ฝ์ ์ง์
Kafka : ํ์ฅ์ฑ, ๊ณ ์ฑ๋ฅ ๋ฐ ๋์ ์ฒ๋ฆฌ๋.
- ๋์ฉ๋ ์ค์๊ฐ ๋ก๊ทธ ์ฒ๋ฆฌ์ ํนํ, ๋จ์ํ ๋ฉ์์ง ํค๋๋ฅผ ์ง๋ TCP ๊ธฐ๋ฐ์ ํ๋กํ ์ฝ ์ฌ์ฉ์ผ๋ก ์ค๋ฒํค๋ ๊ฐ์