Exactly Once Semantics

Apache Kafka๋Š” ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์œ„ํ•œ ๋ถ„์‚ฐ ํ”Œ๋žซํผ์œผ๋กœ, ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์™€ ๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ์ œ๊ณตํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ์ดํ„ฐ์˜ ์‹ ๋ขฐ์„ฑ๊ณผ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฉ”์‹œ์ง€ ์ „์†ก ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์ˆ˜์ ์ด๋‹ค. ๋ฉ”์‹œ์ง€์˜ ์ „๋‹ฌ ๋ณด์žฅ ์ˆ˜์ค€์€ ์‹œ์Šคํ…œ์˜ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, Kafka๋Š” ์ด๋ฅผ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๋ฉ”์‹œ์ง€ ์ „์†ก ์˜ต์…˜์„ ์ œ๊ณตํ•œ๋‹ค.

์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” Kafka์˜ ๋ฉ”์‹œ์ง€ ์ „์†ก ์˜ต์…˜์˜ ์ข…๋ฅ˜์™€ ๊ทธ ๋™์ž‘ ์›๋ฆฌ์— ๋Œ€ํ•ด ๊ธฐ์ˆ ์ ์œผ๋กœ ์ƒ์„ธํžˆ ์„ค๋ช…ํ•œ๋‹ค.

๋ฉ”์‹œ์ง€ ์ „์†ก ์˜ต์…˜ ์ข…๋ฅ˜

Kafka์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์‹œ์ง€ ์ „์†ก ์˜ต์…˜์€ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ๋ณด์žฅ ์ˆ˜์ค€์— ๋”ฐ๋ผ ๋‹ค์Œ ์„ธ ๊ฐ€์ง€๋กœ ๋ถ„๋ฅ˜๋œ๋‹ค:

  1. At Most Once (์ตœ๋Œ€ 1ํšŒ ์ „์†ก)

  2. At Least Once (์ตœ์†Œ 1ํšŒ ์ „์†ก)

  3. Exactly Once (์ •ํ™•ํžˆ 1ํšŒ ์ „์†ก)

๊ฐ ์˜ต์…˜์€ ๋ฉ”์‹œ์ง€ ์†์‹ค ํ—ˆ์šฉ ์—ฌ๋ถ€์™€ ์ค‘๋ณต ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ์„ฑ์— ๋”ฐ๋ผ ๊ตฌ๋ถ„๋˜๋ฉฐ, ์‹œ์Šคํ…œ์˜ ์‹ ๋ขฐ์„ฑ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋งž๊ฒŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.

At Most Once (์ตœ๋Œ€ 1ํšŒ ์ „์†ก)

๋™์ž‘ ์›๋ฆฌ

At Most Once ์ „์†ก ๋ฐฉ์‹์€ ๋ฉ”์‹œ์ง€๊ฐ€ ํ”„๋กœ๋“€์„œ์—์„œ ๋ธŒ๋กœ์ปค๋กœ ์ตœ๋Œ€ ํ•œ ๋ฒˆ ์ „์†ก๋˜๊ณ , ์ปจ์Šˆ๋จธ์—๊ฒŒ ์ตœ๋Œ€ ํ•œ ๋ฒˆ ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด ๋ฐฉ์‹์—์„œ๋Š” ๋ฉ”์‹œ์ง€ ์†์‹ค ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์ง€๋งŒ, ์ค‘๋ณต ๋ฉ”์‹œ์ง€๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

ํ”„๋กœ๋“€์„œ ์ธก ๋™์ž‘

  • ์ „์†ก ํ›„ ํ™•์ธ ์—†์Œ: ํ”„๋กœ๋“€์„œ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ธŒ๋กœ์ปค์— ์ „์†กํ•œ ํ›„, ์ „์†ก ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š๊ณ  ๋‹ค์Œ ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

  • ์žฌ์‹œ๋„ ์—†์Œ: ๋ฉ”์‹œ์ง€ ์ „์†ก ์‹คํŒจ ์‹œ ์žฌ์‹œ๋„๋ฅผ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ์„ค์ • ์˜ต์…˜:

    • acks=0: ๋ธŒ๋กœ์ปค๋กœ๋ถ€ํ„ฐ ACK(ํ™•์ธ ์‘๋‹ต)๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.

    • retries=0: ์ „์†ก ์‹คํŒจ ์‹œ ์žฌ์‹œ๋„ํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ์ปจ์Šˆ๋จธ ์ธก ๋™์ž‘

    • ์ž๋™ ์ปค๋ฐ‹ ์‚ฌ์šฉ: ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜๋ฉด ์ฆ‰์‹œ ์˜คํ”„์…‹(offset)์„ ์ปค๋ฐ‹(commit)ํ•œ๋‹ค.

    • ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ์ „ ์ปค๋ฐ‹: ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ์ „์— ์˜คํ”„์…‹์„ ์ปค๋ฐ‹ํ•˜๋ฏ€๋กœ, ์ฒ˜๋ฆฌ ์ค‘ ์žฅ์•  ๋ฐœ์ƒ ์‹œ ๋ฉ”์‹œ์ง€ ์†์‹ค์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ์„ค์ • ์˜ต์…˜:

      • enable.auto.commit=true: ์ž๋™ ์˜คํ”„์…‹ ์ปค๋ฐ‹์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

์žฅ๋‹จ์  ๋ฐ ์ ์šฉ ์‚ฌ๋ก€

  • ์žฅ์ :

    • ๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰๊ณผ ๋‚ฎ์€ ์ง€์—ฐ ์‹œ๊ฐ„.

    • ๋ฉ”์‹œ์ง€ ์ค‘๋ณต์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ.

  • ๋‹จ์ :

    • ๋ฉ”์‹œ์ง€ ์†์‹ค ๊ฐ€๋Šฅ์„ฑ ์กด์žฌ.

    • ๋ฉ”์‹œ์ง€์˜ ์‹ ๋ขฐ์„ฑ์ด ๋‚ฎ์Œ.

  • ์ ์šฉ ์‚ฌ๋ก€:

    • ๋ฐ์ดํ„ฐ ์†์‹ค์ด ์‹œ์Šคํ…œ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ.

    • ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ์ดํ„ฐ, ๋กœ๊ทธ ์ˆ˜์ง‘ ๋“ฑ.

At Least Once (์ตœ์†Œ 1ํšŒ ์ „์†ก)

๋™์ž‘ ์›๋ฆฌ

At Least Once ์ „์†ก ๋ฐฉ์‹์€ ๋ฉ”์‹œ์ง€๊ฐ€ ํ”„๋กœ๋“€์„œ์—์„œ ๋ธŒ๋กœ์ปค๋กœ ์ตœ์†Œ ํ•œ ๋ฒˆ ์ „์†ก๋˜๊ณ , ์ปจ์Šˆ๋จธ์—๊ฒŒ ์ตœ์†Œ ํ•œ ๋ฒˆ ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด ๋ฐฉ์‹์—์„œ๋Š” ๋ฉ”์‹œ์ง€ ์†์‹ค์€ ๋ฐฉ์ง€ํ•˜์ง€๋งŒ, ๋ฉ”์‹œ์ง€ ์ค‘๋ณต์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ํ”„๋กœ๋“€์„œ ์ธก ๋™์ž‘

    • ์ „์†ก ํ›„ ํ™•์ธ: ๋ฉ”์‹œ์ง€๋ฅผ ๋ธŒ๋กœ์ปค์— ์ „์†กํ•œ ํ›„, ๋ธŒ๋กœ์ปค๋กœ๋ถ€ํ„ฐ์˜ ACK๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.

    • ์žฌ์‹œ๋„ ์ „๋žต: ์ „์†ก ์‹คํŒจ ์‹œ, ์„ค์ •๋œ ์žฌ์‹œ๋„ ํšŸ์ˆ˜๋งŒํผ ๋ฉ”์‹œ์ง€๋ฅผ ์žฌ์ „์†กํ•œ๋‹ค.

    • ์„ค์ • ์˜ต์…˜:

      • acks=all ๋˜๋Š” acks=-1: ๋ชจ๋“  ISR(In-Sync Replica) ๋ธŒ๋กœ์ปค๋กœ๋ถ€ํ„ฐ์˜ ACK๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.

      • retries ๊ฐ’ ์„ค์ •: ์ „์†ก ์‹คํŒจ ์‹œ ์žฌ์‹œ๋„ ํšŸ์ˆ˜๋ฅผ ์ง€์ •ํ•œ๋‹ค.

      • enable.idempotence=false(๊ธฐ๋ณธ๊ฐ’): ๋ฉฑ๋“ฑ์„ฑ ํ”„๋กœ๋“€์„œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ์ปจ์Šˆ๋จธ ์ธก ๋™์ž‘

    • ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ํ›„ ์ปค๋ฐ‹: ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•œ ํ›„์— ์˜คํ”„์…‹์„ ์ปค๋ฐ‹ํ•œ๋‹ค.

    • ์ˆ˜๋™ ์ปค๋ฐ‹ ์‚ฌ์šฉ: ์ž๋™ ์ปค๋ฐ‹์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์—์„œ ์ˆ˜๋™์œผ๋กœ ์˜คํ”„์…‹์„ ์ปค๋ฐ‹ํ•œ๋‹ค.

    • ์„ค์ • ์˜ต์…˜:

      • enable.auto.commit=false: ์ž๋™ ์˜คํ”„์…‹ ์ปค๋ฐ‹์„ ๋น„ํ™œ์„ฑํ™”ํ•œ๋‹ค.

      • auto.offset.reset=earliest ๋˜๋Š” latest: ์ปจ์Šˆ๋จธ ๊ทธ๋ฃน์˜ ์˜คํ”„์…‹์ด ์—†์„ ๊ฒฝ์šฐ์˜ ๋™์ž‘์„ ์ง€์ •ํ•œ๋‹ค.

์žฅ๋‹จ์  ๋ฐ ์ ์šฉ ์‚ฌ๋ก€

  • ์žฅ์ :

    • ๋ฉ”์‹œ์ง€ ์†์‹ค์„ ๋ฐฉ์ง€ํ•œ๋‹ค.

    • ๋ฉ”์‹œ์ง€์˜ ์‹ ๋ขฐ์„ฑ์ด ๋†’๋‹ค.

  • ๋‹จ์ :

    • ๋ฉ”์‹œ์ง€ ์ค‘๋ณต ๊ฐ€๋Šฅ์„ฑ ์กด์žฌ.

    • ์ปจ์Šˆ๋จธ ์ธก์—์„œ ์ค‘๋ณต ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ถ”๊ฐ€ ๋กœ์ง ํ•„์š”.

  • ์ ์šฉ ์‚ฌ๋ก€:

    • ๋ฐ์ดํ„ฐ ์†์‹ค์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ์‹œ์Šคํ…œ.

    • ์ค‘๋ณต ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋กœ๊ทธ ์ˆ˜์ง‘, ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋“ฑ.

์ค‘๋ณต ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ์ „๋žต

  • ์•„์ด๋“คํฌํ…ํŠธ(Idempotent) ์ฒ˜๋ฆฌ: ๋™์ผํ•œ ๋ฉ”์‹œ์ง€๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ์ฒ˜๋ฆฌ๋˜๋”๋ผ๋„ ๊ฒฐ๊ณผ๊ฐ€ ๋™์ผํ•˜๋„๋ก ์„ค๊ณ„ํ•œ๋‹ค.

  • ์ค‘๋ณต ๊ฒ€์ถœ ๋กœ์ง ๊ตฌํ˜„:

    • ๋ฉ”์‹œ์ง€ ํ‚ค ๋˜๋Š” ๋ฉ”์‹œ์ง€์˜ ๊ณ ์œ  ์‹๋ณ„์ž๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ค‘๋ณต ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•œ๋‹ค.

    • ์™ธ๋ถ€ ์ €์žฅ์†Œ(์˜ˆ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์บ์‹œ)์— ์ฒ˜๋ฆฌ๋œ ๋ฉ”์‹œ์ง€์˜ ์‹๋ณ„์ž๋ฅผ ์ €์žฅํ•˜๊ณ  ๋น„๊ตํ•œ๋‹ค.

Exactly Once (์ •ํ™•ํžˆ 1ํšŒ ์ „์†ก)

๋™์ž‘ ์›๋ฆฌ

Exactly Once ์ „์†ก ๋ฐฉ์‹์€ ๋ฉ”์‹œ์ง€๊ฐ€ ํ”„๋กœ๋“€์„œ์—์„œ ๋ธŒ๋กœ์ปค๋กœ ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ ์ „์†ก๋˜๊ณ , ์ปจ์Šˆ๋จธ์—๊ฒŒ๋„ ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. Kafka๋Š” **๋ฉฑ๋“ฑ์„ฑ ํ”„๋กœ๋“€์„œ(Idempotent Producer)**์™€ ํŠธ๋žœ์žญ์…˜(Transactions) ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค.

  • ํ”„๋กœ๋“€์„œ ์ธก ๋™์ž‘

    • ๋ฉฑ๋“ฑ์„ฑ ํ”„๋กœ๋“€์„œ ํ™œ์„ฑํ™”:

      • ์„ค์ • ์˜ต์…˜:

        • enable.idempotence=true: ๋ฉฑ๋“ฑ์„ฑ ํ”„๋กœ๋“€์„œ๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

      • ๋™์ž‘ ์›๋ฆฌ:

        • ํ”„๋กœ๋“€์„œ๋Š” ๋ธŒ๋กœ์ปค๋กœ๋ถ€ํ„ฐ ๊ณ ์œ ํ•œ **ํ”„๋กœ๋“€์„œ ID(PID)**๋ฅผ ํ• ๋‹น๋ฐ›๋Š”๋‹ค.

        • ๊ฐ ํŒŒํ‹ฐ์…˜๋ณ„๋กœ ์‹œํ€€์Šค ๋ฒˆํ˜ธ๋ฅผ ๊ด€๋ฆฌํ•˜์—ฌ ๋ฉ”์‹œ์ง€์— ๋ถ€์—ฌํ•œ๋‹ค.

        • ๋ธŒ๋กœ์ปค๋Š” PID์™€ ์‹œํ€€์Šค ๋ฒˆํ˜ธ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ค‘๋ณต๋œ ๋ฉ”์‹œ์ง€๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ํ๊ธฐํ•œ๋‹ค.

    • ํŠธ๋žœ์žญ์…˜ ์‚ฌ์šฉ:

      • ์„ค์ • ์˜ต์…˜:

        • transactional.id๋ฅผ ๊ณ ์œ ํ•œ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

      • ๋™์ž‘ ๋ฉ”์„œ๋“œ:

        • initTransactions(): ํŠธ๋žœ์žญ์…˜ ์ดˆ๊ธฐํ™”.

        • beginTransaction(): ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘.

        • send(): ๋ฉ”์‹œ์ง€ ์ „์†ก.

        • sendOffsetsToTransaction(): ์ปจ์Šˆ๋จธ ์˜คํ”„์…‹์„ ํŠธ๋žœ์žญ์…˜์— ํฌํ•จ์‹œํ‚ด.

        • commitTransaction(): ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹.

        • abortTransaction(): ํŠธ๋žœ์žญ์…˜ ์ค‘๋‹จ.

  • ์ปจ์Šˆ๋จธ ์ธก ๋™์ž‘

    • ํŠธ๋žœ์žญ์…˜ ๋ฉ”์‹œ์ง€ ์†Œ๋น„:

      • ์„ค์ • ์˜ต์…˜:

        • isolation.level=read_committed: ์ปค๋ฐ‹๋œ ํŠธ๋žœ์žญ์…˜์˜ ๋ฉ”์‹œ์ง€๋งŒ ์†Œ๋น„ํ•œ๋‹ค.

      • ๋™์ž‘ ์›๋ฆฌ:

        • ๋ฏธ์™„๋ฃŒ ๋˜๋Š” ์ค‘๋‹จ๋œ ํŠธ๋žœ์žญ์…˜์˜ ๋ฉ”์‹œ์ง€๋Š” ์†Œ๋น„ํ•˜์ง€ ์•Š๋Š”๋‹ค.

    • ์˜คํ”„์…‹ ์ปค๋ฐ‹์˜ ์›์ž์„ฑ ํ™•๋ณด:

      • ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ์™€ ์˜คํ”„์…‹ ์ปค๋ฐ‹์„ ํ”„๋กœ๋“€์„œ์˜ ํŠธ๋žœ์žญ์…˜์— ํฌํ•จ์‹œ์ผœ ์›์ž์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

      • sendOffsetsToTransaction() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจ์Šˆ๋จธ์˜ ์˜คํ”„์…‹ ์ •๋ณด๋ฅผ ํ”„๋กœ๋“€์„œ์˜ ํŠธ๋žœ์žญ์…˜์— ํฌํ•จ์‹œํ‚จ๋‹ค.

  • ๋ธŒ๋กœ์ปค ์ธก ๋™์ž‘

    • ํŠธ๋žœ์žญ์…˜ ์ฝ”๋””๋„ค์ดํ„ฐ(Transaction Coordinator):

      • ํ”„๋กœ๋“€์„œ์˜ transactional.id๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํŠธ๋žœ์žญ์…˜ ์ฝ”๋””๋„ค์ดํ„ฐ๊ฐ€ ์ง€์ •๋œ๋‹ค.

      • ํŠธ๋žœ์žญ์…˜ ์ƒํƒœ(PENDING, COMMITTED, ABORTED)๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

    • ํŠธ๋žœ์žญ์…˜ ์ƒํƒœ ์ €์žฅ:

      • ๋‚ด๋ถ€ ํ† ํ”ฝ __transaction_state์— ํŠธ๋žœ์žญ์…˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค.

      • ์žฅ์•  ๋ณต๊ตฌ ์‹œ ํŠธ๋žœ์žญ์…˜ ์ƒํƒœ๋ฅผ ๋ณต์›ํ•œ๋‹ค.

์žฅ๋‹จ์  ๋ฐ ์ ์šฉ ์‚ฌ๋ก€

  • ์žฅ์ :

    • ๋ฉ”์‹œ์ง€ ์†์‹ค๊ณผ ์ค‘๋ณต ์—†์ด ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ๋งŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์ฒ˜๋ฆฌํ•œ๋‹ค.

    • ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ๊ณผ ์‹ ๋ขฐ์„ฑ์ด ๋งค์šฐ ๋†’๋‹ค.

  • ๋‹จ์ :

    • ์„ค์ • ๋ฐ ๊ตฌํ˜„์˜ ๋ณต์žก์„ฑ ์ฆ๊ฐ€.

    • ์ถ”๊ฐ€์ ์ธ ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ.

    • ์ผ๋ถ€ ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ์˜ ์—ฐ๊ณ„ ์‹œ ์ถ”๊ฐ€์ ์ธ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ํ•„์š”.

  • ์ ์šฉ ์‚ฌ๋ก€:

    • ๋ฐ์ดํ„ฐ์˜ ์ •ํ™•์„ฑ๊ณผ ์ผ๊ด€์„ฑ์ด ํ•„์ˆ˜์ ์ธ ๊ธˆ์œต ๊ฑฐ๋ž˜, ์ฃผ๋ฌธ ์ฒ˜๋ฆฌ ์‹œ์Šคํ…œ ๋“ฑ.

    • ๋ฉ”์‹œ์ง€ ์ค‘๋ณต์ด๋‚˜ ์†์‹ค์ด ๋น„์ฆˆ๋‹ˆ์Šค์— ์น˜๋ช…์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒฝ์šฐ.

Exactly Once Semantics์˜ ๋‚ด๋ถ€ ๋ฉ”์ปค๋‹ˆ์ฆ˜

  • ํ”„๋กœ๋“€์„œ ID์™€ ์‹œํ€€์Šค ๋ฒˆํ˜ธ ๊ด€๋ฆฌ

    • ํ”„๋กœ๋“€์„œ๋Š” ๊ฐ ํŒŒํ‹ฐ์…˜๋ณ„๋กœ ์‹œํ€€์Šค ๋ฒˆํ˜ธ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

    • ๋ธŒ๋กœ์ปค๋Š” ์ˆ˜์‹ ํ•œ ๋ฉ”์‹œ์ง€์˜ PID์™€ ์‹œํ€€์Šค ๋ฒˆํ˜ธ๋ฅผ ๊ฒ€์‚ฌํ•˜์—ฌ ์ค‘๋ณต ๋ฉ”์‹œ์ง€๋ฅผ ์‹๋ณ„ํ•œ๋‹ค.

  • ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ํ๋ฆ„

    1. ํŠธ๋žœ์žญ์…˜ ์ดˆ๊ธฐํ™”: initTransactions()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜์„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  PID๋ฅผ ํ• ๋‹น๋ฐ›๋Š”๋‹ค.

    2. ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘: beginTransaction()์„ ํ˜ธ์ถœํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•œ๋‹ค.

    3. ๋ฉ”์‹œ์ง€ ์ „์†ก: ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•œ๋‹ค.

    4. ์˜คํ”„์…‹ ์ „์†ก: sendOffsetsToTransaction()์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปจ์Šˆ๋จธ ์˜คํ”„์…‹์„ ํŠธ๋žœ์žญ์…˜์— ํฌํ•จ์‹œํ‚จ๋‹ค.

    5. ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹: commitTransaction()์„ ํ˜ธ์ถœํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•œ๋‹ค.

    6. ํŠธ๋žœ์žญ์…˜ ์ค‘๋‹จ: ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ abortTransaction()์„ ํ˜ธ์ถœํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜์„ ์ค‘๋‹จํ•œ๋‹ค.

  • ์ปจ์Šˆ๋จธ์˜ ํŠธ๋žœ์žญ์…˜ ๋ฉ”์‹œ์ง€ ์†Œ๋น„

    • isolation.level=read_committed ์„ค์ • ์‹œ, ์ปจ์Šˆ๋จธ๋Š” ์ปค๋ฐ‹๋œ ๋ฉ”์‹œ์ง€๋งŒ ์†Œ๋น„ํ•œ๋‹ค.

    • ํŠธ๋žœ์žญ์…˜ ์ค‘๋‹จ ์‹œ ๋ฉ”์‹œ์ง€๋Š” ์ž๋™์œผ๋กœ ํ๊ธฐ๋˜๋ฉฐ, ์ปจ์Šˆ๋จธ์—๊ฒŒ ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค.

Exactly Once ๊ตฌํ˜„ ์‹œ ์ฃผ์˜ ์‚ฌํ•ญ

  • ํ”„๋กœ๋“€์„œ ์„ค์ •

    • enable.idempotence=true ๋ฐ˜๋“œ์‹œ ์„ค์ •.

    • transactional.id๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ์„ค์ •ํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

    • acks=all๋กœ ์„ค์ •ํ•˜์—ฌ ๋ชจ๋“  ๋ณต์ œ ๋ธŒ๋กœ์ปค๋กœ๋ถ€ํ„ฐ์˜ ACK๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.

    • max.in.flight.requests.per.connection=5 ์ดํ•˜๋กœ ์„ค์ •ํ•˜์—ฌ ๋ฉ”์‹œ์ง€ ์ˆœ์„œ ๋ณด์žฅ.

  • ์ปจ์Šˆ๋จธ ์„ค์ •

    • enable.auto.commit=false๋กœ ์„ค์ •ํ•˜์—ฌ ์ˆ˜๋™ ์˜คํ”„์…‹ ์ปค๋ฐ‹ ์‚ฌ์šฉ.

    • isolation.level=read_committed๋กœ ์„ค์ •ํ•˜์—ฌ ์ปค๋ฐ‹๋œ ๋ฉ”์‹œ์ง€๋งŒ ์†Œ๋น„.

  • ์„ฑ๋Šฅ ๊ณ ๋ ค์‚ฌํ•ญ

    • ํŠธ๋žœ์žญ์…˜ ์‚ฌ์šฉ์œผ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๊ฐ์•ˆํ•˜์—ฌ ์‹œ์Šคํ…œ ์„ค๊ณ„.

    • ํŠธ๋žœ์žญ์…˜ ์ง€์† ์‹œ๊ฐ„(transaction.timeout.ms)์„ ์ ์ ˆํžˆ ์„ค์ •ํ•˜์—ฌ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„ ๋ฐฉ์ง€.

  • ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ์˜ ํŠธ๋žœ์žญ์…˜ ์ผ๊ด€์„ฑ

    • Kafka ์™ธ๋ถ€์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ์‹œ์Šคํ…œ๊ณผ์˜ ํŠธ๋žœ์žญ์…˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€์ ์ธ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

    • ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜(XA ํŠธ๋žœ์žญ์…˜)์ด๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ์˜ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๊ตฌํ˜„.


Kafka์˜ ๋ฉ”์‹œ์ง€ ์ „์†ก ์˜ต์…˜์€ ๋ฉ”์‹œ์ง€ ์†์‹ค ํ—ˆ์šฉ ์—ฌ๋ถ€์™€ ์ค‘๋ณต ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ์„ฑ์— ๋”ฐ๋ผ At Most Once, At Least Once, Exactly Once ์„ธ ๊ฐ€์ง€๋กœ ๊ตฌ๋ถ„๋œ๋‹ค. ๊ฐ ์˜ต์…˜์€ ์‹œ์Šคํ…œ์˜ ์š”๊ตฌ ์‚ฌํ•ญ๊ณผ ๋ฐ์ดํ„ฐ ์‹ ๋ขฐ์„ฑ ์ˆ˜์ค€์— ๋”ฐ๋ผ ์ ์ ˆํžˆ ์„ ํƒ๋˜์–ด์•ผ ํ•œ๋‹ค.

  • At Most Once: ๋ฉ”์‹œ์ง€ ์†์‹ค์ด ํ—ˆ์šฉ๋˜์ง€๋งŒ ์ค‘๋ณต ๋ฉ”์‹œ์ง€๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ.

  • At Least Once: ๋ฉ”์‹œ์ง€ ์†์‹ค์€ ๋ฐฉ์ง€ํ•˜์ง€๋งŒ ์ค‘๋ณต ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ.

  • Exactly Once: ๋ฉ”์‹œ์ง€ ์†์‹ค๊ณผ ์ค‘๋ณต ์—†์ด ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ๋งŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์ฒ˜๋ฆฌํ•จ.

๊ฐ ์ „์†ก ์˜ต์…˜์˜ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ๊นŠ์ด ์žˆ๊ฒŒ ์ดํ•ดํ•˜๊ณ , ์ ์ ˆํ•œ ์„ค์ •๊ณผ ๊ตฌํ˜„์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์˜ ์‹ ๋ขฐ์„ฑ๊ณผ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ Exactly Once ์ „์†ก ๋ฐฉ์‹์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ๋ฉฑ๋“ฑ์„ฑ ํ”„๋กœ๋“€์„œ์™€ ํŠธ๋žœ์žญ์…˜ ๊ธฐ๋Šฅ์„ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๊ณ  ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค.

Last updated