๐ ์ํ์น ์นดํ์นด Exactly-once ์ฒ๋ฆฌ์ ์ง์ค๊ณผ ๊ฑฐ์ง
'์ํ์น ์นดํ์นด ์ ํ๋ฆฌ์ผ์ด์ ํ๋ก๊ทธ๋๋ฐ with ์๋ฐ' ์ฑ ์ ์ ์์ด์ ๊ฐ๋ฐ ์ ํ๋ฒ์ด์ ๋ฐ๋ธ์์๋๊ป์ ๊ฐ์ธ ๋ธ๋ก๊ทธ์ ์ํ์น ์นดํ์นด์ Exactly-once ์ฒ๋ฆฌ์ ๋ํด ์ ๋ฆฌํด์ฃผ์ ์ ๊ณต์ ๋๋ฆฝ๋๋ค. ์ํ์น ์นดํ์นด์ ๊ฐ์ ๋ถ์ฐ ์ด๋ฒคํธ ์คํธ๋ฆฌ๋ฐ ํ๋ซํผ์ ์ฌ์ฉํ๊ฑฐ๋ ๋ฉ์์ง ๋ธ๋ก์ปค๋ฅผ ํ์ฉํ๋ค ๋ณด๋ฉด ํญ์ ๋ง์ฃผ์น๋ ๋ฌธ์ ๋ก ๋ฉ์์ง ์ ๋ฌ ์๋ฉํฑ(message delivery semantic)์ด ์๋๋ฐ์, ๋ฉ์์ง ์ ๋ฌ ์๋ฉํฑ์ A์ง์ ์์ B์ง์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๋ ์ด๋ ๋งํผ์ ์ ๋ขฐ๋๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋์ง์ ๋ํ ์ ์์ ๋๋ค. ๋ฉ์์ง ์ ๋ฌ ์๋ฉํฑ์ ๋ค์๊ณผ ๊ฐ์ด ํฌ๊ฒ ์ธ๊ฐ์ง๋ก ๋๋ฉ๋๋ค. ๐ ์ ์ด๋ ํ๋ฒ(at least once) : ๋ฐ์ดํฐ๊ฐ ์ ๋ฌ๋ ๋ ์ ์ค์ด ๋ฐ์ํ์ง๋ ์์ง๋ง ์ค๋ณต์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์์์ ๋ปํ๋ฉฐ ์ํ์น ์นดํ์นด๋ ๊ธฐ๋ณธ ์ต์ ์ผ๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ '์ ์ด๋ ํ๋ฒ'์ ๋ณด์ฅํฉ๋๋ค. ๐ ๋ง์๋ ํ๋ฒ(at most once) : ์ต๋ ํ๋ฒ์ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ณ ์ผ๋ถ ๋ฐ์ดํฐ๋ ์ ์ค๋ ์ ์์์ ๋ปํฉ๋๋ค. ๐ ์ ํํ ํ๋ฒ(exactly once) : A์์ B๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ๋ ์ด๋ ํ ๊ฒฝ์ฐ์์๋ ์ ์ค์ด๋ ์ค๋ณต์ด ๋ฐ์ํ์ง ์๋ ๊ฒ์ ๋ปํฉ๋๋ค. ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ค๋ณต/์ ์ค์ ๋ฐฉ์ง ์ํด ์ํ์น ์นดํ์นด๋ ๋ง์ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ฌ ์๋๋ฐ์, ๊ทธ ๊ฒฐ๊ณผ๋ก ๋ฉฑ๋ฑ์ฑ ํ๋ก๋์(idempotence producer)์ ํธ๋์ญ์ ํ๋ก๋์/์ปจ์๋จธ(transaction producer/consumer)๋ฅผ ์๊ธฐํ ์ ์์ต๋๋ค. ๋ฉฑ๋ฑ์ฑ ํ๋ก๋์๋ ๋คํธ์ํฌ ์ฅ์ ๊ฐ ๋ฐ์ํ๋๋ผ๋ ๋ธ๋ก์ปค์ ๋จ ํ๋์ ๋ ์ฝ๋๋ง ๋ณด๋ผ ์ ์๋๋ก ๋ณด์ฅํ์ฌ "ํ๋ก๋์ -> ํ ํฝ" ๊ตฌ๊ฐ์ '์ ํํ ํ๋ฒ' ์ฒ๋ฆฌ๊ฐ ๋๋๋ก ํ์์ต๋๋ค. ํธ๋์ญ์ ํ๋ก๋์/์ปจ์๋จธ๋ ์ฌ๋ฌ ๋ ์ฝ๋๋ฅผ ์์(atomic) ๋จ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก ์ค๊ณ๋์๋๋ฐ, ์ฌ๊ธฐ์ ์ถ๊ฐ์ ์ผ๋ก ์ปจ์๋จธ์ ์ปค๋ฐ์ ํธ๋์ญ์ ์ ํฌํจ์ํค๋ ๊ธฐ๋ฅ(sendOffsetsToTransaction)์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๋ฅผ ํตํด "Aํ ํฝ -> ์ปจ์๋จธ -> ๋ฐ์ดํฐ ์ฒ๋ฆฌ -> ํ๋ก๋์ -> Bํ ํฝ" ์ผ๋ก ์ด์ด์ง๋ ํ์ดํ๋ผ์ธ์์ '์ ํํ ํ๋ฒ' ์ฒ๋ฆฌ๊ฐ ๋๋๋ก ํ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ฃผ์ํด์ผํ ์ ์, Kafka ์์ ์์ฃผ ์ฌ์ฉํ๋ "ํ ํฝ -> ์ปจ์๋จธ" ํํ์ ๋ํด์๋ '์ ํํ ํ๋ฒ' ์ฒ๋ฆฌ์ ๋ํ ์ด์ผ๊ธฐ๊ฐ ์๋ค๋ ์ ์ ๋๋ค. ์ฆ, Kafka ์์ ์ง์ํ๋ Exactly-once ์ฒ๋ฆฌ๋ "ํ๋ก๋์ -> ํ ํฝ" ๊ณผ "Aํ ํฝ -> ์ปจ์๋จธ -> ๋ฐ์ดํฐ ์ฒ๋ฆฌ -> ํ๋ก๋์ -> Bํ ํฝ" ํํ๋ง ๋ณด์ฅ์ ํ๊ณ ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด "ํ ํฝ -> ์ปจ์๋จธ" ํํ๋ Exactly-once ์ฒ๋ฆฌ๊ฐ ๋ถ๊ฐ๋ฅํ ๊น์? ์ฌ์ค ์ด๊ฑด ์ปจ์๋จธ ๊ตฌํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค. "ํ ํฝ -> ์ปจ์๋จธ" ์ฒ๋ฆฌ์์ Exactly-once ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ ์ํด์๋ ๋ฉฑ๋ฑ์ฑ(idempotence) ์ฒ๋ฆฌ๋ฅผ ํ๋๋ก ์ปจ์๋จธ ๊ตฌํ์ด ๋์ผํฉ๋๋ค. ์๋ฅผ ๋ค์ด Kafka ๋ฉ์ธ์ง๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์ปจ์๋จธ๋ฅผ ๊ตฌํํ๋ค๋ฉด, ๋์ผํ ๋ ์ฝ๋๊ฐ ์ค๋ณต ์ ์ฌ๋ ๋๋ ๊ฒฐ๊ณผ๊ฐ ํ๋๋ง ๋์ฌ ์ ์๋๋ก ์ ๋ํฌ ํค ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ์ฌ ๋ฉฑ๋ฑ์ฑ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด "ํ ํฝ->์ปจ์๋จธ" ๊น์ง Exactly-once ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๊ฒ ๋ฉ๋๋ค. ์ ๊ฐ ์์ฝํ ๋ด์ฉ์ ๋ํ ์์ธํ ์ค๋ช ๋ค์ด ๋ฐ๋ธ์์๋์ ๋ธ๋ก๊ทธ์ ์ ๋ฆฌ๋์ด์์ผ๋ ๊ด์ฌ์์ผ์ ๋ถ๋ค๊ป์๋ ํ๋ฒ ์ฝ์ด๋ณด์๋ฉด ์ข๊ฒ ์ต๋๋ค. ๐ ์๋ฌธ: https://voidmainvoid.tistory.com/504?fbclid=IwAR3z7zNNRPsQIEBy1Qu7BGz1fXeJn_GBpMQxJQwSeskFWnfOvLBhky0cJKs