216.73.216.25 TODAY : 2,840
์ž๋ฃŒ์‹ค ์„œ๋ธŒ ํƒ€์ดํ‹€ ์•„์ด์ฝ˜

์˜จ๋ผ์ธ ๊ฐ•์˜

 > 

PHP - ์ตœ์ƒ๊ธ‰

๐Ÿ“š PHP ์ตœ์ƒ๊ธ‰ - 2์ฃผ์ฐจ: ๋ฉ”์‹œ์ง€ ํ (Message Queue) ํ™œ์šฉ - 01 ๋ฉ”์‹œ์ง€ ํ์˜ ํ•„์š”์„ฑ (Kafka, RabbitMQ)

๐Ÿ“š 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)์˜ ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ ๋ฐ ํ•„์š”์„ฑ โœจ

uploadImage

๋ฉ”์‹œ์ง€ ํ๋Š” ์ƒ์‚ฐ์ž(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 ๐Ÿ†š

uploadImage

๋ฉ”์‹œ์ง€ ํ ์‹œ์žฅ์„ ์ฃผ๋„ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋Œ€ํ‘œ์ ์ธ ์†”๋ฃจ์…˜์ธ #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๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ  ๐Ÿ’ก

uploadImage

PHP๋Š” ์š”์ฒญ์ด ๋๋‚  ๋•Œ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•˜๋Š” #Share_Nothing_Architecture ์— ๊ธฐ๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์žฅ๊ธฐ ์‹คํ–‰๋˜๋Š” #๋ฐ๋ชฌ(#Daemon) ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

  • ์„ฑ๋Šฅ ์ตœ์ ํ™”: ์›น ์„œ๋ฒ„(FPM)๋Š” ์‚ฌ์šฉ์ž ์š”์ฒญ์— ๋Œ€ํ•œ ๋น ๋ฅธ ์‘๋‹ต๋งŒ ๋‹ด๋‹นํ•˜๊ณ , ๋ณต์žกํ•˜๊ฑฐ๋‚˜ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…(์ด๋ฏธ์ง€ ๋ณ€ํ™˜, ์™ธ๋ถ€ API ํ˜ธ์ถœ ๋“ฑ)์€ MQ์— ์œ„์ž„ํ•จ์œผ๋กœ์จ #์›น_์‘๋‹ต_์‹œ๊ฐ„ ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์•ˆ์ •์ ์ธ ์ž‘์—… ์ฒ˜๋ฆฌ: PHP #์›Œ์ปค ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋ฉฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ์‹คํŒจ ์‹œ์—๋Š” #์žฌ์‹œ๋„_๋กœ์ง(#Retry_Logic)์„ ํ ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”์‹œ์ง€ ํ๋Š” MSA์™€ #๋Œ€์šฉ๋Ÿ‰_ํŠธ๋ž˜ํ”ฝ ํ™˜๊ฒฝ์—์„œ PHP ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ์„ ๊ทน์ ์œผ๋กœ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ํ•„์ˆ˜์ ์ธ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.



๋น ๋ฅธ์†๋„, ๊ฐ„ํŽธํ•œ์‚ฌ์šฉ, ์žฅ์• ์—†๋Š”VPN, ์‚ฌ์šฉ์ด๋ ฅ์—†๋Š” ๊นจ๋—ํ•œ ์•„์ดํ”ผ

https://vpn.luzensoft.com