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?