[MSA] kafka - producer

Updated:

Categories:

Tags: , ,

๐Ÿ“Œ ๊ฐœ์ธ์ ์ธ ๊ณต๊ฐ„์œผ๋กœ ๊ณต๋ถ€๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ๋ณต์Šตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
์ •ํ™•ํ•˜์ง€ ์•Š์€ ์ •๋ณด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ๋ฐ”๋ž๋‹ˆ๋‹ค :๐Ÿ˜ธ
[ํ‹€๋ฆฐ ๋‚ด์šฉ์€ ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์‹œ๋ฉด ๋ณต๋ฐ›์œผ์‹ค๊ฑฐ์—์š”]

์ธํ”„๋Ÿฐ Dowon Lee๋‹˜์˜ Spring Cloud๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(MSA) ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.๐Ÿ˜Š
Spring Cloud๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(MSA) ๊ฐ•์˜ ๋“ค์œผ๋Ÿฌ ๊ฐ€๊ธฐ๐Ÿ‘ฉโ€๐Ÿซ
โœ… ์ถ”๊ฐ€๋กœ kafka ์— ๋Œ€ํ•ด ์ž˜ ์ •๋ฆฌ๋œ ๋ธ”๋กœ๊ทธ๊ฐ€ ์žˆ์–ด ์ฐธ๊ณ  ํ•˜์˜€์Šต๋‹ˆ๋‹ค.ย ยป ์–ธ์ œ๋‚˜๊น€๊น€

์นดํ”„์นด ํ”„๋กœ๋“€์„œ(Kafka Producer)

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

1๏ธโƒฃ ํ”„๋กœ๋“€์„œ์˜ ๋ฐ์ดํ„ฐ ์ „์†ก ๋ฐฉ์‹

์ง๋ ฌํ™”(Serialization)

  • ์ง๋ ฌํ™”
    • ํ”„๋กœ๋“€์„œ๋Š” ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ™”ํ•˜์—ฌ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
  • ์ „์†ก ๋ฐ ์ €์žฅ
    • ์ง๋ ฌํ™”๋œ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด์€ ๋ธŒ๋กœ์ปค์˜ ํŒŒํ‹ฐ์…˜์— ์ €์žฅ๋˜๋ฉฐ, ์ปจ์Šˆ๋จธ๋Š” ์ด๋ฅผ ๋ฐ›์•„ ์—ญ์ง๋ ฌํ™”ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ง๋ ฌํ™” ํด๋ž˜์Šค ์ง€์ •
    • ํ”„๋กœ๋“€์„œ ์„ค์ • ์‹œ key.serializer์™€ value.serializer๋ฅผ ํ†ตํ•ด ์ง๋ ฌํ™” ํด๋ž˜์Šค๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.

2๏ธโƒฃ ๋ฉ”์‹œ์ง€ ํ‚ค(Message Key) ์‚ฌ์šฉ ์—ฌ๋ถ€์— ๋”ฐ๋ฅธ ์ „์†ก

  1. ๋ฉ”์‹œ์ง€ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
    • ์Šคํ‹ฐํ‚ค ํŒŒํ‹ฐ์…”๋‹(Sticky Partitioning)
      • ๋ฉ”์‹œ์ง€ ํ‚ค๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์Šคํ‹ฐํ‚ค ํŒŒํ‹ฐ์…”๋‹ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค
      • ํŠน์ง•: ํ•˜๋‚˜์˜ ๋ฐฐ์น˜์— ๋ฉ”์‹œ์ง€๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฑ„์›Œ ํŠน์ • ํŒŒํ‹ฐ์…˜์œผ๋กœ ์ „์†ก
    • ์ˆœ์„œ ๋ณด์žฅ ๋ฏธํก
      • ํŒŒํ‹ฐ์…˜์ด ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๊ฒฝ์šฐ ๋ฉ”์‹œ์ง€์˜ ์ „์†ก ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.
  2. ๋ฉ”์„ธ์ง€ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
    • ํ•ด์‹œ ํŒŒํ‹ฐ์…”๋‹
      • ๋ฉ”์‹œ์ง€ ํ‚ค๋ฅผ ํ•ด์‹œํ•˜์—ฌ ํŠน์ • ํŒŒํ‹ฐ์…˜์— ๋งคํ•‘ํ•œ๋‹ค.
    • ์ˆœ์„œ ๋ณด์žฅ
      • ๋™์ผํ•œ ๋ฉ”์‹œ์ง€ ํ‚ค๋Š” ํ•ญ์ƒ ๊ฐ™์€ ํŒŒํ‹ฐ์…˜์— ์ €์žฅ๋˜๋ฏ€๋กœ ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋จ.
    • ํŒŒํ‹ฐ์…˜ ๊ฐœ์ˆ˜ ๋ณ€ํ™” ์‹œ ๋ฌธ์ œ์ :
      • ํŒŒํ‹ฐ์…˜ ๊ฐœ์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ํ•ด์‹œ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ ธ ๋ฉ”์‹œ์ง€ ์ˆœ์„œ๊ฐ€ ๊นจ์งˆ ์ˆ˜ ์žˆ๋‹ค.
      • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: ์ปค์Šคํ…€ ํŒŒํ‹ฐ์…”๋„ˆ๋ฅผ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ์ดˆ๊ธฐ ํŒŒํ‹ฐ์…˜ ์ˆ˜๋ฅผ ์ถฉ๋ถ„ํžˆ ์„ค์ •ํ•œ๋‹ค.

3๏ธโƒฃ ํ”„๋กœ๋“€์„œ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ์™€ ๋™์ž‘ ์›๋ฆฌ

ํ”„๋กœ๋“€์„œ ๋ฐ์ดํ„ฐ ์ „์†ก ํ๋ฆ„

  1. ProducerRecord ์ƒ์„ฑ: ์ „์†กํ•  ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑ
  2. send() ํ˜ธ์ถœ: ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ
  3. ํŒŒํ‹ฐ์…”๋„ˆ(Partitioner): ๋ฉ”์‹œ์ง€๋ฅผ ํŒŒํ‹ฐ์…˜์— ๋งคํ•‘
  4. Accumulator: ํ† ํ”ฝ๋ณ„๋กœ ๋ฐฐ์น˜๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.
  5. Sender: ๋ฐฐ์น˜๋ฅผ ์นดํ”„์นด ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์ „์†กํ•œ๋‹ค

์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ

  • ํŒŒํ‹ฐ์…”๋„ˆ(Partitioner):
    • ๋ฉ”์‹œ์ง€๋ฅผ ํŠน์ • ํŒŒํ‹ฐ์…˜์— ํ• ๋‹นํ•˜๋Š” ๋กœ์ง์„ ๋‹ด๋‹น
    • ๊ธฐ๋ณธ๊ฐ’์€ DefaultPartitioner์ด๋ฉฐ, ํ•„์š”์— ๋”ฐ๋ผ ์ปค์Šคํ…€ ํŒŒํ‹ฐ์…”๋„ˆ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Accumulator:
    • ์ „์†กํ•˜๊ธฐ ์ „ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฒ„ํผ์— ๋ชจ์•„ ๋ฐฐ์น˜๋ฅผ ์ƒ์„ฑ
    • ํšจ์œจ์ ์ธ ์ „์†ก์„ ์œ„ํ•ด ๋ฐฐ์น˜ ๋‹จ์œ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

4๏ธโƒฃ ํ”„๋กœ๋“€์„œ ์ฃผ์š” ์˜ต์…˜

ํ•„์ˆ˜ ์˜ต์…˜

  1. bootstrap.servers
    • ์นดํ”„์นด ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ธŒ๋กœ์ปค ์ •๋ณด๋ฅผ ์ง€์ •ํ•œ๋‹ค.
    • 'ํ˜ธ์ŠคํŠธ์ด๋ฆ„:ํฌํŠธ' ํ˜•์‹์œผ๋กœ ํ•˜๋‚˜ ์ด์ƒ ์ž…๋ ฅ
  2. key.serializer
    • ๋ฉ”์‹œ์ง€ ํ‚ค๋ฅผ ์ง๋ ฌํ™”ํ•˜๋Š” ํด๋ž˜์Šค
  3. value.serializer
    • ๋ฉ”์‹œ์ง€ ๊ฐ’์„ ์ง๋ ฌํ™”ํ•˜๋Š” ํด๋ž˜์Šค

์„ ํƒ ์˜ต์…˜

  1. acks
    • ์ „์†กํ•œ ๋ฐ์ดํ„ฐ์˜ ํ™•์ธ ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • 0: ํ™•์ธํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ๋‹ค์Œ ์ž‘์—… ์ง„ํ–‰.
    • 1(๊ธฐ๋ณธ๊ฐ’): ๋ฆฌ๋” ํŒŒํ‹ฐ์…˜์— ์ €์žฅ๋˜๋ฉด ์„ฑ๊ณต์œผ๋กœ ํŒ๋‹จ.
    • all(-1): ๋ชจ๋“  ISR์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋ฉด ์„ฑ๊ณต์œผ๋กœ ํŒ๋‹จ.
  2. buffer.memory
    • ๋ฐฐ์น˜๋กœ ์ „์†กํ•  ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฒ„ํผ ๋ฉ”๋ชจ๋ฆฌ ์–‘์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ธฐ๋ณธ๊ฐ’์€ 32MB์ž…๋‹ˆ๋‹ค.
  3. retries
    • ์ „์†ก ์‹คํŒจ ์‹œ ์žฌ์‹œ๋„ ํšŸ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ธฐ๋ณธ๊ฐ’์€ 2147483647(๋ฌด์ œํ•œ)์ž…๋‹ˆ๋‹ค.
  4. batch.size
    • ๋ฐฐ์น˜๋กœ ์ „์†กํ•  ๋ ˆ์ฝ”๋“œ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ธฐ๋ณธ๊ฐ’์€ 16KB์ž…๋‹ˆ๋‹ค.
  5. linger.ms
    • ๋ฐฐ์น˜๋ฅผ ์ „์†กํ•˜๊ธฐ ์ „๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ตœ๋Œ€ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.
    • ๊ธฐ๋ณธ๊ฐ’์€ 0ms์ž…๋‹ˆ๋‹ค.
  6. partitioner.class
    • ํŒŒํ‹ฐ์…”๋„ˆ ํด๋ž˜์Šค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  7. enable.idempotence
    • ๋ฉฑ๋“ฑ์„ฑ ํ”„๋กœ๋“€์„œ๋กœ ๋™์ž‘ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ์ค‘๋ณต ๋ฉ”์‹œ์ง€ ์ „์†ก์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  8. transactional.id
    • ํŠธ๋žœ์žญ์…˜ ํ”„๋กœ๋“€์„œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ณ ์œ ํ•œ ํŠธ๋žœ์žญ์…˜ ID๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

5๏ธโƒฃ ISR(In-Sync Replicas)๊ณผ acks ์˜ต์…˜

ISR(In-Sync Replicas)

  • ์ •์˜: ๋ฆฌ๋” ํŒŒํ‹ฐ์…˜๊ณผ ์™„์ „ํžˆ ๋™๊ธฐํ™”๋œ ํŒ”๋กœ์›Œ ํŒŒํ‹ฐ์…˜์˜ ์ง‘ํ•ฉ
  • ์—ญํ• : ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ๊ณผ ๊ฐ€์šฉ์„ฑ์„ ๋ณด์žฅํ•˜๋ฉฐ, ๋ฆฌ๋” ์žฅ์•  ์‹œ ISR ๋‚ด ํŒ”๋กœ์›Œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฆฌ๋”๋กœ ์Šน๊ฒฉ๋œ๋‹ค.
  • ๋ชจ๋‹ˆํ„ฐ๋ง: replica.lag.time.max.ms ์„ค์ •์œผ๋กœ ํŒ”๋กœ์›Œ์˜ ๋™๊ธฐํ™” ์ƒํƒœ๋ฅผ ํ™•์ธํ•œ๋‹ค.

acks ์˜ต์…˜ ์ƒ์„ธ ์„ค๋ช…

  1. acks=0
    • ๋ฆฌ๋” ํŒŒํ‹ฐ์…˜์˜ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ „์†ก
    • ์ „์†ก ์†๋„๊ฐ€ ๊ฐ€์žฅ ๋น ๋ฅด์ง€๋งŒ ๋ฐ์ดํ„ฐ ์œ ์‹ค ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.
  2. acks=1
    • ๋ฆฌ๋” ํŒŒํ‹ฐ์…˜์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋ฉด ์„ฑ๊ณต์œผ๋กœ ํŒ๋‹จ
    • ํŒ”๋กœ์›Œ ํŒŒํ‹ฐ์…˜์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด ๋ฐ์ดํ„ฐ ์œ ์‹ค ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.
  3. acks=all(-1)
    • ISR์— ํฌํ•จ๋œ ๋ชจ๋“  ํŒŒํ‹ฐ์…˜์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋ฉด ์„ฑ๊ณต์œผ๋กœ ํŒ๋‹จํ•ฉ
    • min.insync.replicas ์„ค์ •๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ์•ˆ์ „์„ฑ์„ ๋†’์ธ๋‹ค.

min.insync.replicas

  • ์—ญํ• : ISR ๋‚ด ์ตœ์†Œ ๋ช‡ ๊ฐœ์˜ ํŒŒํ‹ฐ์…˜์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ์ง€์ •ํ•œ๋‹ค.
  • ์ฃผ์˜์‚ฌํ•ญ
    • min.insync.replicas๋Š” ๋ณต์ œ ๊ฐœ์ˆ˜๋ณด๋‹ค ์ž‘์•„์•ผ ํ•œ๋‹ค.
    • ๋ธŒ๋กœ์ปค ์žฅ์•  ์‹œ ์„œ๋น„์Šค ์ค‘๋‹จ์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ์ ์ ˆํ•œ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

6๏ธโƒฃ ์ „์†ก ๋ฐ ์žฌ์ „์†ก ๋ฉ”์ปค๋‹ˆ์ฆ˜

  • Record Accumulator ๊ฐ€๋“ ์ฐฌ ๊ฒฝ์šฐ
    • max.block.ms ๋งŒํผ ๋Œ€๊ธฐ ํ›„์—๋„ ์ „์†กํ•˜์ง€ ๋ชปํ•˜๋ฉด TimeoutException์ด ๋ฐœ์ƒ
  • Sender ์Šค๋ ˆ๋“œ ๋™์ž‘
    • linger.ms ๋™์•ˆ ๋Œ€๊ธฐ ํ›„ ๋ฐฐ์น˜๋ฅผ ์ „์†ก
    • ๋ธŒ๋กœ์ปค์˜ ์‘๋‹ต์„ request.timeout.ms ๋งŒํผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
    • ์‘๋‹ต์ด ์—†์œผ๋ฉด ์žฌ์‹œ๋„ํ•˜๊ฑฐ๋‚˜ TimeoutException์ด ๋ฐœ์ƒํ•œ๋‹ค.
  • ์žฌ์‹œ๋„ ๋กœ์ง
    • retries ํšŸ์ˆ˜๋งŒํผ ์žฌ์‹œ๋„ํ•˜๋ฉฐ, ๊ฐ ์žฌ์‹œ๋„ ์‚ฌ์ด์— retry.backoff.ms ๋งŒํผ ๋Œ€๊ธฐํ•œ๋‹ค.
  • ์ตœ๋Œ€ ์ „์†ก ์‹œ๊ฐ„
    • delivery.timeout.ms ์„ค์ •์œผ๋กœ ๋ฉ”์‹œ์ง€ ์ „์†ก์— ํ—ˆ์šฉ๋œ ์ตœ๋Œ€ ์‹œ๊ฐ„์„ ์ง€์ •ํ•œ๋‹ค.





MSA ์นดํ…Œ๊ณ ๋ฆฌ ๋‚ด ๋‹ค๋ฅธ ๊ธ€ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ

Leave a comment