Exactly Once Semantics
Apache Kafka๋ ๋์ฉ๋ ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ์ ์ํ ๋ถ์ฐ ํ๋ซํผ์ผ๋ก, ์ค์๊ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๋์ ์ฒ๋ฆฌ๋์ ์ ๊ณตํ๋ค. ๊ทธ๋ฌ๋ ๋ฐ์ดํฐ์ ์ ๋ขฐ์ฑ๊ณผ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด์๋ ๋ฉ์์ง ์ ์ก ๋ฐฉ์์ ๋ํ ์ดํด๊ฐ ํ์์ ์ด๋ค. ๋ฉ์์ง์ ์ ๋ฌ ๋ณด์ฅ ์์ค์ ์์คํ ์ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ผ๋ฉฐ, Kafka๋ ์ด๋ฅผ ์ํด ๋ค์ํ ๋ฉ์์ง ์ ์ก ์ต์ ์ ์ ๊ณตํ๋ค.
์ด๋ฒ ํฌ์คํธ์์๋ Kafka์ ๋ฉ์์ง ์ ์ก ์ต์ ์ ์ข ๋ฅ์ ๊ทธ ๋์ ์๋ฆฌ์ ๋ํด ๊ธฐ์ ์ ์ผ๋ก ์์ธํ ์ค๋ช ํ๋ค.
๋ฉ์์ง ์ ์ก ์ต์
์ข
๋ฅ
Kafka์์ ์ ๊ณตํ๋ ๋ฉ์์ง ์ ์ก ์ต์ ์ ๋ฉ์์ง ์ ๋ฌ ๋ณด์ฅ ์์ค์ ๋ฐ๋ผ ๋ค์ ์ธ ๊ฐ์ง๋ก ๋ถ๋ฅ๋๋ค:
At Most Once (์ต๋ 1ํ ์ ์ก)
At Least Once (์ต์ 1ํ ์ ์ก)
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์ ์ํ์ค ๋ฒํธ๋ฅผ ๊ฒ์ฌํ์ฌ ์ค๋ณต ๋ฉ์์ง๋ฅผ ์๋ณํ๋ค.
ํธ๋์ญ์ ์ฒ๋ฆฌ ํ๋ฆ
ํธ๋์ญ์ ์ด๊ธฐํ:
initTransactions()
๋ฅผ ํธ์ถํ์ฌ ํธ๋์ญ์ ์ ์ด๊ธฐํํ๊ณ PID๋ฅผ ํ ๋น๋ฐ๋๋ค.ํธ๋์ญ์ ์์:
beginTransaction()
์ ํธ์ถํ์ฌ ํธ๋์ญ์ ์ ์์ํ๋ค.๋ฉ์์ง ์ ์ก: ํธ๋์ญ์ ๋ด์์ ์ฌ๋ฌ ๋ฉ์์ง๋ฅผ ์ ์กํ๋ค.
์คํ์ ์ ์ก:
sendOffsetsToTransaction()
์ ์ฌ์ฉํ์ฌ ์ปจ์๋จธ ์คํ์ ์ ํธ๋์ญ์ ์ ํฌํจ์ํจ๋ค.ํธ๋์ญ์ ์ปค๋ฐ:
commitTransaction()
์ ํธ์ถํ์ฌ ํธ๋์ญ์ ์ ์ปค๋ฐํ๋ค.ํธ๋์ญ์ ์ค๋จ: ์ค๋ฅ ๋ฐ์ ์
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