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 ๋ฉ์์ง ์ ์ก ํ๋ก์ธ์ค
๊ฐ Producer๋ ๊ณ ์ ํ Producer ID๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์์ง ์ก์ โ ๋ฉ์์ง๋ Sequence Number์ ๊ณ ์ ํ Producer ID๋ฅผ ๊ฐ์ง๊ณ ์์
Broker์ ๋ฉ๋ชจ๋ฆฌ์ map ์ ๋ณด๊ฐ ์ ์ฅ๋จ โ Broker๋ ๋ฉ๋ชจ๋ฆฌ์ map { Producer ID : Sequence Number }๋ฅผ ์ ์ฅํจ
Broker๊ฐ ack๋ฅผ ๋ชป ๋ณด๋ธ ๊ฒฝ์ฐ โ Broker๊ฐ Producer์๊ฒ ack๋ฅผ ๋ณด๋ด์ง ๋ชปํ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์
Producer๋ ์ฌ์๋ ์ํ โ Producer๋ ack๋ฅผ ๋ฐ์ง ๋ชปํ์ผ๋ฏ๋ก, ๋์ผํ ๋ฉ์์ง์ ๋ํ ์ฌ์๋(retries)๋ฅผ ์ํ enable.idempotence=true ์ค์ ์ ํ์ง ์์๋ค๋ฉด, Broker์ ๋ฉ์์ง ์ค๋ณต ์์ ์ด ๋ถ๊ฐํผ
Broker๋ DUP ์๋ต์ ๋ฆฌํด โ Broker๊ฐ ์ฒดํฌํ์ฌ ๋ฉ์์ง๊ฐ ์ค๋ณต๋ ๊ฒ์ ํ์ธ ๋ฉ์์ง๋ฅผ ์ ์ฅํ์ง ์๊ณ , Producer์๊ฒ DUP response๋ฅผ ๋ฆฌํด
Last updated