Project/์‹นํ‹”์›€

[์‹นํ‹”์›€] ๋ฉ”์ธ ์„œ๋ฒ„์ธก ์—๋Ÿฌ๋กœ ์ธํ•œ Kafka Message ์ „์†ก ์‹คํŒจ ์‹œ๋‚˜๋ฆฌ์˜ค ๋Œ€๋น„ ์•ˆ์ „ ์žฅ์น˜ ๊ณ ๋ฏผ

ํ•œ33 2025. 4. 14. 22:35

 

๐Ÿ’ก ๊ฐœ์š”

 

์•„์›ƒ๋ฐ•์Šค ํŒจํ„ด ๊ตฌํ˜„

 

๊ณ ๋ฏผ1 : ์•„์›ƒ๋ฐ•์Šค ํŒจํ„ด์„ ์ ์šฉํ•˜๋ฉด Kafka ๋ฉ”์„ธ์ง€ ์ „์†ก ์ „์— ๋ฌด์กฐ๊ฑด DB ๋กœ ๋ถ€ํ„ฐ ์กฐํšŒ๋ฅผ ํ•ด์„œ ๋ถˆ๋Ÿฌ์˜ค๋‹ค๋ณด๋‹ˆ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋‚ญ๋น„๋˜์ง€ ์•Š์„๊นŒ?

๊ณ ๋ฏผ1 ํ•ด๊ฒฐ: ์•„์›ƒ๋ฐ•์Šค ํŒจํ„ด ๋ณ€ํ˜• ๊ตฌ์กฐ ๊ตฌํ˜„

 

๊ณ ๋ฏผ2 : ์žฌ์ „์†ก์„ ์‹œ๋„ํ•ด๋„ ๊ณ„์†ํ•ด์„œ Sent ๊ฐ’์ด False ์ธ ๊ฒฝ์šฐ๋Š” ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋ฉด ์ข‹์„๊นŒ?

๊ณ ๋ฏผ2 ํ•ด๊ฒฐ: Redis ๋„์ž…์„ ํ†ตํ•ด ๊ฐ ๋ฐ์ดํ„ฐ๋ณ„ Count ๋ฐ Webhook ์—ฐ๊ฒฐ์„ ํ†ตํ•œ ์šด์˜ ์ฒ˜๋ฆฌ

 

๊ณ ๋ฏผ3 : DLQ Topic ๋„์ž…์„ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ?


์ด์ „ ๊ธ€:

 

[์‹นํ‹”์›€] API Gateway ๋„์ž…์„ ํ†ตํ•œ ์ธ์ฆ ์—ญํ•  ๋ถ„๋‹ด

๐Ÿ’ก ๊ฐœ์š”์ด์ „ ๊ธ€https://hanstory33.tistory.com/318 [์‹นํ‹”์›€] 04/07 ๊ฐœ๋ฐœ์ผ์ง€ FeignClient ๋„์ž…์œผ๋กœ ๋ถ„์‚ฐ ์„œ๋ฒ„์—์„œ์˜ ์ธ์ฆ ๋ฌธ์ œ ํ•ด๊ฒฐ๐Ÿ’ก ๊ฐœ์š”๋ฉ”์ธ์„œ๋ฒ„์™€ ์•Œ๋ฆผ์„œ๋ฒ„๊ฐ€ ๋ถ„๋ฆฌ๋œ ํ˜„ ๊ตฌ์กฐ์˜ ์•Œ๋ฆผ์„œ๋ฒ„๋Š” ๋ˆ„๊ตฌ๋‚˜ ๋‹ค๋ฅธ

hanstory33.tistory.com

 

 

 

ํ˜„์žฌ ๊ตฌ์กฐ์—์„œ ๋ฉ”์ธ์„œ๋ฒ„์™€ ์•Œ๋ฆผ์„œ๋ฒ„ ์‚ฌ์ด์—์„œ Kafka ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฉ”์„ธ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋Š”๋ฐ, ๋‹จ์ˆœํ•œ ๋ฉ”์„ธ์ง€ ์ „๋‹ฌ ๊ตฌํ˜„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‹œ์Šคํ…œ ์•ˆ์ •์„ ์œ„ํ•ด ์‹คํŒจํ•  ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋Œ€๋น„ํ•  ํ•„์š”๊ฐ€ ์žˆ๊ณ  ๊ทธ ๋ฐฉ๋ฒ•์ด ๋งŽ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜๋‹ค. ๊ทธ ์ค‘ Outbox ํŒจํ„ด, retry ์‹œ๋„, DLQ ๋กœ์ง์„ ๊ณ ๋ คํ•˜๋ฉด์„œ ํ–ˆ๋˜ ๊ณ ๋ฏผ์„ ๊ธฐ๋กํ•˜๊ณ ์ž ํ–ˆ๋‹ค.

 

๐Ÿ’ก ์‹คํŒจ ์‹œ๋‚˜๋ฆฌ์˜ค

- Kafka ๋ธŒ๋กœ์ปค ๋˜๋Š” ์ปจ์Šˆ๋จธ๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ์„œ๋ฒ„ ๊ฐ„ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์ด ๋Š๊ธฐ๊ฑฐ๋‚˜ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, ๋ฉ”์‹œ์ง€๊ฐ€ ์ „๋‹ฌ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ

- Kafka ๋ธŒ๋กœ์ปค๊ฐ€ ๋‹ค์šด๋˜๊ฑฐ๋‚˜ ์ผ์‹œ์ ์œผ๋กœ ์‘๋‹ตํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

- ์ปจ์Šˆ๋จธ๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ

- ํ”„๋กœ๋“€์„œ์™€ ์ปจ์Šˆ๋จธ ๊ฐ„ ๋ฉ”์‹œ์ง€ ํฌ๋งท์ด ์ผ์น˜ํ•˜์ง€ ์•Š์•„ ์—ญ์ง๋ ฌํ™”์— ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ

๋“ฑ ๋“ฑ

 

๐Ÿ’ก ์•„์›ƒ๋ฐ•์Šค ํŒจํ„ด ๊ตฌํ˜„

๐ŸŒฑ ์•„์›ƒ๋ฐ•์Šค ํŒจํ„ด์ด๋ž€?

- ์•„์›ƒ๋ฐ•์Šค ํŒจํ„ด์€ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠธ๋žœ์žญ์…˜๊ณผ ๋ฉ”์‹œ์ง€ ์ „์†ก์„ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํŒจํ„ด์ด๋‹ค. ์ด ํŒจํ„ด์€ ๋ฉ”์‹œ์ง€๋ฅผ Kafka์™€ ๊ฐ™์€ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋กœ ์ง์ ‘ ์ „์†กํ•˜์ง€ ์•Š๊ณ , ๋จผ์ € ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•œ ํ›„ ๋ณ„๋„์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ์–ด ๋ธŒ๋กœ์ปค๋กœ ์ „์†กํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

 

๐ŸŒฑ ๊ตฌํ˜„

- ํ•„์ž๋Š” ๊ธฐ์กด์— kafka ๋กœ ๋ฉ”์„ธ์ง€๋ฅผ ์ƒ์„ฑํ•ด์„œ topic ์— ๋„ฃ๋Š” ๋กœ์ง ๋Œ€์‹ ์— notification Entity ์— sent Column ์„ Flag ๋ณ€์ˆ˜๋กœ ์ถ”๊ฐ€ํ•ด์„œ kafka ๋ฉ”์„ธ์ง€ ์ „์†ก ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ–ˆ๋‹ค. ๊ธฐ์กด์— ๊ฐ์ฒด ์ƒ์„ฑ์‹œ์—๋Š” false ๊ฐ’์œผ๋กœ ๋„ฃ์–ด์„œ ์šฐ์„  DB ์— ์ €์žฅ์‹œ์ผฐ๋‹ค.

- ์ดํ›„ Scheduler ๋ฅผ ํ™œ์šฉํ•ด์„œ ์ผ๊ด„์ ์œผ๋กœ sent Column ๊ฐ’์ด false ์ธ ๋ฐ์ดํ„ฐ๋“ค์˜ kafka ๋ฉ”์„ธ์ง€๋ฅผ ์ƒ์„ฑํ•ด topic ์œผ๋กœ ์ „๋‹ฌ์‹œํ‚จ๋‹ค.

- ์ „๋‹ฌ์ด ์™„๋ฃŒ๋œ ๋ฐ์ดํ„ฐ์˜ sent ๊ฐ’์„ true ๋กœ ๋ณ€๊ฒฝ์‹œ์ผœ์ฃผ๋ฉด ๋œ๋‹ค.


๐ŸŒฑ๊ณ ๋ฏผ1 : ์•„์›ƒ๋ฐ•์Šค ํŒจํ„ด์„ ์ ์šฉํ•˜๋ฉด Kafka ๋ฉ”์„ธ์ง€ ์ „์†ก ์ „์— ๋ฌด์กฐ๊ฑด DB ๋กœ ๋ถ€ํ„ฐ ์กฐํšŒ๋ฅผ ํ•ด์„œ ๋ถˆ๋Ÿฌ์˜ค๋‹ค๋ณด๋‹ˆ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋‚ญ๋น„๋˜์ง€ ์•Š์„๊นŒ?

- 1์ฐจ์ ์œผ๋กœ DB ์— ๋ฉ”์„ธ์ง€๋ฅผ ์ €์žฅ์‹œํ‚ค๊ณ  ์ดํ›„ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ํ†ตํ•ด ์ฃผ๊ธฐ์ ์œผ๋กœ ์ผ๊ด„ Kafka ๋ฉ”์„ธ์ง€๋ฅผ ์ „์†กํ•˜๋‹ค๋ณด๋‹ˆ ์•„๋ž˜ ๋‘ ๊ฒฝ์šฐ์—์„œ ํ•œ๊ณ„๊ฐ€ ์žˆ์ง€ ์•Š์„๊นŒ ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

  • ์„œ๋ฒ„ ๋ฐ DB ๋ถ€ํ•˜
  • ์‹ค์‹œ๊ฐ„ ๋ฉ”์„ธ์ง€ ์ „์†ก ๋ถˆ๊ฐ€

๐Ÿ’ก ๊ณ ๋ฏผ1 ํ•ด๊ฒฐ: ์•„์›ƒ๋ฐ•์Šค ํŒจํ„ด ๋ณ€ํ˜• ๊ตฌ์กฐ ๊ตฌํ˜„

- ๊ทธ๋ž˜์„œ ํ•„์ž๋Š” ์•„์›ƒ๋ฐ•์Šค ํŒจํ„ด์—์„œ ์กฐ๊ธˆ ๋ณ€ํ˜•ํ•ด ์ตœ์ดˆ Kafka ๋ฉ”์„ธ์ง€ ์ƒ์„ฑ ์‹œ ๋ฐ”๋กœ ์ „์†ก์‹œํ‚ด๊ณผ ๋™์‹œ์— Outbox Table ์—๋„ ์ €์žฅ์‹œํ‚จ๋‹ค. ์ด ๋•Œ Sent Flag ๋ณ€์ˆ˜๋Š” true ๊ฐ’์œผ๋กœ ์ €์žฅํ•œ๋‹ค.

- ํ˜น์‹œ Kafka ๋ฉ”์„ธ์ง€ ์ „์†ก์— ์‹คํŒจํ•œ๋‹ค๋ฉด Sent ๋ณ€์ˆ˜ ๊ฐ’์„ false ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์ดํ›„ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ํ†ตํ•ด ์žฌ์ฒ˜๋ฆฌ๋ฅผ ์‹œ์ผฐ๋‹ค.

- ๋˜ํ•œ DB ๊ณผ๋ถ€ํ•˜๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ์ƒ์„ฑ์‹œ๊ฐ„ ๊ธฐ์ค€ ์˜ค๋ฆ„์ฐจ์ˆœ ์ƒ์œ„ 50 ๊ฐœ์˜ ๋ฐ์ดํ„ฐ์”ฉ ์žฌ์ „์†ก์„ ์‹œ๋„ํ•˜๋„๋ก ์„ค์ •์„ ํ–ˆ๋‹ค.

 

- 1์ฐจ์ ์œผ๋กœ Kafka ๋ฉ”์„ธ์ง€ ์ „์†ก์— ์„ฑ๊ณตํ•œ ๋ฐ์ดํ„ฐ๋“ค์€ ๊ฑธ๋Ÿฌ์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ดํ›„ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ํ†ตํ•ด ์กฐํšŒ ํ›„ ์ฒ˜๋ฆฌํ•  ๋•Œ์—๋„ DB ๋ถ€ํ•˜๊ฐ€ ์ค„๊ณ , ์ตœ์ดˆ Kafka ๋ฉ”์„ธ์ง€ ์ƒ์„ฑ ์‹œ ๋ฐ”๋กœ ์ „์†ก์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅธ ๋ฉ”์„ธ์ง€ ์ „์†ก์ด ๊ฐ€๋Šฅํ•˜๋‹ค.


๐ŸŒฑ๊ณ ๋ฏผ2 : ์žฌ์ „์†ก์„ ์‹œ๋„ํ•ด๋„ ๊ณ„์†ํ•ด์„œ Sent ๊ฐ’์ด False ์ธ ๊ฒฝ์šฐ๋Š” ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋ฉด ์ข‹์„๊นŒ?

- ์ผ์‹œ์ ์ธ ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜ ๋“ฑ์œผ๋กœ Kafka ๋ฉ”์„ธ์ง€ ์ „์†ก์— ์‹คํŒจํ–ˆ์„ ๋•Œ๋ฅผ ๋Œ€๋น„ํ•ด ์•„์›ƒ๋ฐ•์Šค ํŒจํ„ด์„ ํ•„์ž์˜ ์„œ๋น„์Šค์— ๋งž๊ฒŒ ์ˆ˜์ •์„ ํ–ˆ๋‹ค.

- ํ•˜์ง€๋งŒ ์ผ์‹œ์ ์ธ ๋„คํŠธ์›Œํฌ๊ฐ€ ์•„๋‹ˆ๋ผ Kafka ์—ฐ๊ฒฐ์ด ๋Š์–ด์กŒ๋“  ์–ด๋– ํ•œ ์น˜๋ช…์ ์ธ ์ƒํ™ฉ ๋•Œ๋ฌธ์— ์ง€์†์ ์œผ๋กœ ์žฌ์ „์†ก์„ ์‹œ๋„ํ•ด๋„ Kafka ๋ฉ”์„ธ์ง€ ์ „์†ก์— ์‹คํŒจ๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ, Outbox DB ์—๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๊ณ„์† ์Œ“์ผ ๊ฒƒ์ด๋‹ค.

List<NotificationOutbox> findTop50BySentFalseAndDlqFalseOrderByCreatedAtAsc();

 

- ๋˜ํ•œ ์œ„์ฒ˜๋Ÿผ ์ƒ์„ฑ์‹œ๊ฐ„ ๊ธฐ์ค€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ƒ์œ„ 50๊ฐœ๋ฅผ ๊ฐ€์ ธ์˜ค๋‹ค๋ณด๋‹ˆ, ๊ณ„์† ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋งŒ ๋ฐ˜๋ณต์ ์œผ๋กœ Kafka ๋ฉ”์„ธ์ง€ ์ „์†ก ์‹œ๋„๋ฅผ ํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.


๐Ÿ’ก ๊ณ ๋ฏผ2 ํ•ด๊ฒฐ: Redis ๋„์ž…์„ ํ†ตํ•ด ๊ฐ ๋ฐ์ดํ„ฐ๋ณ„ Count ๋ฐ Webhook ์—ฐ๊ฒฐ์„ ํ†ตํ•œ ์šด์˜ ์ฒ˜๋ฆฌ

- ๋•Œ๋ฌธ์— ๊ฐ ๋ฐ์ดํ„ฐ๋ณ„ ์žฌ์ „์†ก ํšŸ์ˆ˜์˜ ํ•œ๊ณ„๋ฅผ ๋‘์—ˆ์–ด์•ผํ–ˆ๊ณ , ๋‹จ์ˆœ ์นด์šดํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— DB ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ณ  TTL ๋“ฑ ์„ค์ •์„ ํ†ตํ•ด ๊ด€๋ฆฌํ•˜๊ธฐ ์šฉ์ดํ•œ redis ๋ฅผ ์ด์šฉํ•ด count ๋ฅผ ํ–ˆ๋‹ค.

 

- ๊ฐ Outbox Id ๋ณ„ ์žฌ์ „์†ก 3ํšŒ ์ œํ•œ์„ ๊ฑธ๊ณ , ๋งŒ์•ฝ 3ํšŒ ์ดˆ๊ณผ๋กœ ์žฌ์ „์†ก ์‹คํŒจ ์‹œ ์ด๋ฅผ ์น˜๋ช…์ ์ธ ์—๋Ÿฌ ๋ฐœ์ƒ์œผ๋กœ ๋ถ„๋ฅ˜ํ•œ๋‹ค.

 

- ์ด๋ฅผ ์šด์˜์ ์ธ ์ธก๋ฉด์—์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์กฐ์น˜๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋‹น Outbox ๋ฐ์ดํ„ฐ์˜ errored Column ๊ฐ’์„ true ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ ,

๋ฐ์ดํ„ฐ ์ •๋ณด์™€ ํ•จ๊ป˜ Discord Webhook ๋ฅผ ์—ฐ๊ฒฐํ•ด ๊ณต์œ  ๊ฐ€๋Šฅํ•˜๋„๋ก ํ–ˆ๋‹ค.

 

๐Ÿšจ ํ…Œ์ŠคํŠธ

try {
    if (true) {
        throw new RuntimeException("๐Ÿ’ฅ ๊ณ ์˜๋กœ ๋ฐœ์ƒ์‹œํ‚จ Kafka ์˜ˆ์™ธ");
    }
    kafkaTemplate.send("notifications", message);
    log.info("โœ… Kafka ์ „์†ก ์„ฑ๊ณต");
}

 

์˜๋„์ ์œผ๋กœ Error ์— ๊ฑธ๋ฆฌ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ Kafka message ๋ฅผ ์ƒ์„ฑํ•˜๋Š” try ๋ฌธ์— RuntimeException ์—๋Ÿฌ๊ฐ€ ๋‚˜์˜ค๊ฒŒ ํ–ˆ๋‹ค.

 

๋ฐ˜๋ณต๋ฌธ์„ 3๋ฒˆ ๋Œ๋ฉด์„œ Redis ์—์„œ count ๋ฅผ ํ•˜๊ณ  count ์ œํ•œ์ด ๋๋‚˜๋ฉด ํ•ด๋‹น log ์™€ ํ•จ๊ป˜ Discord ์•Œ๋ฆผ ์ „์†ก์„ ๋ณด๋‚ด๋ฉฐ errored ๊ฐ’์„ true ๋กœ ์ˆ˜์ •ํ•œ๋‹ค.


๐ŸŒฑ๊ณ ๋ฏผ3 : DLQ Topic ๋„์ž…์„ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ?

- Kafka ์˜ DLQ ๊ธฐ๋Šฅ์„ ๊ณ ๋ฏผํ•ด๋ณด์•˜๋‹ค. 

 

DLQ ( Dead Letter Queue ) ๋ž€ ?

๋ฉ”์‹œ์ง€ ์†Œ๋น„(Consumer) ์ค‘ ์ฒ˜๋ฆฌ์— ์‹คํŒจํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ๋”ฐ๋กœ ์ €์žฅํ•˜๋Š” Kafka์˜ ํŠน์ˆ˜ํ•œ ํ† ํ”ฝ(Queue)

 

- ๋‹ค์–‘ํ•œ ๋ฌธ์ œ๋กœ Kafka Message ์ƒ์„ฑ์˜ ์‹คํŒจ ์ผ€์ด์Šค๊ฐ€ ์žˆ๊ฒ ์ง€๋งŒ, ๊ทธ ์ค‘ Kafka ์„œ๋ฒ„ ์ž์ฒด์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋Œ€๋น„ํ•ด๋ณด์ž๋ฉด ๊ฒฐ๊ตญ Kafka ์„œ๋ฒ„์— ๋ฌธ์ œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Kafka DLQ Topic ์— ์ €์žฅ์„ ์‹œ๋„ํ•ด๋„ ๋˜‘๊ฐ™์ด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ–ˆ๋‹ค.

 

- ํ˜„์žฌ Redis ๋ฅผ ํ™œ์šฉํ•œ 3ํšŒ ์žฌ์‹œ๋„ ๋ฐ Discord ์•Œ๋ฆผ ์ „์†ก์„ ํ†ตํ•ด ์šด์˜์ ์ธ ์ธก๋ฉด์—์„œ ๋Œ€์‘์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค๊ณ„๋ฅผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, DLQ ๋กœ ๋ฉ”์„ธ์ง€ ์ „์†ก์€ Producer ์ธก์ด ์•„๋‹Œ ์ด๋ฏธ Kafka ๋กœ ๋ฉ”์„ธ์ง€๊ฐ€ ์ €์žฅ์ด ๋˜์—ˆ์ง€๋งŒ Consumer ์ธก์ธ ์•Œ๋ฆผ์„œ๋ฒ„์—์„œ ์ด ๋ฉ”์„ธ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜์ง€ ๋ชปํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋Œ€๋น„ํ•ด ์•Œ๋ฆผ์„œ๋ฒ„์—์„œ DLQ ๋กœ ์ „์†กํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ์„ ํƒํ•ด๋ณด์•˜๋‹ค.

(https://hanstory33.tistory.com/321)