์นดํ”„์นด๋Š” ์–ด๋–ป๊ฒŒ ํ˜„์‹ค์ด ๋˜์—ˆ๋‚˜

์นดํ”„์นด๋Š” ์–ด๋–ป๊ฒŒ ํ˜„์‹ค์ด ๋˜์—ˆ๋‚˜

ํ—ค์ด ํ•˜๋ธŒ๋ฅด!

์ €๋Š” ์ž์ฒด ์•Œ๋ฆผ ์„ผํ„ฐ๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” Tinkoff ํŒ€์—์„œ ์ผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ฃผ๋กœ Spring boot๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Java๋กœ ๊ฐœ๋ฐœํ•˜๊ณ , ํ”„๋กœ์ ํŠธ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ์ˆ ์ ์ธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋Š” ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์„œ๋กœ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์—๋Š” IBM MQ๋ฅผ ๋ธŒ๋กœ์ปค๋กœ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ์ด๋Š” ๋” ์ด์ƒ ๋กœ๋“œ์— ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์—†์ง€๋งŒ ๋™์‹œ์— ๋†’์€ ์ „๋‹ฌ ๋ณด์žฅ์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

๋Œ€์ฒดํ’ˆ์œผ๋กœ ํ™•์žฅ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์ง€๋งŒ ์•ˆํƒ€๊น๊ฒŒ๋„ ๋‹ค์–‘ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•œ ๊ตฌ์„ฑ์— ๋Œ€ํ•ด ๊ฑฐ์˜ ๊ฐœ๋ณ„์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์ด ํ•„์š”ํ•œ Apache Kafka๊ฐ€ ์ œ๊ณต๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ธฐ๋ณธ์ ์œผ๋กœ Kafka์—์„œ ์ž‘๋™ํ•˜๋Š” ์ตœ์†Œ ํ•œ ๋ฒˆ ์ „๋‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•„์š”ํ•œ ์ˆ˜์ค€์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ Kafka ๊ตฌ์„ฑ ๊ฒฝํ—˜์„ ๊ณต์œ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ •ํ™•ํžˆ XNUMXํšŒ ์ „๋‹ฌ์„ ๊ตฌ์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฐฐ์†ก ๋ณด์žฅ ๋“ฑ

์•„๋ž˜์— ์„ค๋ช…๋œ ์„ค์ •์€ ๊ธฐ๋ณธ ์—ฐ๊ฒฐ ์„ค์ •๊ณผ ๊ด€๋ จ๋œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋จผ์ € ๊ฐ€๋Šฅํ•œ ๋””๋ฒ„๊ทธ๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ฃผ๋ชฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค ํด๋ผ์ด์–ธํŠธ.ID ์ƒ์‚ฐ์ž์™€ ์†Œ๋น„์ž๋ฅผ ์œ„ํ•œ. ์–ผํ• ๋ณด๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฆ„์„ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ด ๋ฐฉ๋ฒ•์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์—ฌ๋Ÿฌ ์†Œ๋น„์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋™์ผํ•œ client.id๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ƒํ™ฉ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

org.apache.kafka.common.utils.AppInfoParser โ€” Error registering AppInfo mbean javax.management.InstanceAlreadyExistsException: kafka.consumer:type=app-info,id=kafka.test-0

Kafka๊ฐ€ ํฌํ•จ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ JMX๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ด๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฆ„๊ณผ ์ฃผ์ œ ์ด๋ฆ„ ๋“ฑ์„ ์กฐํ•ฉํ•˜์—ฌ client.id ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ๊ฒฐ๊ณผ๋Š” ๋ช…๋ น ์ถœ๋ ฅ์—์„œ โ€‹โ€‹๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์นดํ”„์นด ์†Œ๋น„์ž ๊ทธ๋ฃน Confluent์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ์—์„œ:

์นดํ”„์นด๋Š” ์–ด๋–ป๊ฒŒ ํ˜„์‹ค์ด ๋˜์—ˆ๋‚˜

์ด์ œ ๋ณด์žฅ๋œ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ์— ๋Œ€ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Kafka Producer์—๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Acks์ด๋ฅผ ํ†ตํ•ด ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ๋”๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ž‘์„ฑ๋œ ๋ฉ”์‹œ์ง€๋ฅผ ๊ณ ๋ คํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์Šน์ธ ํšŸ์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋‹ค์Œ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • 0 - ์Šน์ธ์ด ๊ณ ๋ ค๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • 1์ด ๊ธฐ๋ณธ ๋งค๊ฐœ๋ณ€์ˆ˜์ด๋ฉฐ ํ™•์ธํ•˜๋ ค๋ฉด ๋ณต์ œ๋ณธ 1๊ฐœ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • โˆ’1 โ€” ๋™๊ธฐํ™”๋œ ๋ชจ๋“  ๋ณต์ œ๋ณธ์˜ ์Šน์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค(ํด๋Ÿฌ์Šคํ„ฐ ์„ค์ • min.insync.replicas).

๋‚˜์—ด๋œ ๊ฐ’์—์„œ -1๊ณผ ๊ฐ™์€ ack๊ฐ€ ๋ฉ”์‹œ์ง€๊ฐ€ ์†์‹ค๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๋Š” ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ๋ณด์žฅ์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ ๋ชจ๋‘ ์•Œ๊ณ  ์žˆ๋“ฏ์ด ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์€ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ผ์‹œ์ ์ธ ์˜ค๋ฅ˜๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด Kafka Producer๋Š” ๋‹ค์Œ ์˜ต์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์žฌ์‹œ๋„, ์žฌ์ „์†ก ์‹œ๋„ ํšŸ์ˆ˜๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฐ๋‹ฌ.์‹œ๊ฐ„ ์ดˆ๊ณผ.ms. retries ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ธฐ๋ณธ๊ฐ’์€ Integer.MAX_VALUE(2147483647)์ด๋ฏ€๋กœ, Delivery.timeout.ms๋งŒ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ฉ”์‹œ์ง€ ์žฌ์‹œ๋„ ํšŸ์ˆ˜๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

XNUMXํšŒ๋งŒ ๋ฐฐ์†ก์„ ํ–ฅํ•ด ๋‚˜์•„๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค

๋‚˜์—ด๋œ ์„ค์ •์„ ํ†ตํ•ด ์ƒ์‚ฐ์ž๋Š” ๋†’์€ ๋ณด์ฆ์„ ๋ฐ”ํƒ•์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ํ•˜๋‚˜์˜ ๋ฉ”์‹œ์ง€ ๋ณต์‚ฌ๋ณธ๋งŒ Kafka ์ฃผ์ œ์— ๊ธฐ๋ก๋˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด Producer์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑํ™”.๋ฉฑ๋“ฑ์„ฑ ์‚ฌ์‹ค๋กœ. ๋ฉฑ๋“ฑ์„ฑ์€ ํ•œ ์ฃผ์ œ์˜ ํŠน์ • ํŒŒํ‹ฐ์…˜์— ํ•˜๋‚˜์˜ ๋ฉ”์‹œ์ง€๋งŒ ๊ธฐ๋ก๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ฉฑ๋“ฑ์„ฑ์„ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์ „์ œ ์กฐ๊ฑด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. acks = ๋ชจ๋‘, ์žฌ์‹œ๋„ > 0, max.in.flight.requests.per.connection โ‰ค 5. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋Ÿฌํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์œ„ ๊ฐ’์ด ์ž๋™์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

๋ฉฑ๋“ฑ์„ฑ์ด ๊ตฌ์„ฑ๋˜๋ฉด ๋™์ผํ•œ ๋ฉ”์‹œ์ง€๊ฐ€ ๋งค๋ฒˆ ๋™์ผํ•œ ํŒŒํ‹ฐ์…˜์— ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. partitioner.class ํ‚ค์™€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ Producer๋กœ ์„ค์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์—ด์‡ ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ ์ œ์ถœ๋งˆ๋‹ค ๋™์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์›๋ณธ ๊ฒŒ์‹œ๋ฌผ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ID๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. partitioner.class ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ธฐ๋ณธ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธํŒŒํ‹ฐ์…”๋„ˆ. ์ด ๋ถ„ํ•  ์ „๋žต์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ๋•Œ ํŒŒํ‹ฐ์…˜์ด ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •๋˜๋ฉด ์ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ํŒŒํ‹ฐ์…˜์„ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  ํ‚ค๋ฅผ ์ง€์ •ํ•œ ๊ฒฝ์šฐ ํ‚ค์˜ ํ•ด์‹œ๋กœ ํŒŒํ‹ฐ์…˜์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • ํŒŒํ‹ฐ์…˜๊ณผ ํ‚ค๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ํŒŒํ‹ฐ์…˜์„ ํ•˜๋‚˜์”ฉ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค(๋ผ์šด๋“œ ๋กœ๋นˆ).

๋˜ํ•œ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉฑ๋“ฑ์„ฑ ์ „์†ก์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. max.in.flight.requests.per.connection = 1 ์†Œ๋น„์ž์— ๋Œ€ํ•œ ๊ฐ„์†Œํ™”๋œ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํด๋Ÿฌ์Šคํ„ฐ์— ์•ก์„ธ์Šค ์ œ์–ด๊ฐ€ ๊ตฌ์„ฑ๋œ ๊ฒฝ์šฐ ์ฃผ์ œ์— ๋ฉฑ๋“ฑ์ ์œผ๋กœ ์“ฐ๊ธฐ ์œ„ํ•œ ๊ถŒํ•œ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ณต์‹์ ์œผ๋กœ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฆ„๊ณผ ๊ฐ™์€ ๋ชจ๋“  ๋ฌธ์ž์—ด์„ ํŠธ๋žœ์žญ์…˜ ์‹๋ณ„์ž๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋™์ผํ•œ transactional.id๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด Kafka๊ฐ€ ์ด๋ฅผ ์ข€๋น„ ํ”„๋กœ์„ธ์Šค๋กœ ๊ฐ„์ฃผํ•˜๋ฏ€๋กœ ์ฒ˜์Œ ์‹œ์ž‘๋œ ์ธ์Šคํ„ด์Šค๊ฐ€ ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค.

org.apache.kafka.common.errors.ProducerFencedException: Producer attempted an operation with an old epoch. Either there is a newer producer with the same transactionalId, or the producer's transaction has been expired by the broker.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜์—์„œ ์–ป์€ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„ ํ˜•์‹์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฆ„์— ์ ‘๋ฏธ์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ƒ์‚ฐ์ž๋Š” ๊ตฌ์„ฑ๋˜์—ˆ์ง€๋งŒ Kafka์˜ ํŠธ๋žœ์žญ์…˜์€ ๋ฉ”์‹œ์ง€ ๋ฒ”์œ„๋งŒ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋žœ์žญ์…˜ ์ƒํƒœ์— ๊ด€๊ณ„์—†์ด ๋ฉ”์‹œ์ง€๋Š” ์ฆ‰์‹œ ์ฃผ์ œ๋กœ ์ด๋™ํ•˜์ง€๋งŒ ์ถ”๊ฐ€ ์‹œ์Šคํ…œ ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์†Œ๋น„์ž๊ฐ€ ์ด๋Ÿฌํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฏธ๋ฆฌ ์ฝ์ง€ ๋ชปํ•˜๋„๋ก ํ•˜๋ ค๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ read_committed ๊ฐ’์œผ๋กœ. ์ด๋Ÿฌํ•œ ์†Œ๋น„์ž๋Š” ์ด์ „๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋น„ํŠธ๋žœ์žญ์…˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ปค๋ฐ‹ ํ›„์—๋งŒ ํŠธ๋žœ์žญ์…˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด์ „์— ๋‚˜์—ด๋œ ๋ชจ๋“  ์„ค์ •์„ ์ง€์ •ํ–ˆ๋‹ค๋ฉด ์ •ํ™•ํžˆ XNUMXํšŒ ์ „์†ก์„ ๊ตฌ์„ฑํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ถ•ํ•˜ํ•ด์š”!

๊ทธ๋Ÿฌ๋‚˜ ๋‰˜์•™์Šค๊ฐ€ ํ•˜๋‚˜ ๋” ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ๊ตฌ์„ฑํ•œ Transactional.id๋Š” ์‹ค์ œ๋กœ ํŠธ๋žœ์žญ์…˜ ์ ‘๋‘์‚ฌ์ž…๋‹ˆ๋‹ค. ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์ž์—๋Š” ์‹œํ€€์Šค ๋ฒˆํ˜ธ๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ˆ˜์‹ ๋œ ์‹๋ณ„์ž๋Š” ๋‹ค์Œ์—๊ฒŒ ๋ฐœ๊ธ‰๋ฉ๋‹ˆ๋‹ค. transactional.id.expiration.ms, Kafka ํด๋Ÿฌ์Šคํ„ฐ์— ๊ตฌ์„ฑ๋˜๋ฉฐ ๊ธฐ๋ณธ๊ฐ’์€ "7์ผ"์ž…๋‹ˆ๋‹ค. ์ด ์‹œ๊ฐ„ ๋™์•ˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ ๋‹ค์Œ ํŠธ๋žœ์žญ์…˜ ์ „์†ก์„ ์‹œ๋„ํ•  ๋•Œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. InvalidPidMappingException. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํŠธ๋žœ์žญ์…˜ ์ฝ”๋””๋„ค์ดํ„ฐ๋Š” ๋‹ค์Œ ํŠธ๋žœ์žญ์…˜์— ๋Œ€ํ•œ ์ƒˆ ์‹œํ€€์Šค ๋ฒˆํ˜ธ๋ฅผ ๋ฐœ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ InvalidPidMappingException์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”์‹œ์ง€๊ฐ€ ์†์‹ค๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ฉ๊ณ„ ๋Œ€์‹ 

๋ณด์‹œ๋‹ค์‹œํ”ผ ๋‹จ์ˆœํžˆ Kafka์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜ ์กฐํ•ฉ์„ ์„ ํƒํ•˜๊ณ  ๋น ๋ฅธ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์ค€๋น„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ์ •ํ™•ํžˆ XNUMXํšŒ ์ „๋‹ฌ ์„ค์ •์„ ์ž์„ธํžˆ ๋ณด์—ฌ์ฃผ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์ง๋ฉดํ•œ client.id ๋ฐ transactional.id ๊ตฌ์„ฑ๊ณผ ๊ด€๋ จ๋œ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ƒ์‚ฐ์ž ๋ฐ ์†Œ๋น„์ž ์„ค์ •์— ๋Œ€ํ•œ ์š”์•ฝ์ž…๋‹ˆ๋‹ค.

ํ”„๋กœ๋“€์„œ :

  1. ack = ๋ชจ๋‘
  2. ์žฌ์‹œ๋„ > 0
  3. ํ™œ์„ฑํ™”.๋ฉฑ๋“ฑ์„ฑ = true
  4. max.in.flight.requests.per.connection โ‰ค 5(์ˆœ์„œ๋Œ€๋กœ ์ „์†กํ•˜๋Š” ๊ฒฝ์šฐ 1)
  5. transactional.id = ${application-name}-${hostname}

์†Œ๋น„์ž:

  1. ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ = read_committed

ํ–ฅํ›„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์˜ค๋ฅ˜๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์—ด๋œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ค‘ ์ผ๋ถ€์— ๋Œ€ํ•œ ๊ฐ’์ด ์ด๋ฏธ ์„ค์ •๋˜์–ด ์žˆ๋Š” ์Šคํ”„๋ง ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ์ž์ฒด ๋ž˜ํผ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์ž์œจ ํ•™์Šต์„ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ž๋ฃŒ์ž…๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€