Message Delivery Semantics

Kafka๊ฐ€ ํ”„๋กœ๋“€์„œ์—์„œ ์ปจ์Šˆ๋จธ๊นŒ์ง€ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ๋ณด์žฅํ•˜๋Š” ์‹ ๋ขฐ์„ฑ ์ˆ˜์ค€์„ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์‹œ์Šคํ…œ์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์„ฑ๋Šฅ๊ณผ ๋ฐ์ดํ„ฐ ์‹ ๋ขฐ์„ฑ ์‚ฌ์ด์˜ ๊ท ํ˜•์„ ๋งž์ถ”๋Š” ์ค‘์š”ํ•œ ์„ค์ •์ด๋‹ค.

At-most-once(์ตœ๋Œ€ ํ•œ ๋ฒˆ ์ „์†ก)

๋ฉ”์‹œ์ง€๊ฐ€ ์œ ์‹ค๋  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์ ˆ๋Œ€ ์ค‘๋ณต๋˜์ง€๋Š” ์•Š์Œ์„ ๋ณด์žฅํ•˜๋Š” ์˜๋ฏธ๋กœ, ๊ฐ€์žฅ ๋‚ฎ์€ ์‹ ๋ขฐ์„ฑ ์ˆ˜์ค€์„ ์ œ๊ณตํ•˜๋ฉฐ ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ์„ ๋ชฉํ‘œ๋กœ ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

  • Producer: acks=0 ์„ค์ •

    • send() ์š”์ฒญ ํ›„ ๋ธŒ๋กœ์ปค์˜ ์‘๋‹ต์„ ์ „ํ˜€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์•„, ๋„คํŠธ์›Œํฌ ์™•๋ณต ์‹œ๊ฐ„(RTT)์„ ์ ˆ์•ฝ

    • ๋ธŒ๋กœ์ปค ์žฅ์• , ์ผ์‹œ์ ์ธ ๋„คํŠธ์›Œํฌ ๋‹จ์ ˆ ์‹œ ๋ฉ”์‹œ์ง€ ์œ ์‹ค

  • Consumer: ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ „ ์˜คํ”„์…‹์„ ๋จผ์ € ์ปค๋ฐ‹

    • ์ž๋™ ์ปค๋ฐ‹ ์‹œ, ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด auto.commit.interval.ms๋ณด๋‹ค ๊ธธ ๊ฒฝ์šฐ, ์ฒ˜๋ฆฌ ์ „์— ์ปค๋ฐ‹์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด ์œ ์‹ค ๊ฐ€๋Šฅ

At-least-once(์ตœ์†Œ ํ•œ ๋ฒˆ ์ „์†ก)

๋ฉ”์‹œ์ง€๊ฐ€ ์ค‘๋ณต๋  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์ ˆ๋Œ€ ์œ ์‹ค๋˜์ง€๋Š” ์•Š์Œ์„ ๋ณด์žฅํ•œ๋‹ค๋Š” ์˜๋ฏธ๋กœ, ๋Œ€๋ถ€๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฑ„ํƒํ•˜๋Š” ์‹ ๋ขฐ์„ฑ ์ˆ˜์ค€์ด๋‹ค.

  • Producer: acks=all / retries > 0 ์„ค์ •

    • ํ”„๋กœ๋“€์„œ๋Š” ISR์˜ ๋ชจ๋“  ๋ธŒ๋กœ์ปค๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•˜์Œ์„ ํ™•์ธํ•  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ

    • ๋ธŒ๋กœ์ปค๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์ €์žฅํ–ˆ์ง€๋งŒ, ํ”„๋กœ๋“€์„œ์—๊ฒŒ Ack๋ฅผ ๋ณด๋‚ด๊ธฐ ์ „์— ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ๋‚˜ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ํ”„๋กœ๋“€์„œ๋Š” ํƒ€์ž„์•„์›ƒ์œผ๋กœ ์‹คํŒจ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ๋ฉ”์‹œ์ง€ ์žฌ์ „์†ก

    • ์ด ์‹œ์ ์— ๋ธŒ๋กœ์ปค์—๋Š” ๋™์ผํ•œ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‘ ๋ฒˆ ๊ธฐ๋ก๋  ์ˆ˜ ์žˆ์Œ

  • Consumer: ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ๋ฅผ ์™„๋ฃŒํ•œ ํ›„์— ์˜คํ”„์…‹์„ ์ˆ˜๋™์œผ๋กœ ์ปค๋ฐ‹

    • enable.auto.commit=false ์„ค์ •

    • poll()๋กœ ๋ฐ›์€ ๋ฉ”์‹œ์ง€ ๋ฐฐ์น˜์˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋ชจ๋‘ ๋๋‚œ ํ›„ commitSync() ๋˜๋Š” commitAsync() ํ˜ธ์ถœ

    • ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ๋Š” ์„ฑ๊ณตํ–ˆ์ง€๋งŒ, commitSync() ํ˜ธ์ถœ ์ „์— ์ปจ์Šˆ๋จธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ๋‹ค์‹œ ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ์–ด์™€ ์ด์ „์— ์ฒ˜๋ฆฌํ–ˆ๋˜ ๋ฉ”์‹œ์ง€ ์ค‘๋ณต ๋ฐœ์ƒ

    • ์ค‘๋ณต ์ฒ˜๋ฆฌ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฉฑ๋“ฑ์„ฑ์„ ๊ณ ๋ คํ•œ ์„ค๊ณ„ ํ•„์š”

์ด ์ „์†ก ๋ฐฉ์‹์€ ์ปจ์Šˆ๋จธ์˜ ๋ฉฑ๋“ฑ์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ๋ฐ, ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์˜ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ™œ์šฉ: ๋ฉ”์‹œ์ง€์˜ ๊ณ ์œ  ํ‚ค(์˜ˆ: ์ด๋ฒคํŠธ ID, ์ฃผ๋ฌธ ID)๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ Primary Key๋‚˜ Unique Key๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘๋ณต INSERT๋ฅผ ๋ฐฉ์ง€

  • ๋ฒ„์ „ ๊ด€๋ฆฌ: ๋ฐ์ดํ„ฐ์— ๋ฒ„์ „ ๋ฒˆํ˜ธ๋ฅผ ๋‘๊ณ , ํ˜„์žฌ ์ €์žฅ๋œ ๋ฒ„์ „๋ณด๋‹ค ๋‚ฎ์€ ๋ฒ„์ „์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ๋ฌด์‹œ

  • ์ƒํƒœ ์ €์žฅ์†Œ ํ™œ์šฉ: Redis๋‚˜ DB์— ์ฒ˜๋ฆฌ๋œ ๋ฉ”์‹œ์ง€ ID๋ฅผ ์ €์žฅํ•˜๊ณ , ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ „์— ID์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ๋จผ์ € ํ™•์ธํ•˜์—ฌ ์ค‘๋ณต ์‹คํ–‰ ๋ฐฉ์ง€

Exactly-once(์ •ํ™•ํžˆ ํ•œ ๋ฒˆ ์ „์†ก)

๋ฉ”์‹œ์ง€๊ฐ€ ์œ ์‹ค๋˜๊ฑฐ๋‚˜ ์ค‘๋ณต๋˜์ง€ ์•Š๊ณ , ์ •ํ™•ํžˆ ๋‹จ ํ•œ ๋ฒˆ๋งŒ ์ฒ˜๋ฆฌ๋จ์„ ๋ณด์žฅํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ์ˆ˜์ค€์˜ ์‹ ๋ขฐ์„ฑ ์ˆ˜์ค€์ด๋‹ค.

  • Producer: enable.idempotence=true / transactional.id=<UNIQUE_ID> ์„ค์ •

    • enable.idempotence=true๋กœ ์„ค์ •ํ•˜์—ฌ ๋ธŒ๋กœ์ปค๋กœ์˜ ๋ฉ”์‹œ์ง€ ์ค‘๋ณต ์ „์†ก ๋ฐฉ์ง€

    • transactional.id๋ฅผ ๊ณ ์œ ํ•˜๊ณ  ์•ˆ์ •์ ์ธ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜์„ ํ™œ์„ฑํ™”

      • ์ด๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ํ† ํ”ฝ ํŒŒํ‹ฐ์…˜์— ๊ฑธ์นœ '์ฝ๊ธฐ-์ฒ˜๋ฆฌ-์“ฐ๊ธฐ' ์ž‘์—…์„ ํ•˜๋‚˜์˜ ์›์ž์  ๋‹จ์œ„๋กœ ๋ฌถ์–ด์คŒ

  • Consumer: isolation.level=read_committed ์„ค์ •

    • ์ปจ์Šˆ๋จธ๋Š” ์ตœ์ข…์ ์œผ๋กœ ์ปค๋ฐ‹(Commit)๋œ ํŠธ๋žœ์žญ์…˜์— ํฌํ•จ๋œ ๋ฉ”์‹œ์ง€๋งŒ ์ฝ๋„๋ก ์„ค์ •

    • ๋งŒ์•ฝ ํŠธ๋žœ์žญ์…˜์ด ์ฒ˜๋ฆฌ ๋„์ค‘ ์ค‘๋‹จ(Abort)๋˜๋ฉด, ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์— ํฌํ•จ๋œ ๋ชจ๋“  ๋ฉ”์‹œ์ง€๋Š” ์ปจ์Šˆ๋จธ์—๊ฒŒ ๋…ธ์ถœ๋˜์ง€ ์•Š์•„ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ๋ณด์žฅ

์œ„ ์„ค์ •๊ณผ ํŠธ๋žœ์žญ์…˜์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ๊ฒฐํ•ฉํ•˜์—ฌ, Kafka๋Š” ํ”„๋กœ๋“€์„œ์˜ ์ตœ์ดˆ ์ „์†ก๋ถ€ํ„ฐ ์ปจ์Šˆ๋จธ์˜ ์ตœ์ข… ์ฒ˜๋ฆฌ๊นŒ์ง€ ๋ชจ๋“  ๊ณผ์ •์—์„œ ๋ฉ”์‹œ์ง€๊ฐ€ ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ๋งŒ ์ฒ˜๋ฆฌ๋˜๋„๋ก ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

Last updated

Was this helpful?