08.ExactlyOnceSemantics(EOS)

Delivery Semantics

  • At-Most-Once Semantics(์ตœ๋Œ€ ํ•œ๋ฒˆ)

    • ํ™•์ธ ์‹œ๊ฐ„์ด ์ดˆ๊ณผ๋˜๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜ํ™˜๋  ๋•Œ Producer๊ฐ€ ์žฌ์‹œ๋„ํ•˜์ง€ ์•Š์œผ๋ฉด, ๋ฉ”์‹œ์ง€๊ฐ€ Kafka Topic์— ๊ธฐ๋ก๋˜์ง€ ์•Š์•„ Consumer ์—๊ฒŒ ์ „๋‹ฌ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ

    • ์ค‘๋ณต ๊ฐ€๋Šฅ์„ฑ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋•Œ๋•Œ๋กœ ๋ฉ”์‹œ์ง€๊ฐ€ ์ „๋‹ฌ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ์„ ํ—ˆ์šฉ

  • At-Least-Once Semantics(์ตœ์†Œ ํ•œ๋ฒˆ)

    • Producer๊ฐ€ Kafka Broker๋กœ๋ถ€ํ„ฐ ack๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  acks=all์ด๋ฉด ๋ฉ”์‹œ์ง€๊ฐ€ Kafka Topic์— ์ตœ์†Œ ํ•œ ๋ฒˆ ์ž‘์„ฑ๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•จ

    • ๊ทธ๋Ÿฌ๋‚˜ ack๊ฐ€ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋˜๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์‹ ํ•˜๋ฉด ๋ฉ”์‹œ์ง€๊ฐ€ Kafka Topic์— ๊ธฐ๋ก๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๋ฉ”์‹œ์ง€ ์ „์†ก์„ ๋‹ค์‹œ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Œ

    • Broker๊ฐ€ ack๋ฅผ ๋ณด๋‚ด๊ธฐ ์ง์ „์— ์‹คํŒจํ–ˆ์ง€๋งŒ ๋ฉ”์‹œ์ง€๊ฐ€ Kafka Topic์— ์„ฑ๊ณต์ ์œผ๋กœ ๊ธฐ๋ก๋œ ํ›„์— ์ด ์žฌ์‹œ๋„๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋ฉ”์‹œ์ง€๊ฐ€ ๋‘ ๋ฒˆ ๊ธฐ๋ก๋˜์–ด ์ตœ์ข… Consumer์—๊ฒŒ ๋‘ ๋ฒˆ ์ด์ƒ ์ „๋‹ฌ๋˜์–ด ์ค‘๋ณต ์ž‘์—…๊ณผ ๊ฐ™์€ ์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Œ

  • Exactly-Once Semantics(์ •ํ™•ํžˆ ํ•œ๋ฒˆ)

    • Producer๊ฐ€ ๋ฉ”์‹œ์ง€ ์ „์†ก์„ ๋‹ค์‹œ ์‹œ๋„ํ•˜๋”๋ผ๋„ ๋ฉ”์‹œ์ง€๊ฐ€ ์ตœ์ข… Consumer์—๊ฒŒ ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ ์ „๋‹ฌ๋จ

    • ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ ์ž์ฒด์™€ ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์†Œ๋น„ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์˜ ํ˜‘๋ ฅ์ด ๋ฐ˜๋“œ์‹œ ํ•„์š”

    • ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฉ”์‹œ์ง€๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์‚ฌ์šฉํ•œ ํ›„ Kafka Consumer๋ฅผ ์ด์ „ Offset์œผ๋กœ ๋˜๊ฐ์œผ๋ฉด ํ•ด๋‹น Offset์—์„œ ์ตœ์‹  Offset๊นŒ์ง€ ๋ชจ๋“  ๋ฉ”์‹œ์ง€๋ฅผ ๋‹ค์‹œ ์ˆ˜์‹ ํ•˜๊ฒŒ ๋จ

Exactly Once Semantics(EOS)์˜ ํ•„์š”์„ฑ

  • ์ค‘๋ณต ๋ฉ”์‹œ์ง€๋กœ ์ธํ•œ ์ค‘๋ณต ์ฒ˜๋ฆฌ ๋ฐฉ์ง€

  • ๋ฐ์ดํ„ฐ๊ฐ€ "์ •ํ™•ํžˆ ํ•œ ๋ฒˆ" ์ฒ˜๋ฆฌ๋˜๋„๋ก ๋ณด์žฅํ•ด์•ผ ํ•˜๋Š” ์‹ค์‹œ๊ฐ„ ๋ฏธ์…˜ ํฌ๋ฆฌํ‹ฐ์ปฌ ์ŠคํŠธ๋ฆฌ๋ฐ Application

    • ํด๋ผ์ด์–ธํŠธ(Idempotent Producer)์—์„œ ์ƒ์„ฑ๋˜๋Š” ์ค‘๋ณต ๋ฉ”์‹œ์ง€ ๋ฐฉ์ง€

    • Transaction ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ, ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜๋‚ด์˜ ๋ชจ๋“  ๋ฉ”์‹œ์ง€๊ฐ€ ๋ชจ๋‘ Write ๋˜์—ˆ๋Š”์ง€ ๋˜๋Š” ์ „ํ˜€ Write ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธ(Atomic Message)

  • Use Cases

    • ๊ธˆ์œต ๊ฑฐ๋ž˜ ์ฒ˜๋ฆฌ(์†ก๊ธˆ, ์นด๋“œ ๊ฒฐ์ œ ๋“ฑ)

    • ๊ณผ๊ธˆ ์ •์‚ฐ์„ ์œ„ํ•œ ๊ด‘๊ณ  ์กฐํšŒ์ˆ˜ ์ถ”์ 

    • Billing ์„œ๋น„์Šค๊ฐ„ ๋ฉ”์‹œ์ง€ ์ „์†ก

Apache Kafka 0.11.0(Confluent Platform 3.3) ์ด์ „์˜ ์†”๋ฃจ์…˜์€ โ€At-Least-Once(์ตœ์†Œ ํ•œ ๋ฒˆ)" ์„ ํ™œ์šฉํ•˜๊ณ  ์ตœ์ข… ์‚ฌ์šฉ์ž ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด Consume ํ›„ ์ค‘๋ณต ์ œ๊ฑฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Œ

Exactly Once Semantics

  • Java Client์—์„œ๋งŒ ์ง€์›

  • Java ํด๋ผ์ด์–ธํŠธ์—์„œ๋งŒ Fully Supported (AK 0.11.0 ๋ถ€ํ„ฐ)

    • Producer, Consumer

    • Kafka Connect

    • Kafka Streams API

    • Confluent REST Proxy

    • Confluent ksqlDB

  • Transaction Coordinator ์‚ฌ์šฉ

    • ํŠน๋ณ„ํ•œ Transaction Log๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” Broker Thread

    • ์ผ๋ จ์˜ ID ๋ฒˆํ˜ธ(Producer ID, Sequence Number, Transaction ID)๋ฅผ ํ• ๋‹นํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด ์ •๋ณด๋ฅผ ๋ฉ”์‹œ์ง€ Header์— ํฌํ•จํ•˜์—ฌ ๋ฉ”์‹œ์ง€๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ โ†’ ProducerID: ์ž๋™ ํ• ๋‹น, Sequence Number: Idempotent ์˜ต์…˜ ์‚ฌ์šฉ์‹œ ์ž๋™ ํ• ๋‹น โ†’ Transaction ID๋งŒ ์ง์ ‘ ๊ด€๋ฆฌ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

    • Sequence Number๋Š” Broker๊ฐ€ ์ค‘๋ณต๋œ ๋ฉ”์‹œ์ง€๋ฅผ skipํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ

Exactly Once Semantics ๊ด€๋ จ ํŒŒ๋ผ๋ฏธํ„ฐ

Idempotent Producer, Transactions

  • Idempotent Producer

    • Producer์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์ค‘ enable.idempotence ๋ฅผ true ๋กœ ์„ค์ •

    • Producer๊ฐ€ Retry(์žฌ์‹œ๋„)๋ฅผ ํ•˜๋”๋ผ๋„, ๋ฉ”์‹œ์ง€ ์ค‘๋ณต์„ ๋ฐฉ์ง€

    • ์„ฑ๋Šฅ์— ์˜ํ–ฅ์ด ๋ณ„๋กœ ์—†์Œ

  • Transaction

    • ๊ฐ Producer์— ๊ณ ์œ ํ•œ transactional.id ๋ฅผ ์„ค์ •

    • Producer๋ฅผ Transaction API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ

    • Consumer์—์„œ isolation.level ์„ read_committed ๋กœ ์„ค์ •

  • Broker์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” Transaction์„ ์œ„ํ•œ Default ๊ฐ’์ด ์ ์šฉ๋˜์–ด ์žˆ์Œ (ํ•„์š”์‹œ์—๋งŒ ์ˆ˜์ • ํ•„์š”)

Idempotent Producer ๋ฉ”์‹œ์ง€ ์ „์†ก ํ”„๋กœ์„ธ์Šค

  1. ๊ฐ Producer๋Š” ๊ณ ์œ ํ•œ Producer ID๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์‹œ์ง€ ์†ก์‹  โ†’ ๋ฉ”์‹œ์ง€๋Š” Sequence Number์™€ ๊ณ ์œ ํ•œ Producer ID๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ

  2. Broker์˜ ๋ฉ”๋ชจ๋ฆฌ์— map ์ •๋ณด๊ฐ€ ์ €์žฅ๋จ โ†’ Broker๋Š” ๋ฉ”๋ชจ๋ฆฌ์— map { Producer ID : Sequence Number }๋ฅผ ์ €์žฅํ•จ

  3. Broker๊ฐ€ ack๋ฅผ ๋ชป ๋ณด๋‚ธ ๊ฒฝ์šฐ โ†’ Broker๊ฐ€ Producer์—๊ฒŒ ack๋ฅผ ๋ณด๋‚ด์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ๋ฅผ ๊ฐ€์ •

  4. Producer๋Š” ์žฌ์‹œ๋„ ์ˆ˜ํ–‰ โ†’ Producer๋Š” ack๋ฅผ ๋ฐ›์ง€ ๋ชปํ–ˆ์œผ๋ฏ€๋กœ, ๋™์ผํ•œ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•œ ์žฌ์‹œ๋„(retries)๋ฅผ ์ˆ˜ํ–‰ enable.idempotence=true ์„ค์ •์„ ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด, Broker์˜ ๋ฉ”์‹œ์ง€ ์ค‘๋ณต ์ˆ˜์‹ ์ด ๋ถˆ๊ฐ€ํ”ผ

  5. Broker๋Š” DUP ์‘๋‹ต์„ ๋ฆฌํ„ด โ†’ Broker๊ฐ€ ์ฒดํฌํ•˜์—ฌ ๋ฉ”์‹œ์ง€๊ฐ€ ์ค‘๋ณต๋œ ๊ฒƒ์„ ํ™•์ธ ๋ฉ”์‹œ์ง€๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ณ , Producer์—๊ฒŒ DUP response๋ฅผ ๋ฆฌํ„ด

Last updated