[Network] Message Queue(๋ฉ์์งํ) ์ ๋ฆฌ
๐ก ๋ณธ ๋ฌธ์๋ 'Message Queue(๋ฉ์์งํ) ์ ๋ฆฌ'์ ๋ํด ์ ๋ฆฌํด๋์ ๊ธ์ ๋๋ค.
๋ฒค๋๋ค ์ฌ์ด์ ํต์ ์ ํ๋ ค๋ค๋ณด๋ ๋น๋๊ธฐ๋ก ๋ฉ์์ง ์ฒ๋ฆฌํ๋ ํ๋กํ ์ฝ์ด ํ์ํ๋๋ฐ, Message Queue๊ฐ ์ด๋ฅผ ์ ์ฒ๋ฆฌํด์ฃผ๋ ๊ฒ์ ํ์ธํ๊ณ Message Queue์ ๋ํด ์ ๋ฆฌํ ๊ธ์ด๋ ์ฐธ๊ณ ๋ถํ๋๋ฆฝ๋๋ค.
1. Message Queue
1.1 Message Queue(์ดํ ๋ฉ์์ง ํ) ๋ฐฐ๊ฒฝ
๋ฉ์์ง ์งํฅ ๋ฏธ๋ค์จ์ด(Meesage Oriented Middleware: MOM)์ ๋น๋๊ธฐ ๋ฉ์์ง๋ฅผ ์ฌ์ฉํ๋ ๋ค๋ฅธ ์์ฉ ํ๋ก๊ทธ๋จ ์ฌ์ด์์ ๋ฐ์ดํฐ ์ก์์ ์ ์๋ฏธํฉ๋๋ค. MOM์ ๊ตฌํํ ์์คํ
์ ๋ฉ์์ง ํ(MessageQueue: MQ)๋ผ ํฉ๋๋ค. ๋ฉ์์ง ํ๋ ๋ณ๋์ ๊ณต์ ์์
์ ์ฐ๊ธฐํ ์ ์๋ ์ ์ฐ์ฑ์ ์ ๊ณตํ์ฌ SOA(Service-Oriented Architecture)์ ๊ฐ๋ฐ์ ๋์์ ์ค ์ ์์ต๋๋ค.
* ๋ฉ์์ง: ์์ฒญ, ์๋ต, ์ค๋ฅ ๋ฉ์์ง ํน์ ๋จ์ํ ์ ๋ณด ๋ฑ์ ์์ ๋ฐ์ดํฐ
ํ๋ก๊ทธ๋๋ฐ์์ MQ๋ ํ๋ก์ธ์ค ๋๋ ํ๋ก๊ทธ๋จ ์ธ์คํด์ค๊ฐ ๋ฐ์ดํฐ๋ฅผ ์๋ก ๊ตํํ ๋ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ด๋ ๋ฐ์ดํฐ๋ฅผ ๊ตํํ ๋ ์์คํ ์ด ๊ด๋ฆฌํ๋ ๋ฉ์์ง ํ๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด ํน์ง์ ๋๋ค. ์ด๋ ๊ฒ ์๋ก ๋ค๋ฅธ ํ๋ก์ธ์ค๋ ํ๋ก๊ทธ๋จ ์ฌ์ด์ ๋ฉ์์ง๋ฅผ ๊ตํํ ๋ AMQP(Advanced Message Queuing Protocol)์ ์ด์ฉํฉ๋๋ค. AMQP๋ ๋ฉ์์ง ์งํฅ ๋ฏธ๋ค์จ์ด๋ฅผ ์ํ open standard application layer protocol์ ๋๋ค. AMQP๋ฅผ ์ด์ฉํ๋ฉด ๋ค๋ฅธ ๋ฒค๋ ์ฌ์ด์ ๋ฉ์ธ์ง๋ฅผ ์ ์กํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ฐ JMS(Java Message Service)๊ฐ API๋ฅผ ์ ๊ณตํ๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ AMQP๋ wire-protocol์ ์ ๊ณตํ๋๋ฐ ์ด๋ octet stream์ ์ด์ฉํด์ ๋ค๋ฅธ ๋คํธ์ํฌ ์ฌ์ด์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ์ ์๋ ํฌ๋งท์ผ๋ก ์ด๋ฅผ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
1.2 ๋ฉ์์ง ํ์ ์ฅ์
- ๋น๋๊ธฐ(Asynchronous): Queue์ ๋ฃ๊ธฐ ๋๋ฌธ์ ๋์ค์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ๋น๋์กฐ(Decoupling): ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ถ๋ฆฌํ ์ ์์ด ์๋น์ค ๊ฐ ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ง๋๋ค.
- ํ๋ ฅ์ฑ(Resilience): ์ผ๋ถ๊ฐ ์คํจ ์ ์ ์ฒด์ ์ํฅ์ ๋ฐ์ง ์์ผ๋ฉฐ, ์๋น์ค๊ฐ ๋ค์ด๋๋๋ผ๋ ๋ฉ์์ง ํ์๋ ๋จ์์๊ธฐ์ ์ฌ์คํํ๋ฉด ํด๋น ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ๊ณผ์(Redundancy): ์คํจํ ๊ฒฝ์ฐ ์ฌ์คํ ๊ฐ๋ฅํฉ๋๋ค.
- ๋ณด์ฆ(Guarantees): ์์ ์ด ์ฒ๋ฆฌ๋๊ฑธ ํ์ธํ ์ ์์ผ๋ฉฐ, ๋ชจ๋ ๋ฉ์์ง๊ฐ ๊ฒฐ๊ตญ ์ ๋ฌ๋๋ค๋ ์ผ๋ฐ์ ์ธ ๋ณด์ฅ์ ์ ๊ณตํฉ๋๋ค.
- ํ์ฅ์ฑ(Scalable): ๋ค์์ ํ๋ก์ธ์ค๋ค์ด ํ์ ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ์ ์์ต๋๋ค.
๋ฉ์์ง ํ๋ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ฐฐ์น ์์ ์ด๋, ์ฑํ ์๋น์ค, ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉํฉ๋๋ค. ํ๋ก์ธ์ค ๋จ์๋ก ์ฒ๋ฆฌํ๋ ์น ์์ฒญ์ด๋ ์ผ๋ฐ์ ์ธ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด์ ์ฌ์ฉํ๋๋ฐ ์ฌ์ฉ์๊ฐ ๋ง์์ง๊ฑฐ๋ ๋ฐ์ดํฐ๊ฐ ๋ง์์ง๋ฉด ์์ฒญ์ ๋ํ ์๋ต์ ๊ธฐ๋ค๋ฆฌ๋ ์๊ฐ ์ฆ๊ฐํ๋ค๊ฐ ๋์ค์๋ ๋๊ธฐ ์๊ฐ์ด ์ง์ฐ๋์ด์ ์๋น์ค๊ฐ ์ ์์ ์ผ๋ก ๋์ง ๋ชปํ๋ ์ํฉ์ด ์ค๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด์ ๋ถ์ฐ๋์ด ์๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ํ ๊ณณ์ ์ง์คํ๋ฉด์ ๋ฉ์ธ์ง ๋ธ๋ก์ปค๋ฅผ ๋์ด์ ํ์ํ ํ๋ก๊ทธ๋จ์ ์์ ์ ๋ถ์ฐ์ํค๋ ๋ฐฉ๋ฒ์ ํ๋ ๊ฒ์ด ๊ทธ ๋ชฉ์ ์ ๋๋ค.
1.3 ๋ฉ์์ง ํ ํ์ฉ
๋ฉ์์ง ํ๋ ๋ฉ์์ง๋ฅผ ์ด๋ ์์ ์ ๊ฐ์ ธ๊ฐ์ ์ฒ๋ฆฌํ๋ ์ง๋ ๋ณด์ฅํ์ง ์์ต๋๋ค. ์ธ์ ๊ฐ๋ ํ์ ๋ฃ์ด๋ ๋ฉ์์ง๊ฐ ์๋น๋์ด ์ฒ๋ฆฌ๋ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ์ด๋ฌํ ๋น๋๊ธฐ์ ํน์ฑ ๋๋ฌธ์ ๋ฉ์์ง ํ๋ ์คํจํ๋ฉด ์น๋ช ์ ์ธ ํต์ฌ ์์ ๋ณด๋ค๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ํฉํฉ๋๋ค.
- ๋ค๋ฅธ ๊ณณ์ API๋ก๋ถํฐ ๋ฐ์ดํฐ ์ก์์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋น๋๊ธฐ ํต์ ์ ํ ์ ์์ต๋๋ค.
- ์ด๋ฉ์ผ ๋ฐ์ก ๋ฐ ๋ฌธ์ ์ ๋ก๋๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
- ๋ง์ ์์ ํ๋ก์ธ์ค๋ค์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
1.4 JMS vs AMQP
- AMQP๋ ISO ์์ฉ ๊ณ์ธต์ MOM ํ์ค์ ๋๋ค.
- JMS๋ MOM์ ์๋ฐ์์ ์ง์ํ๋ ํ์ค API์ ๋๋ค(JMS์ AMQP๋ ๋ค๋ฅธ ๊ฐ๋ ์ ๋๋ค).
- JMS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ AMQP๋ฅผ ์ง์ํ์ง๋ ์๊ธฐ์ JMS๋ ๋ค๋ฅธ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ๋ค๋ผ๋ฆฌ ํต์ ์ด ๊ฐ๋ฅํ์ง๋ง ๋ค๋ฅธ MOM(AMQP, SMTP ๋ฑ)๊ณผ์ ํต์ ์ ๋ถ๊ฐ๋ฅ ํฉ๋๋ค.
- ActiveMQ์ JMS๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ๋ค๋ผ๋ฆฌ ํต์ ์ด ๊ฐ๋ฅํ๊ธด ํฉ๋๋ค. ํ์ง๋ง ๋ค๋ฅธ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ (ActiveMQ๋ฅผ ์ฌ์ฉ์ํจ)์ JMS์๋ ํต์ ํ ์ ์์ต๋๋ค.
- AMQP๋ ํ๋กํ ์ฝ๋ง ๋ง๋ค๋ฉด ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ (AMQP, SMTP ๋ฑ)๊ณผ ํต์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
2. ์คํ ์์ค ๋ฉ์์ง ํ
RabbitMQ, ActiveMQ, ZeroMQ, Kafka์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
2.1 ActiveMQ : JMS(Java Message Service)
์ํ์น ActiveMQ๋ JMS ํด๋ผ์ด์ธํธ์ ํจ๊ป ์๋ฐ๋ก ๋ง๋ ์คํ์์ค ๋ฉ์์ง ๋ธ๋ก์ปค์ ๋๋ค. ํ๋ ์ด์์ ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ์ ์ปค๋ฎค๋์ผ์ด์ ์ ์ ๊ณตํฉ๋๋ค. JMS 1.1์ ํตํด ์๋ฐ ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ "๊ต์ฐจ์ธ์ด"๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ๋ฅผ ์ง์ํฉ๋๋ค. ์ปค๋ฎค๋์ผ์ด์ ์ ์ปดํจํฐ ํด๋ฌ์คํฐ๋ง ๋ฐ ๊ฐ์๋ฉ๋ชจ๋ฆฌ, ์บ์ฌ ๊ทธ๋ฆฌ๊ณ ์ ๋ ์ง์์ฑ์ ์ ์ธํ ์ด๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ JMS ์ง์์ฑ ์ ๊ณต์๋ก ์ด์ฉํ ์ ์๋์ง ๋ฑ์ ํน์ง๋ค์ ํตํด ์ด์๋ฉ๋๋ค.
2.1.1 ์ฃผ์ ํน์ฑ๋ค
- ๋ค์ํ ํ๋กํ ์ฝ์ ์ง์ํ๋ฉฐ Java, C, C++, C#, Ruby, Perl, Python, ๊ทธ๋ฆฌ๊ณ PHP ํด๋ผ์ด์ธํธ๋ค์ ์ง์ํ๋ฉฐ, OpenWire๋ฅผ ํตํด ๊ณ ์ฑ๋ฅ์ Java, C, C++, C# ํด๋ผ์ด์ธํธ ์ง์ํฉ๋๋ค.
- JMS๋ ๋ค๋ฅธ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ๋ค๋ผ๋ฆฌ ํต์ ์ด ๊ฐ๋ฅํ์ง๋ง ๋ค๋ฅธ MOM(AMQP, SMTP ๊ฐ์)๊ณผ์ ํต์ ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
- Stomp๋ฅผ ํตํด C, Ruby, Perl, Python, PHP ํด๋ผ์ด์ธํธ๊ฐ ๋ค๋ฅธ ์ธ๊ธฐ์๋ ๋ฉ์์ง ๋ธ๋ก์ปค๋ค๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ActiveMQ์ ์ ๊ทผํ ์ ์์ต๋๋ค.
- Message Groups, Virtual Destinations, Wildcards์ Composite Destinations๋ฅผ ์ง์ํฉ๋๋ค.
- JMS 1.1๊ณผ J2EE 1.4๋ฅผ ์๋ฒฝํ๊ฒ ์ง์ํ๋ฉฐ, transient, persistent, transactional, ๊ทธ๋ฆฌ๊ณ XA ๋ฉ์์ง์ ์ง์ํฉ๋๋ค.
- Spring ์ง์์ผ๋ก ActiveMQ๋ Spring ์ ํ๋ฆฌ์ผ์ด์ ์ ๋งค์ฐ ์ฝ๊ฒ ์๋ฒ ๋ฉ๋ ์ ์์ผ๋ฉฐ, Spring์ XML ์ค์ ๋ฉ์ปค๋์ฆ์ ์ํด ์ฝ๊ฒ ์ค์ ๋ฉ๋๋ค.
- Geronimo, JBoss 4, GlassFish, ๊ทธ๋ฆฌ๊ณ WebLogic๊ณผ ๊ฐ์ ์ธ๊ธฐ์๋ J2EE ์๋ฒ๋ค๊ณผ ํจ๊ป ํ ์คํธ๋ฉ๋๋ค.
- Inbound์ Outbound ๋ฉ์์ง์ ์ํ JCA 1.5 Resource Adapter๋ฅผ ํฌํจํ์ฌ ActiveMQ๊ฐ J2EE 1.4 ํธํ ์๋ฒ์ ์๋ ๋ฐฐ์น๋ฉ๋๋ค.
- In-VM, TCP, SSL, NIO, UDP, Multicast, JGroups, ๊ทธ๋ฆฌ๊ณ JXTA Transport๋ค๊ณผ ๊ฐ์ ํ๋ฌ๊ทธ์ธ ๊ฐ๋ฅํ ์ ์ก ํ๋กํ ์ฝ๋ค์ ์ง์ํฉ๋๋ค.
- ๊ณ ์ฑ๋ฅ์ ์ ๋์ ์ฌ์ฉํ ๋์ JDBC๋ฅผ ์ฌ์ฉํ์ฌ ๋งค์ฐ ๋น ๋ฅธ Persistnece๋ฅผ ์ง์ํฉ๋๋ค.
- ๊ณ ์ฑ๋ฅ์ ํด๋ฌ์คํฐ๋ง, ํด๋ผ์ด์ธํธ-์๋ฒ, Peer ๊ธฐ๋ฐ ํต์ ์ ์ง์์ ์ํ ์ค๊ณ๊ฐ ๋์ด ์์ต๋๋ค.
- REST API๋ฅผ ํตํด ์น๊ธฐ๋ฐ ๋ฉ์์ง API๋ฅผ ์ง์ํฉ๋๋ค.
- ์น๋ธ๋ผ์ฐ์ ๊ฐ ๋ฉ์์ง ๋๊ตฌ๊ฐ ๋ ์ ์๋๋ก, Ajax๋ฅผ ํตํด ์์ํ DHTML์ ์ฌ์ฉํ ์น์คํธ๋ฆฌ๋ฐ ์ง์์ ํฉ๋๋ค.
- In-memory JMS Provider๋ก ์ฌ์ฉ๋ ์ ์์ผ๋ฉฐ, ์ด๋ JMS๋ฅผ ์ฌ์ฉํ ๋จ์ ํ ์คํธ์ ์ ํฉํ ์๋ฃจ์ ์ ์ ๊ณตํฉ๋๋ค.
- STOMP, AMQP, MQTT, Openwire, SSL, and WebSockets
2.2 RabbitMQ : AMQP(Advanced Message Queuing Protocol)
RabbitMQ๋ AMQP ํ๋กํ ์ฝ์ ๊ตฌํํ ์คํ์์ค ๋ฉ์์ง ๋ธ๋ก์ปค์ ๋๋ค. ์ ๋ขฐ์ฑ, ์์ ์ฑ๊ณผ ์ฑ๋ฅ์ ์ถฉ์กฑํ ์ ์๋๋ก ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๊ฑฐ์ ๋ชจ๋ ์ธ์ด์ ์ด์์ฒด์ ๋ฅผ ์ง์ํ๋ฉฐ ์คํ์์ค๋ก ์์ ์ ์ง์์ด ๊ฐ๋ฅํฉ๋๋ค.
2.2.1 ์ฃผ์ ํน์ฑ๋ค
- ์ ์ฐํ ๋ผ์ฐํ : Message Queue๊ฐ ๋์ฐฉํ๊ธฐ ์ ์ ๋ผ์ฐํ ๋๋ฉฐ ํ๋ฌ๊ทธ์ธ์ ํตํด SMTP, STOMP ํ๋กํ ์ฝ๊ณผ์ ํ์ฅ์ด ๊ฐ๋ฅํ์ฌ ๋ณต์กํ ๋ผ์ฐํ ๋ ๊ฐ๋ฅํฉ๋๋ค.
- ํด๋ฌ์คํฐ๋ง: ๋ก์ปฌ๋คํธ์ํฌ์ ์๋ ์ฌ๋ฌ RabbitMQ ์๋ฒ๋ฅผ ๋ ผ๋ฆฌ์ ์ผ๋ก ํด๋ฌ์คํฐ๋งํ ์ ์๊ณ ๋ ผ๋ฆฌ์ ์ธ ๋ธ๋ก์ปค๋ ๊ฐ๋ฅํฉ๋๋ค.
- ํ๋กํ ์ฝ๋ง ๋ง๋ค๋ฉด ๋ค๋ฅธ AMQP๋ฅผ ์ฌ์ฉํ ์ ํ๋ฆฌ์ผ์ด์ ๋ผ๋ฆฌ ํต์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๊ฑฐ์ ๋ชจ๋ ์ธ์ด์ ์ด์์ฒด์ ๋ฅผ ์ง์ํฉ๋๋ค.
- ๊ด๋ฆฌ UI๊ฐ ์์ด ํธํ๊ฒ ๊ด๋ฆฌ ๊ฐ๋ฅํฉ๋๋ค.
2.3 ZeroMQ (0MQ, zmq)
ZeroMQ๋ ๋ฉ์์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ฉฐ, ๋ง์ ์๊ณ ๋ฅผ ๋ค์ด์ง ์๊ณ ๋ ๋น ๋ฅด๊ณ ๋ณต์กํ ์ปค๋ฎค๋์ผ์ด์ ์์คํ ์ ์ค๊ณํ ์ ์๋๋ก ํด์ค๋๋ค. ZeroMQ ์ฒ์์ '๋ฉ์ธ์ง ๋ฏธ๋ค์จ์ด'๋ก ์๊ฐ๋์์ง๋ง, ๋์ค์๋ '์คํ ๋ก์ด๋๋ฅผ ๋ง์ TCP' ๊ทธ๋ฆฌ๊ณ ๋์ค์๋ '๋คํธ์ํฌ ์คํ์ ์๋ก์ด ๋ ์ด์ด'๋ผ๊ณ ๋งํ๊ณค ํฉ๋๋ค. ZeroMQ๋ ์๋ฒ ๋๋ ๋คํธ์ํน ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด์ง๋ง, ๋์์ฑ ํ๋ ์์ํฌ์ ๊ฐ์ ์ญํ ์ ํฉ๋๋ค.
ZeroMQ๋ in-process, inter-process, TCP and multicast ์ฒ๋ผ ๋ค์ํ ๋ฐฉ์์ผ๋ก ๋ฉ์์ง๋ฅผ ์ ์กํ๋ ์์ผ์ ์ ๊ณตํฉ๋๋ค. fanout, pub-sub, tsak distribution, and request-reply์ ๊ฐ์ ํจํด์ผ๋ก N-to-N ์์ผ์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ํด๋ฌ์คํฐ ๊ตฌ์กฐ์์ ์ถฉ๋ถํ ์๋๋ฅผ ์ ์กํฉ๋๋ค. ๋ํ, ๋น๋๊ธฐ I/O ๋ชจ๋ธ์ ๋น๋๊ธฐ ๋ฉ์์ง ์ฒ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ ํ์ฅ ๋ฉํฐ ์ฝ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ณตํฉ๋๋ค. ์ด๊ฒ์ language API๋ฅผ ์ ๊ณตํ์ฌ ๊ฑฐ์ ๋ชจ๋ ์ธ์ด์ ์ด์์ฒด์ ๋ฅผ ์ง์ํฉ๋๋ค. ZeroMQ๋ iMatix์์ ๋ง๋ค์ด์ก์ผ๋ฉฐ, LGPL ์คํ์์ค ์ํํธ์จ์ด์ ๋๋ค.
2.3.1 ์ฃผ์ ํน์ฑ๋ค
ํผํฌ๋จผ์ค
๋ค๋ฅธ AMQP๋ค ๋ณด๋ค ๋จ์๊ฐ ๋ค๋ฅผ ์ ๋๋ก ๋น ๋ฅด๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ ๊ธฐ์ ๋ก ๊ฐ๋ฅํฉ๋๋ค.
- AMQP์ฒ๋ผ ๊ณผ๋ํ๊ฒ ๋ณต์กํ ํ๋กํ ์ฝ์ด ์์ต๋๋ค.
- ์ ๋ขฐ์ฑ ์๋ ๋ฉํฐ์บ์คํธ๋ Y-suite IPC ์ ์ก๊ฐ์ ํจ์จ์ ์ธ ์ ์ก์ ํ์ฉํฉ๋๋ค.
- ์ง๋ฅ์ ์ธ ๋ฉ์์ง ๋ฌถ์์ ํ์ฉํฉ๋๋ค. ์ด๊ฒ์ ZeroMQ๋ก ํ์ฌ๊ธ ํ๋กํ ์ฝ ์ค๋ฒํค๋๋ฟ๋ง ์๋๋ผ ์์คํ ํธ์ถ์ ์ค์ฌ์ TCP/IP๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ฒ ํฉ๋๋ค.
๋จ์์ฑ
API๊ฐ ๊ฐ๋จํ๋ฉฐ ์์ผ ๋ฐฉ์(์์ผ ๋ฒํผ์ ๊ณ์ '๊ฐ์ ์ฑ์' ์ฃผ์ด์ผ ํ๋)์ ๋น๊ตํ๋ฉด ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ๊ฒ์ด ์ ๋ง๋ก ๋จ์ํฉ๋๋ค.
- ZeroMQ์์๋ ๊ทธ๋ฅ ๋น๋๊ธฐ send ํธ์ถ์ ๋ถ๋ฅด๊ธฐ๋ง ํ๋ฉด, ๋ฉ์์ง๋ฅผ ๋ณ๋์ ์ค๋ ๋์ ํ์ ๋ฃ๊ณ ํ์ํ ๋ชจ๋ ์ผ์ ํด์ค๋๋ค. ์ด๋ฌํ ๋น๋๊ธฐ ํน์ฑ์ด ์๊ธฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ์์ง๊ฐ ์ฒ๋ฆฌ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉฐ ์๊ฐ์ ๋ญ๋นํ์ง ์์๋ ๋ฉ๋๋ค. ZeroMQ์ ๋น๋๊ธฐ ํน์ฑ์ ์ด๋ฒคํธ ์ค์ฌ์ ํ๋ ์์ํฌ์๋ ์ต์ ์ ๋๋ค.
- ZeroMQ์ ๋จ์ํ ์์ด์ด ํ๋กํ ์ฝ์ ๋ค์ํ ์ ์ก ํ๋กํ ์ฝ์ด ์ฌ์ฉ๋๋ ์์ฆ์ ์ ํฉํฉ๋๋ค. AMQP๋ฅผ ์ด๋ค๋ฉด ๊ทธ ์์ ๋ ๋ค๋ฅธ ํ๋กํ ์ฝ ๋ ์ด์ด๋ฅผ ์ด๋ค๋ ๊ฒ์ ์ข ์ด์ํ๊ฒ ๋๊ปด์ง๋๋ค. ZeroMQ๋ ๋ฉ์ธ์ง๋ฅผ ๊ทธ๋ฅ BLOB(Binary Large Object)์ผ๋ก ๋ณด๊ธฐ์ ๋ฉ์์ง ์ธ์ฝ๋ฉ ๋ฐฉ์์ ์๊ดํ์ง ์์ต๋๋ค. ๋จ์ํ JSON ๋ฉ์ธ์ง๋ค์ ๋ณด๋ด๋์ง, ์๋๋ฉด BSON, Protocol Buffers๋ Thrift ๊ฐ์ ๋ฐ์ด๋๋ฆฌ ๋ฐฉ์ ๋ฉ์์ง๋ค๋ ๊ด์ฐฎ์ต๋๋ค.
ํ์ฅ์ฑ
ZeroMQ ์์ผ๋ค์ ์ ์์ค์ฒ๋ผ ๋ณด์ด์ง๋ง ์ฌ์ค์ ๋ค์ํ ๊ธฐ๋ฅ๋ค์ ์ ๊ณตํฉ๋๋ค.
- ํ๋์ ZeroMQ ์์ผ์ ๋ณต์์ ์ ์ ์ ๊ฐ์ง ์ ์์ผ๋ฉฐ ๊ทธ๋ค ๊ฐ์ ์๋์ผ๋ก ๋ฉ์์ง ๋ถํ ๋ถ์ฐ์ ์ํํฉ๋๋ค.
- ๋ํ ํ๋์ ์์ผ์ผ๋ก ๋ณต์์ ์์ค์์ ๋ฉ์์ง๋ค์ ๋ฐ์๋ค์ด๋ ๊ฒ์ดํธ ์ญํ ์ ํ ์๋ ์์ต๋๋ค.
2.4 Apache Kafka
Apache Kafka๋ LinkedIn์ด ๊ฐ๋ฐํ๊ณ Apache Software Foundation์ ๊ธฐ๋ถํ ์คํ ์์ค ์คํธ๋ฆผ ํ๋ก์ธ์ฑ ์ํํธ์จ์ด ํ๋ซํผ์ ๋๋ค. ๋์ ์ฒ๋ฆฌ๋์ ์๊ตฌํ๋ ์ค์๊ฐ ๋ฐ์ดํฐ ํผ๋ ์ฒ๋ฆฌ๋ ๋๊ธฐ ์๊ฐ์ด ์งง์ ํ๋ซํผ์ ์ ๊ณตํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ฉฐ TCP ๊ธฐ๋ฐ ํ๋กํ ์ฝ์ ์ฌ์ฉํฉ๋๋ค. ํด๋ฌ์คํฐ๋ฅผ ์ค์ฌ์ผ๋ก Producer์ Consumer๊ฐ ๋ฐ์ดํฐ๋ฅผ Pushํ๊ณ Pullํ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ค.
2.4.1 ์ฃผ์ ํน์ฑ๋ค
- ๋์ฉ๋์ ์ค์๊ฐ ๋ก๊ทธ ์ฒ๋ฆฌ์ ํนํ๋์ด ์ค๊ณ๋ ๋ฉ์์ง ์์คํ ์ผ๋ก์จ ๊ธฐ์กด ๋ฒ์ฉ ๋ฉ์์ง ์์คํ ๋๋น TPS๊ฐ ๋งค์ฐ ์ฐ์ํฉ๋๋ค. ๋จ, ํนํ๋ ์์คํ ์ด๊ธฐ ๋๋ฌธ์ ๋ฒ์ฉ ๋ฉ์์ง ์์คํ ์์ ์ ๊ณตํ๋ ๋ค์ํ ๊ธฐ๋ฅ๋ค์ ์ ๊ณต๋์ง ์์ต๋๋ค.
- ๋ถ์ฐ ์์คํ ์ ๊ธฐ๋ณธ์ผ๋ก ์ค๊ณ๋์๊ธฐ ๋๋ฌธ์, ๊ธฐ์กด ๋ฉ์์ง ์์คํ ์ ๋นํด ๋ถ์ฐ ๋ฐ ๋ณต์ ๊ตฌ์ฑ์ ์์ฝ๊ฒ ํ ์ ์์ต๋๋ค.
- AMQP ํ๋กํ ์ฝ์ด๋ JMS API๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋จ์ํ ๋ฉ์์ง ํค๋๋ฅผ ์ง๋ TCP ๊ธฐ๋ฐ์ ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ ํ๋กํ ์ฝ์ ์ํ ์ค๋ฒํค๋๋ฅผ ๊ฐ์์์ผฐ์ต๋๋ค.
- Producer๊ฐ broker์๊ฒ ๋ค์์ ๋ฉ์์ง๋ฅผ ์ ์กํ ๋ ๊ฐ ๋ฉ์์ง๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์ ์กํด์ผํ๋ ๊ธฐ์กด ๋ฉ์์ง ์์คํ ๊ณผ๋ ๋ฌ๋ฆฌ, ๋ค์์ ๋ฉ์์ง๋ฅผ batchํํ๋ก broker์๊ฒ ํ๋ฒ์ ์ ๋ฌํ ์ ์์ด TCP/IP ๋ผ์ด๋ํธ๋ฆฝ ํ์๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
- ๋ฉ์์ง๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ ๊ธฐ์กด ๋ฉ์์ง ์์คํ ๊ณผ๋ ๋ฌ๋ฆฌ ๋ฉ์์ง๋ฅผ ํ์ผ ์์คํ ์ ์ ์ฅํฉ๋๋ค.
- ํ์ผ ์์คํ
์ ๋ฉ์์ง๋ฅผ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๋ณ๋์ ์ค์ ์ ํ์ง ์์๋ ๋ฐ์ดํฐ์ ์์์ฑ(durabiility)์ด ๋ณด์ฅ๋ฉ๋๋ค.
- ๊ธฐ์กด ๋ฉ์์ง ์์คํ ์์๋ ์ฒ๋ฆฌ๋์ง ์๊ณ ๋จ์์๋ ๋ฉ์์ง์ ์๊ฐ ๋ง์ ์๋ก ์์คํ ์ ์ฑ๋ฅ์ด ํฌ๊ฒ ๊ฐ์ํ์์ผ๋, Kafka์์๋ ๋ฉ์์ง๋ฅผ ํ์ผ ์์คํ ์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๋ฉ์์ง๋ฅผ ๋ง์ด ์์๋์ด๋ ์ฑ๋ฅ์ด ํฌ๊ฒ ๊ฐ์ํ์ง ์์ต๋๋ค. ๋ํ ๋ง์ ๋ฉ์์ง๋ฅผ ์์๋ ์ ์๊ธฐ ๋๋ฌธ์, ์ค์๊ฐ ์ฒ๋ฆฌ๋ฟ๋ง ์๋๋ผ ์ฃผ๊ธฐ์ ์ธ batch ์์ ์ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ฅผ ์์๋๋ ์ฉ๋๋ก๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- Consumer์ ์ํด ์ฒ๋ฆฌ๋ ๋ฉ์์ง(acknowledged message)๋ฅผ ๊ณง๋ฐ๋ก ์ญ์ ํ๋ ๊ธฐ์กด ๋ฉ์์ง ์์คํ ๊ณผ๋ ๋ฌ๋ฆฌ ์ฒ๋ฆฌ๋ ๋ฉ์์ง๋ฅผ ์ญ์ ํ์ง ์๊ณ ํ์ผ ์์คํ ์ ๊ทธ๋๋ก ๋์๋ค๊ฐ ์ค์ ๋ ์๋ช ์ด ์ง๋๋ฉด ์ญ์ ํ๋๋ก ์ฒ๋ฆฌํฉ๋๋ค. ์ฒ๋ฆฌ๋ ๋ฉ์์ง๋ฅผ ์ผ์ ๊ธฐ๊ฐ๋์ ์ญ์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฉ์์ง ์ฒ๋ฆฌ ๋์ค ๋ฌธ์ ๊ฐ ๋ฐ์ํ์๊ฑฐ๋ ์ฒ๋ฆฌ ๋ก์ง์ด ๋ณ๊ฒฝ๋์์ ๊ฒฝ์ฐ consumer๊ฐ ๋ฉ์์ง๋ฅผ ์ฒ์๋ถํฐ ๋ค์ ์ฒ๋ฆฌ(rewind)ํ๋๋ก ํ ์ ์์ต๋๋ค.
- ๊ธฐ์กด์ ๋ฉ์์ง ์์คํ
์์๋ broker๊ฐ consumer์๊ฒ ๋ฉ์์ง๋ฅผ pushํด ์ฃผ๋ ๋ฐฉ์์ธ๋ฐ ๋ฐํด, Kafka๋ consumer๊ฐ broker๋ก๋ถํฐ ์ง์ ๋ฉ์์ง๋ฅผ ๊ฐ์ง๊ณ ๊ฐ๋ pull ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค. ๋ฐ๋ผ์ consumer๋ ์์ ์ ์ฒ๋ฆฌ๋ฅ๋ ฅ๋งํผ์ ๋ฉ์์ง๋ง broker๋ก๋ถํฐ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ ์ต์ ์ ์ฑ๋ฅ์ ๋ผ ์ ์์ต๋๋ค.
- ๊ธฐ์กด์ push ๋ฐฉ์์ ๋ฉ์์ง ์์คํ ์์๋ broker๊ฐ ์ง์ ๊ฐ consumer๊ฐ ์ด๋ค ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋์ง ๊ณ์ฐํ๊ณ ์ด๋ค ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌ ์ค์ธ์ง ํธ๋ํนํ์๋ค๋ฉด, Kafka์์๋ consumenr๊ฐ ์ง์ ํ์ํ ๋ฉ์์ง๋ฅผ broker๋ก ๋ถํฐ pullํ๋ฏ๋ก broker์ consumer์ ๋ฉ์์ง ๊ด๋ฆฌ์ ๋ํ ๋ถ๋ด์ด ๊ฒฝ๊ฐ๋์์ต๋๋ค.
- ๋ฉ์์ง๋ฅผ pull ๋ฐฉ์์ผ๋ก ๊ฐ์ ธ์ค๋ฏ๋ก, ๋ฉ์์ง๋ฅผ ์์๋์๋ค๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ batch consumer์ ๊ตฌํ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ํ์ ๊ธฐ๋ฅ์ ๊ธฐ์กด์ JMS์ AMQP ๊ธฐ๋ฐ์ RabbitMQ(๋ฐ์ดํฐ ๊ธฐ๋ฐ ๋ผ์ฐํ , ํ๋ฐ๋ ์ด์ ๊ธฐ๋ฅ ๋ฑ)๋ฑ์ ๋นํด์๋ ๋ง์ด ๋ถ์กฑํ์ง๋ง ๋์ฉ๋ ๋ฉ์ธ์ง๋ฅผ ์ง์ํ ์ ์๋ ๊ฒ์ด ๊ฐ์ฅ ํฐ ํน์ง์ ๋๋ค. ํนํ ๋ถ์ฐํ๊ฒฝ์์ ์ฉ๋ ๋ฟ ์๋๋ผ, ๋ณต์ฌ๋ณธ์ ๋ค๋ฅธ ๋ ธ๋์ ์ ์ฅํจ์ผ๋ก์จ ๋ ธ๋ ์ฅ์ ์ ๋ํ ์ฅ์ ๋์์ฑ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ์ฉ๋์๋ ํ์คํ๊ฒ ๊ฐ์ ์ ์ง๋๊ณ ์์ต๋๋ค.
3. ์คํ ์์ค ๋ฉ์์ง ํ ๋น๊ต
3.1 MQ๋ณ ์ง์ ํ๋กํ ์ฝ
3.2 MQ๋ณ ์ง์ ํด๋ผ์ด์ธํธ(language API)
3.3 MQ๋ณ Producer ์ฑ๋ฅ
- ๋ถ์ ์ ๊ทธ๋ํ๋ ๋ฉ์์ง๋ฅผ ํ ๋ฒ์ 50๊ฐ์ฉ batch๋ก ์ ์กํ ๊ฒฐ๊ณผ์ด๋ฉฐ, ์ฐ๋์ ๊ทธ๋ํ๋ ํ ๋ฒ์ ํ๋์ฉ ์ ์กํ ๊ฒฐ๊ณผ์ ๋๋ค.
3.4 MQ๋ณ Consumer ์ฑ๋ฅ
- Kafka์ ๊ฒฝ์ฐ 10๋ง TPS ์ด์์ ์ฑ๋ฅ์ RabbitMQ๋ 2๋ง TPS ์ ๋์ ์ฑ๋ฅ์ ๋ด๋ ๊ฒ์ผ๋ก ๋์์๋๋ฐ, ์ฌ๊ธฐ์ ์๊ฐํด๋ณผ ๋ฌธ์ ๊ฐ ํ๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ ์๋ฃจ์ ์ด๋ผ๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ์๋ต์๊ฐ์๋ ๊ทธ๋ ๊ฒ ๋ฏผ๊ฐํ์ง ์๋ ์ ์ ์ ์ ์์ต๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ์ผ๋ฐ์ ์ธ ์น ์์คํ ์ ์ฑ๋ฅ์ด 1500~2000 TPS (์ํฐํ๋ผ์ด์ฆ ์์คํ ์ ๊ฒฝ์ฐ) ๋ด์ธ์ธ ๊ฒ์ด ์ผ๋ฐ์ ์ด๊ธฐ ๋๋ฌธ์, RabbitMQ์ 2๋ง TPS์ ์ฑ๋ฅ์ ์ถฉ๋ถํ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
3.5 MQ๋ณ ๊ด์ฌ๋ ๋ณํ
๋ง๋ฌด๋ฆฌ
- ๊ฒฐ๊ตญ์ ์๋ฒ๊ฐ ์ฌ์ฉ์์๊ฒ ์ผ๋ง๋ ๋น ๋ฅด๊ณ ์์ ์ ์ผ๋ก ์ ๋ณด๋ฅผ ์ ๋ฌํ ์ ์๋ ์ง์ ์ด์ ์ ๋ง์ถ ๊ธฐ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
- ๋ชจ๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ฉ์์ง ํ๊ฐ ํ์ํ ๊ฒ์ ์๋์ง๋ง, ์๋ฒ์ ๋ท๋จ์์ ์คํ๋๋ ์ผ๋ถ ์์ ์ ๋ฉ์์ง ํ์ ๋งก๊น์ผ๋ก์จ ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๊ฒ์ ๋ํด ์๊ฐํด๋ณด๋ ๊ฒ๋ ์ข์ ๊ฒ์ ๋๋ค.
- ๋ธ๋ก๊ทธ ์ ์๋ ๋์ฉ๋ CEP ์์ง์์๋ Kafka๋ฅผ ์ฌ์ฉํด์ ์ฒ๋ฆฌํ๊ณ ๊ทธ์ด์ธ์ ์์ํ ๋ฉ์์งํ๋ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ActiveMQ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ๊ณ ์์ต๋๋ค.
- Spring์์๋ Srping AMQP๊ฐ ์๋ธ ํ๋ก์ ํธ๋ก ์กด์ฌํ๋ฉฐ ๊ธฐ๋ณธ ์์ ๋ RabbitMQ๋ก ๋์ด ์์ต๋๋ค. ์ต๊ทผ์ AMQP๋ ์๋์ง๋ง ๋น ๋ฅธ ์๋๋ฅผ ๋ด์ธ์ฐ๋ฉฐ ์์ฒญ๋ ์ธ๊ธฐ๋ชฐ์ด๋ฅผ ํ๋ Kafka๊ฐ ์๋๋ฐ Spring ์๋ธ ํ๋ก์ ํธ Spring Kafka๋ ์์ด์ ๋น ๋ฅธ ๋ฉ์์ง ํ ์ฌ์ฉ์์ ํ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
- Kafka์ ์ธ๊ธฐ๋ชฐ์ด ์ค ํ๋๋ ๋ฉ์์ง ์ ์ก์์ ํค๋์ ํฌ๊ธฐ๊ฐ ์์ ์ค๋ฒํค๋๋ฅผ ๊ฐ์์ํค๋ฉฐ ๊ธฐ์กด ๋ฉ์์ง ์์คํ ์์๋ broker๊ฐ consumer์๊ฒ ๋ฉ์์ง๋ฅผ pushํด์ฃผ๋ ๋ฐฉ์์ธ๋ฐ ๋ฐํด, Kafka๋ consumer๊ฐ broker๋ก๋ถํฐ ์ง์ ๋ฉ์์ง๋ฅผ ๊ฐ์ง๊ณ ๊ฐ๋ pull ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค. ๋ฐ๋ผ์ consumer๋ ์์ ์ ์ฒ๋ฆฌ๋ฅ๋ ฅ๋งํผ์ ๋ฉ์์ง๋ง broker๋ก ๋ถํฐ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ ์ต์ ์ ์ฑ๋ฅ์ ๋ผ ์ ์์ต๋๋ค.
์ฐธ๊ณ
- [oracle] https://docs.oracle.com/cd/E19148-01/820-0532/6nc919fag/index.html
- [microsoft] https://docs.microsoft.com/ko-kr/azure/service-bus-messaging/service-bus-amqp-overview
- [predic8] https://www.predic8.com/activemq-hornetq-rabbitmq-apollo-qpid-comparison.htm
- [spring] AMQP: http://projects.spring.io/spring-amqp/
- [dzone] JMS vs RabbitMQ: https://dzone.com/articles/jms-vs-rabbitmq
- [amazon] Massage Queue: https://aws.amazon.com/message-queue/
- [github.io] ์ต์ ๋ฉ์์ง ํ(Messgae Queue) MQ ๊ธฐ์ : https://kji6252.github.io/2015/12/18/message-quere/
- [github.io] Message Queue: https://kji6252.github.io/2015/12/18/message-quere/