์จ๋ผ์ธ ๊ฐ์
>PHP - ์ต์๊ธ
๐ PHP ์ต์๊ธ - 2์ฃผ์ฐจ: ๋ฉ์์ง ํ (Message Queue) ํ์ฉ - 01 ๋ฉ์์ง ํ์ ํ์์ฑ (Kafka, RabbitMQ)
์ฃผ์ ํ๋ก๊ทธ๋จ ์คํ
- ํ์ : 10.0
- ๋ผ์ด์ ์ค: free
- ์ด์์ฒด์ :
- ํ์ผ ํฌ๊ธฐ: 0
ํผ๋๋ฐฑ ๋ฐ ๋ค์ด๋ก๋
- ์ฌ์ฉ์ ํ์ : 10.0
- ๋ค์ด๋ก๋ ์: 1
- ์กฐํ์: 50
์ ์กฐ์ฌ ๋ฐ ๋ฑ๋ก ์ ๋ณด
- ์ ์์ฌ: LUZENSOFT
- ๋ฑ๋ก์ผ: 2025-10-04 09:56:49
- ์ค๋ช
์๋น์ค ๊ฐ ํต์ ์ ๋๋ ๋ง: ๋๊ธฐ vs ๋น๋๊ธฐ ๐ค
#๋ง์ดํฌ๋ก์๋น์ค_์ํคํ ์ฒ(#MSA) ์์ ์๋น์ค ๊ฐ ํต์ ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ง๋์ฃผ์ ๋ค๋ฃฌ #API_Gateway ๋ฅผ ํตํ ํต์ ์ ๋๋ถ๋ถ ๋๊ธฐ์(Synchronous) ๋ฐฉ์์ ๋๋ค. ์ฆ, ์์ฒญ์ ๋ณด๋ธ ์๋น์ค(ํด๋ผ์ด์ธํธ)๊ฐ ์๋ต์ ๋ฐ์ ๋๊น์ง ๋ธ๋กํน(Blocking) ์ํ๋ก ๋๊ธฐํฉ๋๋ค. โณ
ํ์ง๋ง, ๋ชจ๋ ์์ ์ด ์ฆ๊ฐ์ ์ธ ์๋ต์ ํ์๋ก ํ์ง๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํ์๊ฐ์ ํ ์ด๋ฉ์ผ ๋ฐ์ก, ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ๋ฐฐ์น ์์ ๋ฑ์ ๋ฉ์ธ #์น_์์ฒญ ์ ์๋ต ์๋์ ์ํฅ์ ์ฃผ์ง ์์์ผ ํฉ๋๋ค. ์ด๋ฌํ ์์ ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ , ์์คํ ์ #ํ์ฅ์ฑ ๊ณผ #์์ ์ฑ ์ ๋์ด๊ธฐ ์ํด ํ์ํ ํต์ฌ ๋๊ตฌ๊ฐ ๋ฐ๋ก #๋ฉ์์ง_ํ(#Message_Queue, #MQ) ์ ๋๋ค.
1. ๋ฉ์์ง ํ(MQ)์ ๋ฑ์ฅ ๋ฐฐ๊ฒฝ ๋ฐ ํ์์ฑ โจ
๋ฉ์์ง ํ๋ ์์ฐ์(Producer) ๊ฐ ๋ณด๋ธ #๋ฉ์์ง ๋ฅผ ํ(Queue) ์ ์ ์ฅํ๊ณ , ์๋น์(Consumer) ๊ฐ ํ์์ ๋ฉ์์ง๋ฅผ ๊ฐ์ ธ๊ฐ ์ฒ๋ฆฌํ๋ #๋น๋๊ธฐ_ํต์ ๋ฐฉ์์ ํต์ฌ ๋๊ตฌ์ ๋๋ค.
1.1. ๊ฒฐํฉ๋ ๋ฎ์ถ๊ธฐ (Decoupling)
#๋ชจ๋๋ฆฌ์_์ํคํ ์ฒ ๋ ๋๊ธฐ์ MSA ํ๊ฒฝ์์๋ A ์๋น์ค๊ฐ B ์๋น์ค๋ฅผ ์ง์ ํธ์ถํฉ๋๋ค.
A์ B ์๋น์ค๊ฐ **๊ฐํ๊ฒ ๊ฒฐํฉ(Tightly Coupled)**๋์ด ์์ด, B ์๋น์ค์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด A ์๋น์ค๋ ์คํจํฉ๋๋ค.
MQ๋ฅผ ์ฌ์ฉํ๋ฉด, A ์๋น์ค๋ ๋จ์ํ ๋ฉ์์ง๋ฅผ ํ์ ๋์ ธ๋๊ณ ์ฆ์ ์์ ์ ์์ ์ ์๋ฃํฉ๋๋ค. B ์๋น์ค์ ์ํ๋ฅผ ์ ํ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก, ์๋น์ค ๊ฐ์ #๊ฒฐํฉ๋ ๊ฐ ๋ฎ์์ ธ (#Loose_Coupling) ๋ ๋ฆฝ์ ์ธ ๋ฐฐํฌ์ ์ด์์ด ๊ฐ๋ฅํด์ง๋๋ค.
1.2. ๋ถํ ๋ถ์ฐ ๋ฐ ํธ๋ํฝ ํญ์ฃผ ๋์ (Load Leveling)
๊ฐ์์ค๋ฌ์ด ํธ๋ํฝ ํญ์ฃผ ์ํฉ์ ์๊ฐํด ๋ด ์๋ค. (์: ํซ๋, ์ด๋ฒคํธ)
MQ ์์ด ๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ฉด, ๋ชจ๋ ์์ฒญ์ด ๋์์ ๋ฐฑ์๋ ์๋น์ค์ ๋๋ฌํ์ฌ ์๋น์ค๊ฐ #๊ณผ๋ถํ ๋ก ๋ค์ด๋ ์ ์์ต๋๋ค.
MQ๋ฅผ ์ฌ์ฉํ๋ฉด, ๋ค์ด์ค๋ ์์ฒญ์ ํ๊ฐ ์ผ๋จ ์์ ํ๊ฒ ๋ฐ์ ์ ์ฅํ๊ณ , #์๋น์ ์๋น์ค๋ ์์ ์ด ์ฒ๋ฆฌํ ์ ์๋ ์๋๋ก ์์ ์ ์ผ๋ก ์์ฒญ์ ๊บผ๋ด ์ฒ๋ฆฌํฉ๋๋ค.
์ด๋ ํธ๋ํฝ์ ํ์คํ(Leveling)ํ์ฌ ๋ฐฑ์๋ ์๋น์ค์ #์์ ์ ์ธ_์ด์ ์ ๋ณด์ฅํฉ๋๋ค.
1.3. ๊ธด ์์ ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ (Asynchronous Processing)
#PHP_์น_์์ฒญ ์ ๋ณดํต ์๋ฐฑ ๋ฐ๋ฆฌ์ด ๋ด์ ์๋ตํด์ผ ํฉ๋๋ค. 5์ด๊ฐ ๊ฑธ๋ฆฌ๋ ์์ ์ ์ฒ๋ฆฌํ๋ค๋ฉด ํด๋ผ์ด์ธํธ๋ #Time_Out ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
MQ๋ฅผ ์ฌ์ฉํ๋ฉด, 5์ด์ง๋ฆฌ ์์ ์์ฒญ์ ํ์ ๋ฃ๊ณ ํด๋ผ์ด์ธํธ์๊ฒ๋ "์์ฒญ์ด ์ ์๋์์ต๋๋ค(202 Accepted)."๋ผ๊ณ ์ฆ์ ์๋ตํฉ๋๋ค.
๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ๋๋ #์์ปค(#Worker) ํ๋ก์ธ์ค๊ฐ ํ์์ ๋ฉ์์ง๋ฅผ ๊บผ๋ด ์์ ์ ์๋ฃํฉ๋๋ค.
์ด๋ ์ฌ์ฉ์์๊ฒ ๋น ๋ฅธ ์๋ต ์๋๋ฅผ ์ ๊ณตํ๋ฉด์ ๋์์ ์ฅ์๊ฐ ๊ฑธ๋ฆฌ๋ ์์ ์ ์์ ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ฒ ํด์ค๋๋ค.
2. ์ฃผ์ ๋ฉ์์ง ํ ์ ํ: Kafka vs RabbitMQ ๐
๋ฉ์์ง ํ ์์ฅ์ ์ฃผ๋ํ๋ ๋ ๊ฐ์ง ๋ํ์ ์ธ ์๋ฃจ์ ์ธ #Kafka ์ #RabbitMQ ๋ ๋ชฉ์ ๊ณผ ๋์ ๋ฐฉ์์ ํฐ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
2.1. RabbitMQ (AMQP ๊ธฐ๋ฐ)
#RabbitMQ ๋ ์ ํต์ ์ธ ๋ฉ์์ง ๋ธ๋ก์ปค(Message Broker) ์ญํ ์ ์ถฉ์คํฉ๋๋ค.
์ฃผ์ ๋ชฉ์ : ๋ฉ์์ง์ ์ ๋ขฐ์ฑ(Reliability) ์๋ ์ ๋ฌ๊ณผ ๋ณต์กํ ๋ผ์ฐํ .
๋์ ๋ฐฉ์: ํ์ ๋ค์ด์จ ๋ฉ์์ง๋ ์๋น์๊ฐ ๊ฐ์ ธ๊ฐ๋ฉด ์ฆ์ ์ญ์ ๋ฉ๋๋ค. (Point-to-Point ๋๋ Fanout)
ํน์ง:
#AMQP (Advanced Message Queuing Protocol)๋ฅผ ํ์ค์ผ๋ก ์ฌ์ฉํ๋ฉฐ, ๋ค์ํ ๋ผ์ฐํ ๋ชจ๋ธ(#Exchange, #Binding, #Queue)์ ํตํด ๋ฉ์์ง๋ฅผ ์ธ๋ฐํ๊ฒ ๋ถ๋ฐฐํ ์ ์์ต๋๋ค.
#๋จ์ผ_๋ฉ์์ง ์ ์ฒ๋ฆฌ ๋ฐ ๋ณด์ฅ์ด ์ค์ํ ๋, #RPC (Remote Procedure Call)์ ๊ฐ์ด ์๋ต์ด ํ์ํ ๋น๋๊ธฐ ํต์ ์ ์ ํฉํฉ๋๋ค.
PHP ํ์ฉ: #PHP ์์๋ #php_amqp ๋๋ #RabbitMQ_Bundle ๋ฑ์ ์ฌ์ฉํ์ฌ ์ฝ๊ฒ ์ฐ๋๋ฉ๋๋ค.
2.2. Apache Kafka (๋ถ์ฐ ์คํธ๋ฆฌ๋ฐ ํ๋ซํผ)
#Kafka ๋ ๋จ์ํ ํ๊ฐ ์๋๋ผ, #๋ถ์ฐ_์คํธ๋ฆฌ๋ฐ_ํ๋ซํผ์ผ๋ก ์ค๊ณ๋์์ต๋๋ค.
์ฃผ์ ๋ชฉ์ : ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ, ์ด๋ฒคํธ ์ ์ฅ์ ์ญํ .
๋์ ๋ฐฉ์: ๋ฉ์์ง(์ด๋ฒคํธ)๋ฅผ ์ญ์ ํ์ง ์๊ณ ํ ํฝ(Topic)์ ๋ก๊ทธ ํ์ผ์ ์ผ์ ๊ธฐ๊ฐ ์ ์ฅํฉ๋๋ค. ์๋น์๋ ๋ก๊ทธ์์ ๋ฉ์์ง๋ฅผ ์ฝ์ผ๋ฉฐ, ๋ฉ์์ง๊ฐ ์ญ์ ๋์ง ์์ผ๋ฏ๋ก ์ฌ๋ฌ ์๋น์๊ฐ ๋์ผ ๋ฉ์์ง๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ์ฝ์ ์ ์์ต๋๋ค.
ํน์ง:
#ํํฐ์ ์ ํตํ ์๋์ ์ธ #์ฒ๋ฆฌ๋(#Throughput)๊ณผ ํ์ฅ์ฑ.
๋ฐ์ดํฐ๋ฅผ ์๊ตฌ์ ์ผ๋ก ์ ์ฅํ๋ฏ๋ก, ๊ณผ๊ฑฐ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์ฒ๋ฆฌํด์ผ ํ๋ ๋ฆฌํ๋ ์ด(Replay) ์ํฉ์ ์ ํฉํฉ๋๋ค.
์ค์๊ฐ ๋ก๊ทธ ์์ง, #์ด๋ฒคํธ_์์ฑ(Event Sourcing), #๋ฐ์ดํฐ_ํ์ดํ๋ผ์ธ ๊ตฌ์ถ์ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
PHP ํ์ฉ: #php-rdkafka ๋ฑ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ Kafka #Broker ์ ์ฐ๋ํฉ๋๋ค.
3. PHP ๊ฐ๋ฐ์๊ฐ MQ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ด์ ๐ก
PHP๋ ์์ฒญ์ด ๋๋ ๋ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ํด์ ํ๋ #Share_Nothing_Architecture ์ ๊ธฐ๋ฐํฉ๋๋ค. ๋ฐ๋ผ์ ์ฅ๊ธฐ ์คํ๋๋ #๋ฐ๋ชฌ(#Daemon) ํ๋ก์ธ์ค๋ฅผ ์คํํ๊ธฐ ์ด๋ ต์ต๋๋ค.
์ฑ๋ฅ ์ต์ ํ: ์น ์๋ฒ(FPM)๋ ์ฌ์ฉ์ ์์ฒญ์ ๋ํ ๋น ๋ฅธ ์๋ต๋ง ๋ด๋นํ๊ณ , ๋ณต์กํ๊ฑฐ๋ ์ค๋ ๊ฑธ๋ฆฌ๋ ์์ (์ด๋ฏธ์ง ๋ณํ, ์ธ๋ถ API ํธ์ถ ๋ฑ)์ MQ์ ์์ํจ์ผ๋ก์จ #์น_์๋ต_์๊ฐ ์ ์ต์ํํ ์ ์์ต๋๋ค.
์์ ์ ์ธ ์์ ์ฒ๋ฆฌ: PHP #์์ปค ํ๋ก์ธ์ค๊ฐ ํ๋ฅผ ๋ชจ๋ํฐ๋งํ๋ฉฐ ์์ ์ ์ฒ๋ฆฌํ๊ณ , ์คํจ ์์๋ #์ฌ์๋_๋ก์ง(#Retry_Logic)์ ํ ์์คํ ์ ํตํด ์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
๋ฉ์์ง ํ๋ MSA์ #๋์ฉ๋_ํธ๋ํฝ ํ๊ฒฝ์์ PHP ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ๊ณผ ์์ ์ฑ์ ๊ทน์ ์ผ๋ก ํฅ์์ํค๋ ํ์์ ์ธ ๋๊ตฌ์ ๋๋ค.
๋น ๋ฅธ์๋, ๊ฐํธํ์ฌ์ฉ, ์ฅ์ ์๋VPN, ์ฌ์ฉ์ด๋ ฅ์๋ ๊นจ๋ํ ์์ดํผ