Dead Letter

RabbitMQ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ์†Œ๋น„๋˜๊ณ  ์˜ˆ์ƒ์น˜ ๋ชปํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์„ ๊ฒฝ์šฐ, ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋ฅผ ๋‹ค์‹œ ํ๋กœ ๋ณด๋‚ด๋Š” ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ์ธ Re-Queuing์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ด ๊ณผ์ •์€ ๋ฉ”์‹œ์ง€๊ฐ€ Consumer์—๊ฒŒ ์ „๋‹ฌ๋œ ํ›„, ์ปจ์Šˆ๋จธ๊ฐ€ ์ด๋ฅผ ์ฒ˜๋ฆฌํ–ˆ์Œ์„ ํ™•์ธํ•˜๋Š” acknowledgment(ACK) ๋ฉ”์‹œ์ง€๋ฅผ RabbitMQ ๋ธŒ๋กœ์ปค์— ๋ณด๋‚ด์ง€ ์•Š์„ ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ๊ณ„์† ๋™์ผํ•œ ์—๋Ÿฌ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋ฉ”์‹œ์ง€๋Š” ์†Œ๋น„๋˜๊ณ  ๋ฆฌํ์ž‰ํ•˜๋Š” ๋ฃจํ”„๋ฅผ ๋ฐ˜๋ณตํ•  ๊ฒƒ์ด๋‹ค.

Message๊ฐ€ Dead Letter๊ฐ€ ๋˜๋Š” ์กฐ๊ฑด

  1. ๋ฉ”์‹œ์ง€๊ฐ€ Queue์—์„œ ๊ฑฐ๋ถ€(Reject) ๋˜๋Š” NACK ์ƒํƒœ

    1. Re-Queue=false๋กœ ์„ค์ •๋œ Consumer๊ฐ€ reject/nack ์‘๋‹ต์„ ํ†ตํ•ด ๊ฑฐ์ ˆํ•œ ๋ฉ”์„ธ์ง€

      • Re-Queue=false ์„ค์ •์€ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฑฐ๋ถ€ํ•  ๋•Œ, ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋ฅผ ์›๋ž˜ ํ๋กœ ๋˜๋Œ๋ฆฌ์ง€ ์•Š๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ์ฆ‰, ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•œ๋‹ค.

    2. Re-Queue=true๋กœ ์„ค์ •๋œ Consumer๊ฐ€ reject/nack ์‘๋‹ต์„ ํ†ตํ•ด ๊ฑฐ์ ˆํ•œ ๋ฉ”์„ธ์ง€๋Š” ๋‹ค์‹œ ๋ฆฌํ์ž‰ ๋˜๊ธฐ ๋•Œ๋ฌธ์— DLX(Dead Letter Exchange) ๊ธฐ๋Šฅ์ด ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.

  2. Per-Message TTL์ด ๋งŒ๋ฃŒ๋œ ๊ฒฝ์šฐ

    ๋ฉ”์‹œ์ง€๊ฐ€ ํ์— ์ €์žฅ๋œ TTL์„ ์ดˆ๊ณผํ•˜๋ฉด, ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋Š” ๋งŒ๋ฃŒ๋˜์–ด ๋ฐ๋“œ ๋ ˆํ„ฐ ํ๋กœ ์ด๋™ํ•œ๋‹ค.

    • ํ์— ์„ค์ •๋œ TTL์ด ๋งŒ๋ฃŒ๋˜๋Š” ๊ฒƒ์€ ํ ์ž์ฒด๋ฅผ ์‚ญ์ œํ•˜๋ฉฐ, ๋‚จ์•„์žˆ๋Š” ๋ฉ”์‹œ์ง€๋Š” ๋ชจ๋‘ ์‚ญ์ œ๋˜๊ณ  ๋ฐ๋“œ ๋ ˆํ„ฐ๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

  3. Queue์˜ ์ตœ๋Œ€ ๊ธธ์ด ์ดˆ๊ณผ

    ํ์— ์„ค์ •๋œ ์ตœ๋Œ€ ๋ฉ”์‹œ์ง€ ์ˆ˜(max-length) ๋˜๋Š” ์ตœ๋Œ€ ๋ฐ”์ดํŠธ ์ˆ˜(max-length-bytes)๋ฅผ ์ดˆ๊ณผํ•  ๊ฒฝ์šฐ ๋ฐœ์ƒํ•œ๋‹ค. (์ตœ๋Œ€ ๊ธธ์ด๊ฐ€ 100์ด๊ณ  ํ์— 100๊ฐœ์˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์žˆ๋Š”๋ฐ ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋˜๋Š” ๊ฒฝ์šฐ)

    RabbitMQ์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐ๋“œ ๋ ˆํ„ฐ ํ(DLQ)๋กœ ์ด๋™ํ•œ๋‹ค. ์ด๋Š” x-max-length ์ •์ฑ…์„ ์‚ฌ์šฉํ•  ๋•Œ์˜ ๊ธฐ๋ณธ ๋™์ž‘์ด๋‹ค. FIFO ์›์น™์„ ๋”ฐ๋ฅธ๋‹ค.

    • RabbitMQ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ๋ฉ”์‹œ์ง€๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ƒˆ๋กœ์šด ๋ฉ”์‹œ์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ์ƒˆ๋กœ์šด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ๋“œ ๋ ˆํ„ฐ ํ๋กœ ์ „์†กํ•œ๋‹ค.

  4. Queue๊ฐ€ ๊ฐ€๋“์ฐฌ ๊ฒฝ์šฐ

    ํ๊ฐ€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ฐ€๋“ ์ฐจ์„œ ๋” ์ด์ƒ ๋ฉ”์‹œ์ง€๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ์ผ ๋•Œ, ์ƒˆ๋กœ์šด ๋ฉ”์‹œ์ง€๋Š” ๋ฐ๋“œ ๋ ˆํ„ฐ ํ๋กœ ์ „์†ก๋œ๋‹ค. ์ด ๊ฒฝ์šฐ๋Š” ์‹œ์Šคํ…œ ๋ฉ”๋ชจ๋ฆฌ๋‚˜ ๋””์Šคํฌ ์šฉ๋Ÿ‰์ด ๋ถ€์กฑํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์šฉํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์„ ์–˜๊ธฐํ•œ๋‹ค.

RabbitMQ์—์„œ ๋ฐ๋“œ ๋ ˆํ„ฐ๊ฐ€ ๋œ ๋ฉ”์‹œ์ง€์˜ ํ—ค๋”๋ฅผ ํ™•์ธํ•˜๋ฉด, ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐ๋“œ ๋ ˆํ„ฐ ํ๋กœ ์ด๋™ํ•œ ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ด ์ •๋ณด๋Š” ์ฃผ๋กœ โ€œx-deathโ€ ํ—ค๋”์— ์ €์žฅ๋˜๊ณ  ๊ด€๋ จ ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค.

โ€œx-deathโ€ Header์— ํฌํ•จ๋œ ์ฃผ์š” ์ •๋ณด

  1. reason ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐ๋“œ ๋ ˆํ„ฐ ํ๋กœ ์ด๋™ํ•œ ์ด์œ ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด, TTL ๋งŒ๋ฃŒ, Consumer์— ์˜ํ•œ Reject, ํ๊ฐ€ ๊ฐ€๋“์ฐจ ๋ฒ„๋ ค์ง„ ๊ฒฝ์šฐ ๋“ฑ์˜ ์ด์œ ๊ฐ€ ์žˆ๋‹ค.

  2. time

    ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐ๋“œ ๋ ˆํ„ฐ ํ๋กœ ์ด๋™ํ•œ ์‹œ๊ฐ„์ด๋‹ค. ๋ฉ”์‹œ์ง€์˜ ์ฒ˜๋ฆฌ ์ด๋ ฅ์„ ์ถ”์ ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜๋‹ค.

  3. count

    ๋™์ผํ•œ reason์œผ๋กœ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐ๋“œ ๋ ˆํ„ฐ ํ๋กœ ์ด๋™ํ•œ ํšŸ์ˆ˜์ด๋‹ค. ํŠน์ • ๋ฉ”์‹œ์ง€๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ์‹คํŒจํ–ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

  4. queue

    ๋ฐ๋“œ ๋ ˆํ„ฐ ํ๋กœ ์ด๋™ํ•˜๊ธฐ ์ „์— ์›๋ž˜ ํ์˜ ์ด๋ฆ„์ด๋‹ค. ๋ฉ”์‹œ์ง€์˜ ์ถœ์ฒ˜๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  5. exchange

    ๋ฐ๋“œ ๋ ˆํ„ฐ ํ๋กœ ์ด๋™ํ•˜๊ธฐ ์ „ ๋ฉ”์‹œ์ง€๋ฅผ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ฒ˜๋ฆฌํ•œ Exchange ์ด๋ฆ„์ด๋‹ค. ์—ฌ๋Ÿฌ ๋ฒˆ DLX์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋œ ๋ฉ”์‹œ์ง€์ธ ๊ฒฝ์šฐ DLX ์ •๋ณด๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ๋‹ค.

Dead Letter Exchange(DLX) ๋ž€?

RabbitMQ์˜ DLX๋Š” ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•ด์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ๋ฉ”์‹œ์ง€๋“ค์„ Routing ํ•˜๋Š” Exchange์ด๋‹ค.

DLX ์ƒ์„ฑ ๋ฐฉ๋ฒ•

DLX๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์–ด๋ ต์ง€ ์•Š๋‹ค.

  1. DLX์šฉ Exchange ์ƒ์„ฑ

  2. Dead Letter Queue ์ƒ์„ฑ

  3. Queue Argument ์„ค์ •

    ๋ฉ”์„ธ์ง€๋ฅผ ์ €์žฅํ•˜๋Š” ํ๋ฅผ ๋งŒ๋“ค ๋•Œ, Argument ๋ถ€๋ถ„์— ๊ฑฐ๋ถ€๋˜๊ฑฐ๋‚˜ ์ฒ˜๋ฆฌ๋˜์ง€ ๋ชปํ•ด ๋ฒ„๋ ค์ง„ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค. ํ ์ƒ์„ฑ ์‹œ, Key-Value ํ˜•์‹์œผ๋กœ โ€˜x-dead-letter-exchangeโ€™ ์†์„ฑ์— DLX ๊ฐ’์„ ๋ช…์‹œํ•œ๋‹ค.

    • ex) x-dead-letter-exchange : log.dlx

    ์ด๋ ‡๊ฒŒ ํ๋ฅผ ์ƒ์ƒํ•˜๊ณ  ๋‚˜๋ฉด ๋ฒ„๋ ค์ง€๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€๋˜๋Š” ๋ฉ”์„ธ์ง€๋“ค์€ dlx Exchange๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.

  4. DLQ์™€ DLX Binding

    Dead Letter Queue์™€ DLX๋ฅผ ๋ฐ”์ธ๋”ฉ ํ•ด์„œ ๋ฉ”์‹œ์ง€๊ฐ€ DLX๋กœ ์ „์†ก๋  ๋•Œ ์‚ฌ์šฉํ•  Routing Key๋ฅผ ์„ค์ •ํ•œ๋‹ค.

    DLQ์˜ Argument๋กœ โ€˜x-dead-letter-routing-key : routing keyโ€™ ์„ค์ •

์‹ค์ œ DLQ๋ฅผ ํ™•์ธํ•ด ๋ณด๋ฉด, ์™ผ์ชฝ ์ƒ๋‹จ Exchange์—๋Š” DLX ์ด๋ฆ„๊ณผ Routing key๊ฐ€ ๋ช…์‹œ๋˜์–ด ์žˆ๊ณ  ํ•ด๋‹น ๋ฉ”์‹œ์ง€์˜ delivery_mode, ์ด๋ ฅ, ์‹คํŒจ ์‚ฌ์œ  ๋“ฑ์ด ๋‚˜ํƒ€๋‚˜ ์žˆ๋‹ค.

Last updated