๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋ชฉ๋ก์ด ์—†์Šต๋‹ˆ๋‹ค.

๋ฉ”์‹œ์ง€ ํ(Message Queue / MQ)

๐Ÿ”‘ Basic Concept
    ๋ฐ˜์‘ํ˜•

    ๋ฉ”์‹œ์ง€ ํ(Message Queue ์ดํ•˜ MQ)๋ž€ ํ”„๋กœ์„ธ์Šค(ํ”„๋กœ๊ทธ๋žจ) ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ†ต์‹  ๋ฐฉ๋ฒ• ์ค‘์— ํ•˜๋‚˜๋กœ ๋” ํฐ ๊ฐœ๋…์œผ๋กœ๋Š” MOM(Message Oriented Middleware : ๋ฉ”์‹œ์ง€ ์ง€ํ–ฅ ๋ฏธ๋“ค์›จ์–ด ์ดํ•˜ MOM)๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. MOM์ด๋ž€ ๋น„๋™๊ธฐ ๋ฉ”์‹œ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹ ์„ ์˜๋ฏธํ•˜๋Š”๋ฐ MOM์„ ๊ตฌํ˜„ํ•œ ์‹œ์Šคํ…œ์„ MQ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. MQ๋Š” ์ž‘์—…์„ ๋Šฆ์ถœ ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

     

    ๋ฉ”์‹œ์ง€๋ฅผ ๊ตํ™˜ํ•  ๋•Œ AMQP(Advanced Message Queuing Protocol ์ดํ•˜ AMQP)์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. AMQP๋Š” ISO ์‘์šฉ ๊ณ„์ธต์˜ MOM ํ‘œ์ค€์œผ๋กœ JMS(Java Message Service)์™€ ๋น„๊ต๋˜๋Š”๋ฐ JMS๋Š” MOM๋ฅผ ์ž๋ฐ”์—์„œ ์ง€์›ํ•˜๋Š” ํ‘œ์ค€ API์ž…๋‹ˆ๋‹ค. JMS๋Š” ๋‹ค๋ฅธ Java Application ๊ฐ„์— ํ†ต์‹ ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋‹ค๋ฅธ MOM(AMQP, SMTP ๋“ฑ)๋ผ๋ฆฌ๋Š” ํ†ต์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ์— ๋ฐ˜ํ•ด AMQP๋Š” protocol๋งŒ ์ผ์น˜ํ•œ๋‹ค๋ฉด ๋‹ค๋ฅธ AMQP๋ฅผ ์‚ฌ์šฉํ•œ Application๊ณผ๋„ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. AMQP๋Š” wire-protocol์„ ์ œ๊ณตํ•˜๋Š”๋ฐ ์ด๋Š” octet stream์„ ์ด์šฉํ•ด์„œ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ ์‚ฌ์ด์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š” ํฌ๋งท์ž…๋‹ˆ๋‹ค.

     

     

    ๋ฉ”์‹œ์ง€ ํ์˜ ์žฅ์ 

    • ๋น„๋™๊ธฐ : Queue์— ๋„ฃ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์ค‘์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋น„๋™์กฐ : Application๊ณผ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํƒ„๋ ฅ์„ฑ : ์ผ๋ถ€๊ฐ€ ์‹คํŒจ ์‹œ ์ „์ฒด๋Š” ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค
    • ๊ณผ์ž‰ : ์‹คํŒจํ•  ๊ฒฝ์šฐ ์žฌ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค
    • ํ™•์žฅ์„ฑ : ๋‹ค์ˆ˜์˜ ํ”„๋กœ์„ธ์Šค๋“ค์ด ํ์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

     

    ๋ฉ”์‹œ์ง€ ํ ์‚ฌ์šฉ์ฒ˜

    ๋ฉ”์‹œ์ง€ ํ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹ค์–‘ํ•œ ๊ณณ์— ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

    • ๋‹ค๋ฅธ ๊ณณ์˜ API๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹ 
    • ๋‹ค์–‘ํ•œ Application์—์„œ ๋น„๋™๊ธฐ ํ†ต์‹  ๊ฐ€๋Šฅ
    • ์ด๋ฉ”์ผ ๋ฐœ์†ก ๋ฐ ๋ฌธ์„œ ์—…๋กœ๋“œ ๊ฐ€๋Šฅ
    • ๋งŽ์€ ์–‘์˜ ํ”„๋กœ์„ธ์Šค ์ฒ˜๋ฆฌ

    ๋ฉ”์‹œ์ง€ ํ ์ข…๋ฅ˜

    ๋Œ€ํ‘œ์ ์ธ ๋ฉ”์‹œ์ง€ ํ ์ข…๋ฅ˜๋Š” 3๊ฐ€์ง€ ์ž…๋‹ˆ๋‹ค.

    • Kafka
    • RabbitMQ
    • ActiveMQ

     

    ๊ณตํ†ต์ ์œผ๋กœ 3๊ฐ€์ง€ ๋ชจ๋‘ ๋น„๋™๊ธฐ ํ†ต์‹ ์„ ์ œ๊ณตํ•˜๊ณ  ๋ณด๋‚ธ ์‚ฌ๋žŒ๊ณผ ๋ฐ›๋Š” ์‚ฌ๋žŒ์„ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—…๋ฌด์— ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ๋ชฉ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

     

    ์„ฑ๊ฒฉ์ƒ Kafka(Apache)์™€ RabbitMQ, ActiveMQ(Apache)๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š”๋ฐ Kafka๋Š” ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๋งŽ์€ ๋ถ„์‚ฐ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ์— ์ ํ•ฉํ•˜๊ณ  RabbitMQ, ActiveMQ๋Š” ์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์‹ ๋ขฐ์„ฑ์€ Kafka์— ๋น„ํ•ด ๋†’์€ ๊ฒƒ์ด์ง€ Kafka๊ฐ€ ์‹ ๋ขฐ์„ฑ์ด ์—†๋‹ค๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

     

    RabbitMQ

    RabbitMQ๋Š” AMQT ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•ด ๋†“์€ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ์จ ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค.

     

    ์žฅ์ 

    • ์‹ ๋ขฐ์„ฑ, ์•ˆ์ •์„ฑ
    • ์œ ์—ฐํ•œ ๋ผ์šฐํŒ… (Message Queue๊ฐ€ ๋„์ฐฉํ•˜๊ธฐ ์ „์— ๋ผ์šฐํŒ… ๋˜๋ฉฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ†ตํ•ด ๋” ๋ณต์žกํ•œ ๋ผ์šฐํŒ…๋„ ๊ฐ€๋Šฅ)
    • ํด๋Ÿฌ์Šคํ„ฐ๋ง (๋กœ์ปฌ๋„คํŠธ์›Œํฌ์— ์žˆ๋Š” ์—ฌ๋Ÿฌ RabbitMQ ์„œ๋ฒ„๋ฅผ ๋…ผ๋ฆฌ์ ์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ๋งํ•  ์ˆ˜ ์žˆ๊ณ  ๋…ผ๋ฆฌ์ ์ธ ๋ธŒ๋กœ์ปค๋„ ๊ฐ€๋Šฅ)
    • ๊ด€๋ฆฌ UI์˜ ํŽธ๋ฆฌ์„ฑ (๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ํŽ˜์ด์ง€๊ฐ€ ์ œ๊ณต๋จ)
    • ๊ฑฐ์˜ ๋ชจ๋“  ์–ธ์–ด ๋ฐ ์šด์˜์ฒด์ œ๋ฅผ ์ง€์›
    • ์˜คํ”ˆ์†Œ์Šค๋กœ ์ƒ์—…์  ์ง€์› ๊ฐ€๋Šฅ

     

    Kafka

    Kafka๋Š” ํ™•์žฅ์„ฑ๊ณผ ๊ณ ์„ฑ๋Šฅ ๋ฐ ๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋‚ด์„ธ์šด ์ œํ’ˆ์ด๋ผ๊ณ  ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํŠนํ™”๋œ ์‹œ์Šคํ…œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ”์šฉ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๋“ค์€ ์ œ๊ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์„ ๊ธฐ๋ณธ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ์— ๋น„ํ•ด ๋ถ„์‚ฐ ๋ฐ ๋ณต์ œ ๊ตฌ์„ฑ์„ ์†์‰ฝ๊ฒŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

     

    ์žฅ์ 

    • ๋Œ€์šฉ๋Ÿ‰ ์‹ค์‹œ๊ฐ„ ๋กœ๊ทธ ์ฒ˜๋ฆฌ์— ํŠนํ™”๋˜์–ด ์žˆ๋‹ค
    • AMQP ํ”„๋กœํ† ์ฝœ์ด๋‚˜ JSM API๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ˆœํ•œ ๋ฉ”์‹œ์ง€ ํ—ค๋”๋ฅผ ์ง€๋‹Œ TCP ๊ธฐ๋ฐ˜ ํ”„๋กœํ† ์ฝœ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋น„๊ต์  ์ž‘๋‹ค.
    • ๋…ธ๋“œ ์žฅ์• ์— ๋Œ€ํ•œ ๋Œ€์‘์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค
    • ํ”„๋กœ๋“€์„œ๋Š” ๊ฐ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐฐ์น˜๋กœ ๋ธŒ๋กœ์ปค์—๊ฒŒ ์ „๋‹ฌํ•˜์—ฌ TCP/IP ๋ผ์šด๋“œ ํŠธ๋ฆฝ์„ ์ค„์˜€๋‹ค
    • ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์ €์žฅํ•˜์—ฌ ๋ณ„๋„์˜ ์„ค์ •์„ ํ•˜์ง€ ์•Š์•„๋„ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ์˜ค๋ฅ˜ ์ง€์ ๋ถ€ํ„ฐ ๋ณต๊ตฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค (๊ธฐ์กด ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ์€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ)
    • ๋ฉ”์‹œ์ง€๋ฅผ ํŒŒ์ผ์‹œ์Šคํ…œ์— ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์‹œ์ง€๊ฐ€ ๋งŽ์ด ์Œ“์—ฌ๋„ ๊ธฐ์กด ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ์— ๋น„ํ•ด ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ๊ฐ์†Œํ•˜์ง€ ์•Š๋Š”๋‹ค
    • window ๋‹จ์œ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  ๊บผ๋‚ผ ์ˆ˜ ์žˆ๋‹ค

     

    ActiveMQ

    ActiveMQ๋Š” ์ž๋ฐ”๋กœ ๋งŒ๋“  ์˜คํ”ˆ์†Œ์Šค ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค์ž…๋‹ˆ๋‹ค. JMS 1.1์„ ํ†ตํ•ด ์ž๋ฐ” ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

     

    ์žฅ์ 

    • ๋‹ค์–‘ํ•œ ์–ธ์–ด์™€ ํ”„๋กœํ† ์ฝœ ์ง€์› (Java, C, C++, C#, Ruby, Perl, Python, PHPํด๋ผ์ด์–ธํŠธ ์ง€์›)
    • OpenWire๋ฅผ ํ†ตํ•ด ๊ณ ์„ฑ๋Šฅ์˜ Java, C, C++, C# ํด๋ผ์ด์–ธํŠธ ์ง€์›
    • Stomp๋ฅผ ํ†ตํ•ด C, Ruby, Perl, Python, PHP ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋‹ค๋ฅธ ์ธ๊ธฐ์žˆ๋Š” ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ActiveMQ์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
    • Message Groups, Virtual Destinations, Wildcards์™€ Composite Destination๋ฅผ ์ง€์›
    • Spring ์ง€์›์œผ๋กœ ActiveMQ๋Š” Spring Application์— ๋งค์šฐ ์‰ฝ๊ฒŒ ์ž„๋ฒ ๋”ฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Spring์˜ XML ์„ค์ • ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ์˜ํ•ด ์‰ฝ๊ฒŒ ์„ค์ • ๊ฐ€๋Šฅ
    • Geronimo, JBoss 4, GlassFish, WebLogic๊ณผ ๊ฐ™์€ ์ธ๊ธฐ์žˆ๋Š” J2EE ์„œ๋ฒ„๋“ค๊ณผ ํ•จ๊ป˜ ํ…Œ์ŠคํŠธ๋จ
    • ๊ณ ์„ฑ๋Šฅ์˜ ์ €๋„์„ ์‚ฌ์šฉํ•  ๋•Œ์— JDBC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งค์šฐ ๋น ๋ฅธ Persistence๋ฅผ ์ง€์›
    • REST API๋ฅผ ํ†ตํ•ด ์›น๊ธฐ๋ฐ˜ ๋ฉ”์‹œ์ง• API๋ฅผ ์ง€์›
    • ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฉ”์‹œ์ง• ๋„๊ตฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋„๋ก, Ajax๋ฅผ ํ†ตํ•ด ์ˆœ์ˆ˜ํ•œ DHTML์„ ์‚ฌ์šฉํ•œ ์›น ์ŠคํŠธ๋ฆฌ๋ฐ ์ง€์›

    ์ด๋ ‡๊ฒŒ ํ•ด์„œ ๋ฉ”์‹œ์ง€ ํ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋…๊ณผ ๋Œ€ํ‘œ์ ์œผ๋กœ ๋ช‡ ๊ฐ€์ง€ ์ข…๋ฅ˜๋ฅผ ์ •๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

     


    * ๋ผ์šด๋“œ ํŠธ๋ฆฝ(Round-trip) : ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์™•๋ณต ๊ณผ์ •์„ ์˜๋ฏธํ•œ๋‹ค. ๋ผ์šด๋“œ ํŠธ๋ฆฝ์ด ๋นˆ๋ฒˆํ•˜๋‹ค๋Š” ๊ฒƒ์€ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์— ์š”์ฒญ๊ณผ ์‘๋‹ต์ด ๋นˆ๋ฒˆํ•˜๋‹ค๋Š” ์ด์•ผ๊ธฐ์ด๊ณ , ๊ฒฐ๊ตญ ์„œ๋ฒ„ ์ธก์˜ ์„ฑ๋Šฅ์— ๊ทธ๋ฆฌ ์ข‹์ง€ ์•Š์€ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค. ๋”ฐ๋ผ์„œ ๋ผ์šด๋“œ ํŠธ๋ฆฝ์ด ์ ๊ฒŒ ์ผ์–ด๋‚˜๋„๋ก ์ œ์ž‘๋˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.

     

    ์ด ๊ธ€์€ ์•„๋ž˜ ์‚ฌ์ดํŠธ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

    https://12bme.tistory.com/176

    http://zzong.net/post/3

    https://m.blog.naver.com/PostView.nhn?blogId=myongsg&logNo=20176300457&targetKeyword=&targetRecommendationCode=1

    ๋ฐ˜์‘ํ˜•