Transaction Producer

Kafka ํŠธ๋žœ์žญ์…˜ ํ”„๋กœ๋“€์„œ๋Š” ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ ์ „์†ก(Exactly Once Semantics, EOS)์„ ๋ณด์žฅํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ ํŒŒํ‹ฐ์…˜ ๋˜๋Š” ์—ฌ๋Ÿฌ ํ† ํ”ฝ์— ๊ฑธ์นœ ๋ฉ”์‹œ์ง€๋ฅผ ์›์ž์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ํ†ตํ•ด, ํ”„๋กœ๋“€์„œ๋Š” ์—ฌ๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ์–ด ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๊ฑฐ๋‚˜ ์‹คํŒจ ์‹œ ๋ชจ๋‘ ๋กค๋ฐฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ๊ณผ ์ •ํ™•ํ•œ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Kafka ํŠธ๋žœ์žญ์…˜ ํ”„๋กœ๋“€์„œ๋ž€?

Kafka ํŠธ๋žœ์žญ์…˜ ํ”„๋กœ๋“€์„œ๋Š” ์—ฌ๋Ÿฌ ํŒŒํ‹ฐ์…˜์— ๊ฑธ์ณ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•  ๋•Œ, ๋ชจ๋“  ๋ฉ”์‹œ์ง€๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๊ฑฐ๋‚˜ ์•„๋‹ˆ๋ฉด ๋ชจ๋‘ ์‹คํŒจํ•˜๋„๋ก ๋ณด์žฅํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฉ”์‹œ์ง€๊ฐ€ ์ค‘๋ณต ์—†์ด ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ๋งŒ ์ „์†ก๋˜๋Š” Exactly Once Semantics (EOS)๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠธ๋žœ์žญ์…˜์„ ํ†ตํ•ด Kafka๋Š” ํ”„๋กœ๋“€์„œ๊ฐ€ ์—ฌ๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฌถ์–ด ์ „์†กํ•˜๊ณ , ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋“ค์ด ์ฒ˜๋ฆฌ๋˜์—ˆ์„ ๋•Œ๋งŒ ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•˜๊ณ  ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์•˜์„ ๋•Œ๋Š” ๋กค๋ฐฑํ•˜์—ฌ ๋ฌดํšจํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


ํŠธ๋žœ์žญ์…˜ ํ”„๋กœ๋“€์„œ์˜ ์ฃผ์š” ํŠน์ง•

  1. ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ

    • Kafka ํŠธ๋žœ์žญ์…˜ ํ”„๋กœ๋“€์„œ๋Š” ์—ฌ๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ์–ด ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํŠธ๋žœ์žญ์…˜์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ปค๋ฐ‹๋˜๋ฉด ๋ชจ๋“  ๋ฉ”์‹œ์ง€๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋ฉฐ, ์‹คํŒจ ์‹œ ๋กค๋ฐฑ๋ฉ๋‹ˆ๋‹ค.

  2. Exactly Once Semantics (EOS)

    • ํŠธ๋žœ์žญ์…˜ ํ”„๋กœ๋“€์„œ๋Š” ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ ์ „์†กํ•˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์ค‘๋ณต ์—†์ด ๋ฉ”์‹œ์ง€๋ฅผ ํ•œ ๋ฒˆ๋งŒ ์ฒ˜๋ฆฌํ•˜๊ณ , ์žฌ์ „์†ก ์‹œ ์ค‘๋ณต๋˜์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

  3. ์—ฌ๋Ÿฌ ํŒŒํ‹ฐ์…˜ ๋ฐ ํ† ํ”ฝ ์ฒ˜๋ฆฌ

    • Kafka ํŠธ๋žœ์žญ์…˜ ํ”„๋กœ๋“€์„œ๋Š” ์—ฌ๋Ÿฌ ํŒŒํ‹ฐ์…˜ ๋˜๋Š” ์—ฌ๋Ÿฌ ํ† ํ”ฝ์— ๊ฑธ์นœ ๋ฉ”์‹œ์ง€๋ฅผ ํ•œ ๋ฒˆ์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


ํŠธ๋žœ์žญ์…˜ ํ”„๋กœ๋“€์„œ์˜ ๋™์ž‘ ์›๋ฆฌ

Kafka ํŠธ๋žœ์žญ์…˜ ํ”„๋กœ๋“€์„œ๋Š” ํŠธ๋žœ์žญ์…˜ ID (Transactional ID)๋ฅผ ํ†ตํ•ด ๊ฐ ํŠธ๋žœ์žญ์…˜์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. Kafka๋Š” ์ด ํŠธ๋žœ์žญ์…˜ ID๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ ๋ฉ”์‹œ์ง€๊ฐ€ ํŠธ๋žœ์žญ์…˜์— ์†ํ•ด ์žˆ๋Š”์ง€ ์ถ”์ ํ•˜๊ณ , ํŠธ๋žœ์žญ์…˜์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ปค๋ฐ‹๋˜๋ฉด ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์˜ ๋ชจ๋“  ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ๋กค๋ฐฑ๋  ๊ฒฝ์šฐ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฌดํšจํ™”ํ•ฉ๋‹ˆ๋‹ค.

  1. ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘

    • ํŠธ๋žœ์žญ์…˜ ํ”„๋กœ๋“€์„œ๋Š” ํŠธ๋žœ์žญ์…˜ ID๋ฅผ ์‚ฌ์šฉํ•ด ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๊ณ , ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์ „์†ก๋˜๋Š” ๋ชจ๋“  ๋ฉ”์‹œ์ง€๋Š” ํŠธ๋žœ์žญ์…˜ ๋‚ด์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  2. ๋ฉ”์‹œ์ง€ ์ „์†ก

    • ํ”„๋กœ๋“€์„œ๋Š” ํŠธ๋žœ์žญ์…˜์ด ์ง„ํ–‰ ์ค‘์ธ ๋™์•ˆ ์—ฌ๋Ÿฌ ํŒŒํ‹ฐ์…˜์ด๋‚˜ ํ† ํ”ฝ์— ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฉ”์‹œ์ง€๋“ค์€ ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์ž ์ •์ ์ธ ์ƒํƒœ๋กœ ๋‚จ์•„์žˆ์Šต๋‹ˆ๋‹ค.

  3. ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ ๋˜๋Š” ๋กค๋ฐฑ

    • ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋˜๋ฉด, ํŠธ๋žœ์žญ์…˜ ๋‚ด ๋ชจ๋“  ๋ฉ”์‹œ์ง€๊ฐ€ ์ •์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, ํŠธ๋žœ์žญ์…˜์ด ์‹คํŒจํ•˜๊ฑฐ๋‚˜ ๋กค๋ฐฑ๋˜๋ฉด ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋Š” ๋ฌดํšจํ™”๋ฉ๋‹ˆ๋‹ค.


ํŠธ๋žœ์žญ์…˜ ํ”„๋กœ๋“€์„œ ์„ค์ •

Kafka์—์„œ ํŠธ๋žœ์žญ์…˜ ํ”„๋กœ๋“€์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, transactional.id๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

transactional.id๋Š” Kafka๊ฐ€ ํŠธ๋žœ์žญ์…˜์„ ์ถ”์ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๊ณ ์œ  ID์ž…๋‹ˆ๋‹ค. ์ด ID๋Š” ๊ฐ ํ”„๋กœ๋“€์„œ ์ธ์Šคํ„ด์Šค๋งˆ๋‹ค ๋ถ€์—ฌ๋˜๋ฉฐ, Kafka๋Š” ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํŠธ๋žœ์žญ์…˜์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

ํŠธ๋žœ์žญ์…˜ ํ”„๋กœ๋“€์„œ ์„ค์ • ์˜ˆ์‹œ:

val props = Properties()
props[ProducerConfig.BOOTSTRAP_SERVERS_CONFIG] = "localhost:9092"
props[ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG] = StringSerializer::class.java.name
props[ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG] = StringSerializer::class.java.name
props[ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG] = "true"  // ๋ฉฑ๋“ฑ์„ฑ ํ™œ์„ฑํ™”
props[ProducerConfig.TRANSACTIONAL_ID_CONFIG] = "transactional-producer-1"  // ํŠธ๋žœ์žญ์…˜ ID ์„ค์ •

val producer = KafkaProducer<String, String>(props)

// ํŠธ๋žœ์žญ์…˜ ์ดˆ๊ธฐํ™”
producer.initTransactions()

try {
    // ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘
    producer.beginTransaction()

    // ์—ฌ๋Ÿฌ ํŒŒํ‹ฐ์…˜ ๋˜๋Š” ํ† ํ”ฝ์— ๋ฉ”์‹œ์ง€ ์ „์†ก
    producer.send(ProducerRecord("my-topic", "key1", "value1"))
    producer.send(ProducerRecord("my-topic", "key2", "value2"))

    // ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹
    producer.commitTransaction()
} catch (e: Exception) {
    // ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ
    producer.abortTransaction()
    e.printStackTrace()
} finally {
    producer.close()
}

์œ„ ์ฝ”๋“œ๋Š” ํŠธ๋žœ์žญ์…˜ ํ”„๋กœ๋“€์„œ๋ฅผ ์„ค์ •ํ•˜๊ณ , beginTransaction()์„ ํ˜ธ์ถœํ•ด ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•œ ํ›„, ์—ฌ๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•œ ๋’ค commitTransaction()์œผ๋กœ ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•˜๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, abortTransaction()์„ ํ˜ธ์ถœํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜์„ ๋กค๋ฐฑํ•ฉ๋‹ˆ๋‹ค.


ํŠธ๋žœ์žญ์…˜ ์ปจ์Šˆ๋จธ

ํŠธ๋žœ์žญ์…˜ ํ”„๋กœ๋“€์„œ๊ฐ€ ๋ณด๋‚ธ ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” Kafka ์ปจ์Šˆ๋จธ๋Š” ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ ์—ฌ๋ถ€๋ฅผ ์ธ์‹ํ•˜๊ณ , ์ปค๋ฐ‹๋œ ๋ฉ”์‹œ์ง€๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. Kafka ์ปจ์Šˆ๋จธ๋Š” isolation.level ์„ค์ •์„ ํ†ตํ•ด ์ปค๋ฐ‹๋œ ๋ฉ”์‹œ์ง€๋งŒ ์†Œ๋น„ํ• ์ง€, ๋กค๋ฐฑ๋œ ๋ฉ”์‹œ์ง€๋„ ํฌํ•จํ•ด ์ฝ์„์ง€๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • isolation.level=read_committed: ์ปค๋ฐ‹๋œ ํŠธ๋žœ์žญ์…˜์˜ ๋ฉ”์‹œ์ง€๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค.

  • isolation.level=read_uncommitted: ๋ชจ๋“  ํŠธ๋žœ์žญ์…˜์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค(๋กค๋ฐฑ๋œ ๋ฉ”์‹œ์ง€๋„ ํฌํ•จ).

์ปจ์Šˆ๋จธ ์„ค์ • ์˜ˆ์‹œ

isolation.level=read_committed

์ด ์„ค์ •์„ ํ†ตํ•ด, ์ปจ์Šˆ๋จธ๋Š” ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋œ ๋ฉ”์‹œ์ง€๋งŒ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋˜์–ด ์ •ํ™•ํ•œ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.


์žฅ์ 

  1. ์ •ํ™•ํ•œ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ: ํŠธ๋žœ์žญ์…˜ ํ”„๋กœ๋“€์„œ๋Š” ์—ฌ๋Ÿฌ ํŒŒํ‹ฐ์…˜ ๋˜๋Š” ์—ฌ๋Ÿฌ ํ† ํ”ฝ์— ๊ฑธ์นœ ๋ฉ”์‹œ์ง€๋ฅผ ์›์ž์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ผ๊ด€์„ฑ ์žˆ๋Š” ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  2. Exactly Once Semantics (EOS): ํŠธ๋žœ์žญ์…˜ ํ”„๋กœ๋“€์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, Kafka๋Š” ์ค‘๋ณต ์—†์ด ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฉ”์‹œ์ง€์˜ ์ค‘๋ณต ์ „์†ก์„ ๋ฐฉ์ง€ํ•˜๊ณ , ๋ฉ”์‹œ์ง€๊ฐ€ ํ•œ ๋ฒˆ๋งŒ ์ฒ˜๋ฆฌ๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

  3. ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ๊ฐ„์˜ ์ผ๊ด€์„ฑ ์œ ์ง€: Kafka ํŠธ๋žœ์žญ์…˜์„ ํ†ตํ•ด, Kafka ์™ธ๋ถ€ ์‹œ์Šคํ…œ(์˜ˆ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)๊ณผ ํ†ตํ•ฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์‹œ์Šคํ…œ ๊ฐ„ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Kafka์— ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•˜๋Š” ๋™์‹œ์— ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


๋‹จ์ 

์„ฑ๋Šฅ ์ €ํ•˜: ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋Š” ์—ฌ๋Ÿฌ ํŒŒํ‹ฐ์…˜์ด๋‚˜ ํ† ํ”ฝ์— ๊ฑธ์ณ ์›์ž์ ์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ผ๋ฐ˜ ํ”„๋กœ๋“€์„œ์— ๋น„ํ•ด ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋Š๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, ๋งŽ์€ ๋ฉ”์‹œ์ง€๋ฅผ ํ•œ ๋ฒˆ์— ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์ฒ˜๋ฆฌํ•  ๋•Œ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณต์žก์„ฑ ์ฆ๊ฐ€: ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘, ์ปค๋ฐ‹, ๋กค๋ฐฑ ๋“ฑ์˜ ์ฒ˜๋ฆฌ๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์ „์ฒด ์‹œ์Šคํ…œ์—์„œ์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์™€ ๋ณต๊ตฌ ๋กœ์ง์ด ๋”์šฑ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๊ฒฐ๋ก 

Kafka ํŠธ๋žœ์žญ์…˜ ํ”„๋กœ๋“€์„œ๋Š” ์ •ํ™•ํ•œ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ์™€ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ, ์—ฌ๋Ÿฌ ํŒŒํ‹ฐ์…˜์ด๋‚˜ ์—ฌ๋Ÿฌ ํ† ํ”ฝ์— ๊ฑธ์ณ ๋ฉ”์‹œ์ง€๋ฅผ ์›์ž์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด Exactly Once Semantics (

EOS)๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํŠธ๋žœ์žญ์…˜ ํ”„๋กœ๋“€์„œ๋Š” ๋ฐ์ดํ„ฐ ์ค‘๋ณต ์—†์ด ํ•œ ๋ฒˆ๋งŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์ค‘์š”ํ•œ ์‹œ์Šคํ…œ์—์„œ ํ•„์ˆ˜์ ์ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์„ฑ๋Šฅ ์ €ํ•˜์™€ ๋ณต์žก์„ฑ ์ฆ๊ฐ€๋ผ๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ์ ˆํžˆ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Last updated