๋ธ๋ก๊ทธ ์ฎ๊ฒผ์ต๋๋ค! ๐ก integer.blog
AmazonMQ(ActiveMQ)์ Virtual Destinations๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์์ง ์ค๋ณต์ฒ๋ฆฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒฝํ์ ๋ํ ๊ธ์ด๋ค.
ํ์ฌ์ ์๋น์ค ๊ฐ ์ปจํ
์ธ ๋๊ธฐํ๋ฅผ ์ํด ์ฌ์ฉํ๋ AWS SQS
๋ฅผ AmazonMQ
๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๋ฉด์,
AmazonMQ(ActiveMQ)์ Topic์ ์ด์ฉํ Pub-Sub ๋ฐฉ์์ ๋ฉ์์ง ๋ธ๋ก์ปค๋ฅผ ๊ตฌ์ฑํ๋ค.
ํ์ง๋ง ๋ชจ๋ Subscriber์ ๊ฐ์ ๋ฉ์์ง๊ฐ ์ ๋ฌ๋๊ธฐ ๋๋ฌธ์ ๋ฉ์์ง ์ค๋ณต์ฒ๋ฆฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋๋ฐ,
์ด ๋ฌธ์ ๋ฅผ ActiveMQ์ Virtual Topics
๋ฅผ ํ์ฉํ์ฌ ํด๊ฒฐํ ๊ณผ์ ์ ์ ๋ฆฌํ๋ค.
๋ชฉ์ฐจ
- Queue ๋ฐฉ์๊ณผ Topic ๋ฐฉ์ ๊ฐ๋ ์ดํด
- ๊ธฐ์กด ์ํฉ
- ๋ณ๊ฒฝ๋ ์ํฉ
- AmazonMQ(ActiveMQ) ๋ง์ด๊ทธ๋ ์ด์
- ๋ฌธ์ ๋ฐ์
- ํด๊ฒฐ ๋ฐฉ์ 1 - Batch ์๋ฒ๋ฅผ 1๋๋ง ์ฌ์ฉ
- ํด๊ฒฐ ๋ฐฉ์ 2 - UUID ์ฌ์ฉ
- ํด๊ฒฐ ๋ฐฉ์ 3 - Virtual Destinations ํ์ฉ
- Virtual Topics ๊ฐ๋ ์ดํด
- Virtual Topics ์ ์ฉ ๊ฒฐ๊ณผ
- Virtual Topics ์ฌ์ฉ ๋ฐฉ๋ฒ (with Spring Boot)
- ๋งบ์ผ๋ฉฐ
1. Queue ๋ฐฉ์๊ณผ Topic ๋ฐฉ์ ๊ฐ๋ ์ดํด
์์ํ๊ธฐ์ ์์, ์์ผ๋ก ๊ณ์ ์ธ๊ธ๋ Queue ๋ฐฉ์๊ณผ Topic ๋ฐฉ์ ๋ฉ์์ง ๋ธ๋กํน์ ๋ํด ์์๋ณธ๋ค.
1-1. Queue
ActiveMQ์ Queue๋ Producer๊ฐ ๋ณด๋ธ ๋ฉ์์ง๋ฅผ 1๊ฐ์ Consumer๊ฐ ๋ฐ๋๋ค.
๋ฉ์์ง๋ Queue์ ์์ด๊ณ , Consumer๋ Queue์์ ํ๋์ฉ ์๋นํ๋ค.
1:1 ๋ฉ์์ง ๋ธ๋กํน
1-2. Topic
ActiveMQ์ Topic์ Producer(Publisher)๊ฐ ๋ฉ์์ง๋ฅผ ๋ฐํ(publish)ํ๊ณ ,
N๊ฐ์ Consumer(Subscriber)๊ฐ ๋์ผํ ๋ฉ์์ง๋ฅผ ๊ตฌ๋
(subscribe) ํ๋ค.
1:N ๋ฉ์์ง ๋ธ๋กํน (Pub-Sub)
Topic ๋ฐฉ์์ ๋ชจ๋ Consumer๊ฐ ๋์ผํ ๋ฉ์์ง๋ฅผ ๋ฐ๋๋ค.
2. ๊ธฐ์กด ์ํฉ
์ค์ธํฐ๋ท์ ์ฌ๋ฌ ์๋น์ค ์ค ๋ด์ค์ค, ํ๋ธ์ค, TV์ค๊ณผ ๊ด๋ จ๋ ์ํฉ์ด๋ค.
๋ด์ค์ค์ ๊ฐ ์ธ๋ก ์ฌ๋ก๋ถํฐ ๋ด์ค๊ธฐ์ฌ๋ฅผ ์ก๊ณ ๋ฐ์ ์์ฒด์ ์ผ๋ก ํ์ฑํ์ฌ ์ฌ์ฉํ๋๋ฐ,
ํ๋ธ์ค์์๋ ํ์ฑ๋ ๋ด์ค๊ธฐ์ฌ ์ค ์ผ๋ถ๊ฐ ํ์ํ๋ค.
์ฆ, ๋ด์ค์ค - ํ๋ธ์ค ๊ฐ ์ปจํ
์ธ ๋๊ธฐํ๊ฐ ํ์ํ๊ณ ,
์๋์ ๊ฐ์ด AWS SQS๋ฅผ ํ์ฉํด์ ๋ด์ค์ค-ํ๋ธ์ค ๊ฐ ์ปจํ
์ธ ๋๊ธฐํ๋ฅผ ์๋ํํ ์ํ์๋ค.
์์ ๋์์์ AWS SQS๋ฅผ ์ฌ์ฉํ ๋ถ๋ถ๋ง ๊ฐ๋จํ ํํํ๋ฉด ์๋์ ๊ฐ๋ค.
3. ๋ณ๊ฒฝ๋ ์ํฉ
๊ทธ๋ฐ๋ฐ TV์ค์์๋ ๋ด์ค์ค์ ์ปจํ
์ธ ๊ฐ ํ์ํด์ก๊ณ ,
์ด์ ๋ด์ค์ค์ ์๋์ ๊ฐ์ด ํ๋ธ์ค๊ณผ TV์ค ๋ชจ๋์๊ฒ ํ์ฑ๋ ๋ด์ค ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํด์ผ ํ๋ค.
4. AmazonMQ(ActiveMQ) ๋ง์ด๊ทธ๋ ์ด์
๋ฌผ๋ก ์์ ๊ทธ๋ฆผ์ฒ๋ผ AWS SQS ํ๋ฅผ ํ๋ ๋ ์์ฑํด์ ์ด์ํ ์๋ ์์ง๋ง,
๋ด์ค ๋ฐ์ดํฐ๋ฅผ ํ์๋ก ํ๋ ์๋น์ค๊ฐ ์ถ๊ฐ๋ ๋ ๋ง๋ค Queue๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํด์ผ ํ๋ ๋ฌธ์ ๊ฐ ์์๋ค.
๊ทธ๋์ ๋ด์ค์ค์์๋ ๋ฉ์์ง๋ฅผ ํ ๋ฒ๋ง ๋ฐํํ๊ณ ,
N๊ฐ์ ์๋น์ค์์ ๊ฐ์ ๋ฉ์์ง๋ฅผ ๋ฐ์๊ฐ ์ ์๋ Pub-Sub ๋ฐฉ์์ ๊ตฌ์ฑ์ด ํ์ํ๋ค.
๊ทธ๊ฒ์ด ์์ ์ค๋ช
ํ Topic ๋ฐฉ์ ๋ฉ์์ง ๋ธ๋กํน์ด๋ฉฐ,
Topic ๋ฐฉ์์ ์ฌ์ฉํ๊ธฐ ์ํด AmazonMQ(ActiveMQ)๋ก ๋ง์ด๊ทธ๋ ์ด์
์ ์งํํ๋ค.
AmazonMQ๋ง Pub-Sub ๋ฐฉ์์ ์ง์ํ๋ ๊ฒ์ ์๋๋ค!
๋ง์ ๋ฉ์์ง ๋ธ๋ก์ปค๊ฐ Pub-Sub ๋ฐฉ์์ ์ง์ํ์ง๋ง, ํ ๋ด๋ถ ํ์๋ฅผ ํตํด AmazonMQ๊ฐ ์ ํ๋์๋ค.
*ํฌํธ๊ฐ๋ฐํ์์ AmazonMQ๋ฅผ ์ ํํ ์ด์
- AWS SQS์ SNS๋ฅผ ํผ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง, ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ณต์ก๋๊ฐ ์ฆ๊ฐํ๋ ๋ฌธ์
- ๋์ฉ๋ ๋ฉ์์ง ์ฒ๋ฆฌ๊ฐ ์๋ ์ปจํ ์ธ ์ ๋ฐ์ดํธ๋ฅผ ์ํ ๋ฉ์์ง์ด๊ธฐ ๋๋ฌธ์ AmazonMQ๋ก ์ถฉ๋ถ
- ์๋ฒ ์ด์คํ ๋ฐ ๊ด๋ฆฌ๊ฐ ํ์์๊ธฐ ๋๋ฌธ์, ์ ์ฐจ์ ์ผ๋ก Severless๋ฅผ ์งํฅํ๋ ํ์ ๋ฐฉํฅ์ฑ์ ๋ถํฉํจ
- AmazonMQ์ ๊ฐ๋จํ ์ค์ ์ผ๋ก ์ธํด, ์ต๋ํ ๋น์ฆ๋์ค ๋ก์ง์ ์ง์คํ ์ ์์์
- IDC ํ๊ฒฝ์์ RabbitMQ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ผ๋, ํ์์ ์ ์ฉ์ค์ธ ํด๋ผ์ฐ๋ ํ์คํ์ ๋ง์ถ์ด AmazonMQ๋ฅผ ์ ํ
5. ๋ฌธ์ ๋ฐ์
AmazonMQ์ Topic ๋ฐฉ์์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ ํ,
ํ๋ธ์ค์ Batch ์๋ฒ๋ฅผ ๋๋ ค๋ณด๋, ๊ฐ์ ์ปจํ
์ธ ๊ฐ 2๋ฒ์ฉ ์ฒ๋ฆฌ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์
ํ๋ค.
ActiveMQ์ Topic ๋ฐฉ์์ ๋ชจ๋ Subscriber๊ฐ ๊ฐ์ ๋ฉ์์ง๋ฅผ ๋ฐ๊ธฐ ๋๋ฌธ์,
2๋๋ก ๊ตฌ์ฑ๋ ํ๋ธ์ค์ Batch ์๋ฒ๊ฐ ๊ฐ๊ฐ ๋์ผํ ๋ฉ์์ง๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌํ ๊ฒ
์ด๋ค.
๊ธฐ์กด์ AWS SQS๋ฅผ ์ฌ์ฉํ ๋๋ ์ค๋ณต์ฒ๋ฆฌ ๋ฌธ์ ๊ฐ ์์๋ค.
SQS๋ Queue ๋ฐฉ์์ด๋ผ์ 2๋์ Batch ์๋ฒ๊ฐ 1๊ฐ์ Queue๋ก๋ถํฐ ๋ฉ์์ง๋ฅผ ์๋นํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฌผ๋ก ๋ฉ์์ง ์ค๋ณต์ฒ๋ฆฌ๊ฐ ์ค์ ์๋น์ค์๋ ์ํฅ์ ๋ผ์น์ง ์์์ง๋ง,
2๋์ ์๋ฒ๊ฐ ๋์ผํ ๋ฉ์์ง๋ฅผ ๊ฐ๊ฐ ์ฒ๋ฆฌํ๋ ๋ฆฌ์์ค ๋ญ๋น๋ฅผ ๋ฐฉ๊ดํ๋ ๊ฒ์ ์ ์ ๊ฑด๊ฐ์ ํด๋ก์ ๋ค.
๊ทธ๋์ ์ด๋ป๊ฒ๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ถ์๋ค.
6. ํด๊ฒฐ ๋ฐฉ์ 1 - Batch ์๋ฒ๋ฅผ 1๋๋ง ์ฌ์ฉ
์ฃผ๋์ด ๊ฐ๋ฐ์์ ์ข์ ์์ผ๋ก๋ ๋ค์ํ ํด๊ฒฐ๋ฐฉ๋ฒ์ด ๋ ์ค๋ฅด์ง ์์๋ค.
๊ฐ์ฅ ๋จผ์ ๋ ์ค๋ฅธ ๋ฐฉ๋ฒ์ TV์ค ์ฒ๋ผ 1๋์ Batch ์๋ฒ๋ง ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
์ด ๊ฒฝ์ฐ, ๋ฉ์์ง ์ค๋ณต์ฒ๋ฆฌ ๋ฌธ์ ๋ ๋น ๋ฅด๊ณ ๋ช
ํํ๊ฒ ํด๊ฒฐ๋๋ค.
ํ์ง๋ง ์๋ฒ 2๋๊ฐ ์์
์ ๋ถ์ฐ์ฒ๋ฆฌํด์ค๋ ํ๊ฒฝ์์,
๊ธ์์ค๋ฝ๊ฒ ํ๋์ ์๋ฒ์ ํธ๋ํฝ์ ๋ชฐ๋นต(?)ํ๋ ๊ฒ์ ์ํํ๋ค๊ณ ์๊ฐํ๋ค.
๊ฒ๋ค๊ฐ ํ๋ธ์ค์ Batch ์๋ฒ๋ค์ ๋ด์ค์ปจํ
์ธ ๋๊ธฐํ ์ด์ธ์๋ ๊ฐ์ข
Batch ์์
์ด ๋์๊ฐ๋ ์๋ฒ๋ค.
๊ทธ๋ฐ๋ฐ ํ๋ธ์ค์ ๋ด๋นํ์ง ์ผ๋ง ์๋ ์ํฉ์ด์๊ธฐ ๋๋ฌธ์, ์๋ฒ ์ค์ผ์ผ ์ถ์(Scale in)๊ฐ ๊ฐ์ ธ์ฌ ๋ถ์์ฉ์ ์์ํ๊ธฐ ํ๋ค์๋ค.
๊ทธ๋์ ์ด ๋ฐฉ๋ฒ์ ๋ ์ด์ ๊ณ ๋ คํ์ง ์์๋ค.
7. ํด๊ฒฐ ๋ฐฉ์ 2 - UUID ์ฌ์ฉ
๋ง์ฝ ํ๋ธ์ค์ Batch ์๋ฒ๋ค์ด ๋์ผํ ๋ฉ์์ง๋ฅผ ๋ฐ์ ์ ๋ฐ์ ์๋ค๋ฉด,
๋ด์ค์ค์์ ๋ฉ์์ง(๋ด์ค ๋ฐ์ดํฐ)์ UUID๋ฅผ ํฌํจ์์ผ์ Publish ํด์ฃผ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๋ค.
์ด ๊ฒฝ์ฐ Batch ์๋ฒ๋ค์ ๋์ผํ ๋ฉ์์ง๋ฅผ ๋ฐ๋,
๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๋ ์์ ์ UUID๋ก ๊ฒ์ฆํด์ ์ค๋ณต์ฒ๋ฆฌ๋ฅผ ๋ฐฉ์งํ ์ ์๋ค๊ณ ์๊ฐํ๋ค.
ํ์ง๋ง UUID๋ฅผ ์์ฑํ๋ ์๊ฐ, ๊ด๋ จ ๋ชจ๋ ์๋น์ค์ ์ํฅ์ ๋ฏธ์น๋ ๊ด๋ฆฌ ํฌ์ธํธ๊ฐ ํ๋ ๋์ด๋๋ค.
(Publisher์ Subscriber ์์ชฝ DB์ UUID์ปฌ๋ผ ์ถ๊ฐ, ๊ด๋ จ ํด๋์ค์ UUID ๊ฒ์ฆ ๋ก์ง ์ถ๊ฐ…๋ฑ๋ฑ)
๋ํ UUID๋ฅผ ์ฌ์ฉํด์ ์ค๋ณต์ฒ๋ฆฌ๋ฅผ ๋ฐฉ์ดํ๋ ๋ก์ง์ DB์ ๊ทผ์ ๋น์ฝ์ ์ผ๋ก ์ฆ๊ฐ์ํค๊ธฐ ๋๋ฌธ์,
๊ฒฐ๊ตญ ์๋ฒ๋ฅผ 1๋๋ง ์ฌ์ฉํ๋๊ฒ ๋ณด๋ค๋ ๋นํจ์จ์ ์ผ ์ ์๋ค.
๊ทธ๋ ๋ค๊ณ DB์ ๊ทผ์ ์ค์ด๊ณ ์ Redis๋ก UUID๋ฅผ ์บ์ฑํ๋ ๊ฒ์, ๋ ๋ค๋ฅธ ๊ด๋ฆฌ ํฌ์ธํธ๋ฅผ ๋๋ฆฌ๋ ์ผ์ด์๋ค.
๊ฒฐ๊ตญ, ์ด ๋ฐฉ๋ฒ๋ ์ ์ ํ ํด๊ฒฐ์ฑ ์ ์๋์๋ค.
8. ํด๊ฒฐ ๋ฐฉ์ 3 - Virtual Destinations ํ์ฉ
ActiveMQ ์ธ์ ์ผ๋ก๋ง ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ๋ค๊ฐ,
ActiveMQ ์์ฒด์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๊ธฐ๋ฅ์ด ์์ ์ ์๋ค๋ ์๊ฐ์ ActiveMQ ๊ณต์ ๋ฌธ์๋ฅผ ๋ค์ ๊ฑฐ๋ ธ๋ค.
๊ทธ ๊ฒฐ๊ณผ, Destination Features ์นดํ
๊ณ ๋ฆฌ์์ Virtual Destinations๋ฅผ ์ฐพ์๋ค.
๋ด์ฉ์ ์ฒ์ฒํ ์ฝ์ด๋ณด๋, ๋ฉ์์ง ์ค๋ณต์ฒ๋ฆฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ์ค ๊ฒ ๊ฐ์๋ค.
๊ณง๋ฐ๋ก Virtual Topics์ ๊ฐ๋
๊ณผ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์์๋ณด๊ณ ,
QA์๋ฒ์ ๋ก์ปฌ์๋ฒ๋ฅผ ๊ฐ๊ฐ Batch ์๋ฒ1, 2๋ก ์๊ฐํ๊ณ ํ
์คํธ๋ฅผ ์งํํ๋ค.
๊ทธ ๊ฒฐ๊ณผ, ๋ฉ์์ง ์ค๋ณต์ฒ๋ฆฌ ๋ฌธ์ ๊ฐ ๋ง๋ํ๊ฒ ํด๊ฒฐ๋์๋ค!
(์์ธ ๋ด์ฉ์ ๋ค์์ ์ค๋ช
)
9. Virtual Topics ๊ฐ๋ ์ดํด
๋๋์ด Virtual Topics์ ๋ํด ์์๋ณธ๋ค.
Virtual Topics์ ๊ธฐ์กด์ Topic ๋ฐฉ์๊ณผ ์ ์ฌํ์ง๋ง,
ํต์ฌ์ Logical Topic๊ณผ Physical Queue๋ฅผ ์์ฑํ๋ค๋ ์ ์ด๋ค.
Publisher๋ ๊ฐ์์(Logical) Topic์ผ๋ก ๋ฉ์์ง๋ฅผ ๋ฐํํ๊ณ ,
์ด ๊ฐ์์ Topic์ Subscriber๊ฐ ๊ตฌ๋
ํ๊ธฐ ์์ํ๋ฉด, (์ฆ, Listening์ ์์ํ๋ฉด)
ActiveMQ ๋ธ๋ก์ปค์ ํด๋น Subscriber๋ง์ ์ํ ๋ฌผ๋ฆฌ์ ์ธ(Physical) Queue๊ฐ ์๋์ผ๋ก ์์ฑ๋๋ค.
๊ทธ๋ฆฌ๊ณ Subscriber๋ ์๋์์ฑ๋ ๋ฌผ๋ฆฌ Queue๋ก๋ถํฐ ๋ฉ์์ง๋ฅผ ์๋นํ๋ ๋ฐฉ์์ด๋ค.
๋ํ, ๊ฐ Consumer๋ ์๋์ ๊ฐ์ด Topic์์ ์ง์ ๋ฉ์์ง๋ฅผ ๋ฐ์ ์๋ ์๊ณ , Queue๋ก๋ถํฐ ๋ฐ์ ์๋ ์๋ค.
์๋๋ Batch ์๋ฒ๊ฐ 1๋์ธ TV์ค๊ณผ 2๋์ธ ํ๋ธ์ค์ด ๋ฉ์์ง๋ฅผ ๋ฐ๋ ๋ฐฉ์์ ํํํ๋ค.
[๋ด์ค์ค] --> [VirtualTopic.news] --> [TV์ค Batch 1]
--> [Consumer.hub.VirtualTopic.news] --> [ํ๋ธ์ค Batch 1]
--> [ํ๋ธ์ค Batch 2]
10. Virtual Topics ์ ์ฉ ๊ฒฐ๊ณผ
์์ ์ค๋ช
ํ Virtual Topics
๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋์ํ๋ค.
๋ด์ค์ค์ Topic ๋ฐฉ์ ๊ทธ๋๋ก ๋ฉ์์ง๋ฅผ Publishํ๊ณ , (Topic ์ด๋ฆ๋ง ๋ณ๊ฒฝ
)
Batch ์๋ฒ๊ฐ 1๋์ธ TV์ค์ Topic ๋ฐฉ์ ๊ทธ๋๋ก ๋ฉ์์ง๋ฅผ Subscribe ํ๋ค. (Topic ์ด๋ฆ๋ง ๋ณ๊ฒฝ
)
Batch ์๋ฒ๊ฐ 2๋์ธ ํ๋ธ์ค์ Topic ๋ฐฉ์์ผ๋ก ๋ฉ์์ง๋ฅผ Subscribe ํ๋,
Logical Topic์ Listening ํ ๋ ์๋์ผ๋ก ์์ฑ๋๋ Physical Queue๋ก๋ถํฐ ๋ฉ์์ง๋ฅผ ์๋นํ๋ค.
๋ค์ ๋งํด, ํ๋ธ์ค์ Batch ์๋ฒ 2๋๊ฐ ํ๋์ Queue๋ก๋ถํฐ ๋ฉ์์ง๋ฅผ ์๋นํ๋๋ก ๊ตฌ์ฑํ ์ ์๋ค.
์ด ๋ฐฉ์์ ํฌ๊ฒ 3๊ฐ์ง ์ฅ์ ์ด ์๋ค.
- ๊ธฐ์กด์ Topic๋ฐฉ์์ ๊ทธ๋๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๊ด๋ฆฌํฌ์ธํธ๊ฐ ์ฆ๊ฐํ์ง ์๋๋ค.
Topic ์ด๋ฆ๋ง ๋ณ๊ฒฝ
- Pub-Sub ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ Subscriber๊ฐ ์ฆ๊ฐํด๋ Publisher๋ฅผ ์์ ํ ํ์๊ฐ ์๋ค.
- Batch ์๋ฒ๊ฐ 999๊ฐ๋ก ๋์ด๋๊ฑฐ๋, 1๊ฐ๋ก ์ค์ด๋ค์ด๋ ํ๋์ Queue์์ ๋ฉ์์ง๋ฅผ ์๋นํ๊ธฐ ๋๋ฌธ์ ์ค์ผ์ผ out/in ์ ์์ ๋กญ๋ค.
11. Virtual Topics ์ฌ์ฉ ๋ฐฉ๋ฒ (with Spring Boot)
์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋๋ฌด๋ ๊ฐ๋จํ๋ค. out-of-the-box
(๊บผ๋ด์ ๋ฐ๋ก ์ฐ๋) ๊ธฐ๋ฅ์ด๊ธฐ ๋๋ฌธ์
๊ธฐ์กด์ Topic ๋ฐฉ์์์ Topic ์ด๋ฆ๋ง Convention์ ๋ง๊ฒ ๋ณ๊ฒฝํ๋ฉด ๋๋ค.
์์ ์๋ activemq.xml
์ <DestinationInterceptor>
์ค์ ๋ ํด์ผ
ํด๋น Topic ์ด๋ฆ์ผ๋ก ๋ค์ด์จ ๋ฉ์์ง๋ฅผ Interceptor๊ฐ ๊ฐ๋ก์ฑ์ VirtualTopic์ผ๋ก ์ฒ๋ฆฌํ์ง๋ง,
์ด์ ๋ ์ด ์ค์ ๋ง์ Default๊ฐ ๋์๋ค.
11-1. Publisher์ ๊ฒฝ์ฐ
๊ธฐ์กด Topic ๋ฐฉ์์ผ๋ก Topic์ ์์ฑํ๋, Topic ์ด๋ฆ ์์ VirtualTopic.
์ ๋ถ์ฌ์
VirtualTopic.{Topic์ด๋ฆ}
์ผ๋ก ์์ฑํ๋ฉด ๋์ด๋ค.
private JmsTemplate jmsTemplate;
// Message ์์ฑ
jmsTemplate.convertAndSend(new ActiveMQTopic("VirtualTopic.ํ ํฝ์ด๋ฆ", ์์ฑํ Message))
11-2. ๋จ์ผ ์๋ฒ Subscriber์ ๊ฒฝ์ฐ
๋จ์ผ ์๋ฒ์ ๊ฒฝ์ฐ Topic์ผ๋ก๋ถํฐ ๋ฐ๋ก ๋ฉ์์ง๋ฅผ ๋ฐ์๋ ๋๋ฏ๋ก, Topic ๋ฐฉ์์ผ๋ก ๋ฉ์์ง๋ฅผ Listening ํ๋ค.
์ด ๋, destination์ Publisher๊ฐ ์์ฑํ Topic ์ด๋ฆ์ผ๋ก ์ค์ ํ๋ฉด ๋์ด๋ค.
@JmsListener(destination = "VirtualTopic.{Topic์ด๋ฆ}")
public void amazonMqNewsListener(@Payload MessageDto messageDto) {
// ๋ก์ง ์ฒ๋ฆฌ
}
11-3. ๋ก๋๋ฐธ๋ฐ์ฑ์ด ํ์ํ Subscriber์ ๊ฒฝ์ฐ
๋ฐ๋์ jms์ pub-sub-domain
์ค์ ์ false
๋ก ๋ณ๊ฒฝํด์ผ ํ๋ค.
# application.yml
spring:
jms:
pub-sub-domain: false
๊ทธ๋ฆฌ๊ณ N๊ฐ์ ์๋ฒ๊ฐ ๋ฉ์์ง๋ฅผ ๋๋์ด ๋ฐ์์ผ ํ๋ฏ๋ก ๊ธฐ์กด Topic ๋ฐฉ์์ผ๋ก ๋ฉ์์ง๋ฅผ Listening ํ๋,
์ด ๋, Publisher๊ฐ ์์ฑํ Topic ์ด๋ฆ ์์ Consumer.{clientId}.
๋ฅผ ๋ถ์ฌ์
destination์ Consumer.{clientId}.VirtualTopic.{Topic์ด๋ฆ}
์ผ๋ก ์ค์ ํ๋ฉด ๋์ด๋ค.
๋ง์ฝ clientId๋ฅผ ๋ฐ๋ก ์ค์ ํ์ง ์์๋ค๋ฉด, ํด๋น ๋ถ๋ถ์ ์ํ๋ ์ด๋ฆ์ ๋ฃ์ด๋ ๋ฌด๊ดํ๋ค.
@JmsListener(destination = "Consumer.{clientId}.VirtualTopic.{Topic์ด๋ฆ}")
public void amazonMqNewsListener(@Payload MessageDto messageDto) {
// ๋ก์ง ์ฒ๋ฆฌ
}
11-4. Topic ์ด๋ฆ ์์ฑ ๊ท์น์ ๋ฐ๊พธ๊ณ ์ถ์ ๊ฒฝ์ฐ
์ด ๊ฒฝ์ฐ, activemq.xml
ํ์ผ์ ์๋ ์ค์ ์ ์ถ๊ฐํด์, name
๊ณผ prefix
๋ฅผ ์ํ๋ ๋๋ก ๋ฐ๊พธ๋ฉด ๋๋ค.
<destinationInterceptors>
<virtualDestinationInterceptor>
<virtualDestinations>
<virtualTopic name=">" prefix="VirtualTopicConsumers.*." selectorAware="false"/>
</virtualDestinations>
</virtualDestinationInterceptor>
</destinationInterceptors>
์์ ๋ด์ฉ์ด Default ์ค์ ์ด๋ฉฐ, AmazonMQ์์๋ ํด๋น ๋ถ๋ถ์ด ์ฃผ์์ฒ๋ฆฌ๋ ์ฑ๋ก activemq.xml
์ด ์์ฑ๋๋ค.
11-5. AmazonMQ์ activemq.xml ์ค์
๊ธฐ์กด์๋ AmazonMQ์์ Virtual Destinations๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด
activemq.xml
์ ์๋์ ๋๊ทธ๋ผ๋ฏธ ์น ๋ถ๋ถ๊ณผ ๊ฐ์ด useVirtualTopics="true"
์
<destinationInterceptors>...</>
๋ถ๋ถ์ ์ค์ ์ ์ถ๊ฐํด์ผ ํ๋ค.
๊ทธ๋ฐ๋ฐ, ์ด ๋ํ์ AWS ์์ง๋์ด์ ์ํ๋ฉด Virtual Destinations๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก enabled ๋ ์ํ๋ก activemq.xml์ด ์์ฑ๋๋ค๊ณ ํ๋ค.
We’ve changed the way default configurations are created. By default virtual destinations are now enabled (an empty element is no longer present in the default XML configuration). ์ฆ, Topic ๋ช ๋ช ๊ท์น์ ๋ณ๊ฒฝํ ์๊ฐ์ด ์์ผ๋ฉด, ์๋ฌด๋ฐ ์ค์ ์ด ํ์ ์๋ค.
๊ทธ์ผ๋ง๋ก out-of-the-box
๊ธฐ๋ฅ์ด๋ค.
12. ๋งบ์ผ๋ฉฐ
๋ด๊ฐ ์ํ ํ์์๋ ํด๋ผ์ฐ๋ ํ๊ฒฝ์ ์ ๊ทน์ ์ผ๋ก ํ์ฉ์ค์ด๊ณ , ์์ผ๋ก ๋ ๋ค์ํ ํด๋ผ์ฐ๋ ์๋น์ค๋ฅผ ์ ์ฉํ ์์ ์ด๋ค.
ํ์ ๋ชจ๋ํ(?) ํ๊ฒฝ ๋๋ถ์, ์ฃผ๋์ด ๊ฐ๋ฐ์๋ก์ ๋ค์ํ ๊ฒฝํ๋ค์ ํ๊ณ ์๋๋ฐ,
์ด๋ฒ์๋ Message Broker์ ์ฌ์ฉ ๊ฒฝํ๊ณผ ์ง์์ด 1๋ ์๋ ์ํ์์
AmazonMQ์ Virtual Destinations๋ฅผ ํ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ณผ์ ์ ๊ฒฝํํ ์ ์์ด์ ์ฌ๋ฏธ์๊ณ ์ ์ตํ๋ค :)
์ธ์ ๊ฐ ๋ ํฌ๊ณ ๋ณต์กํ ํ๊ฒฝ์์ Message Broker๋ฅผ ์ฌ์ฉํ ์ผ์ด ์๊ธด๋ค๋ฉด, ์ด ๊ฒฝํ์ด ํฐ ๋์์ด ๋ ๊ฒ ๊ฐ๋ค.
ํน์๋ ํ๋ฆฐ ๋ด์ฉ์ด ์๋ค๋ฉด, ๊ผญ ์ง์ ํด์ฃผ์๊ธธ ๋ฐ๋๋๋ค.
* Reference
- ActiveMQ ๊ณต์๋ฌธ์ - Virtual Destinations
- Virtual Topics in ActiveMQ
- What are Virtual Destinations in ActiveMQ and how do they work?
- Queues vs. Topics vs. Virtual Topics (in ActiveMQ)