ํค์ด ํ๋ธ๋ฅด!
์ ๋ ์์ฒด ์๋ฆผ ์ผํฐ๋ฅผ ๊ฐ๋ฐํ๋ 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 ๊ตฌ์ฑ๊ณผ ๊ด๋ จ๋ ๋ช ๊ฐ์ง ๋ฌธ์ ๋ฅผ ์ค๋ช ํ์ต๋๋ค. ๋ค์์ ์์ฐ์ ๋ฐ ์๋น์ ์ค์ ์ ๋ํ ์์ฝ์ ๋๋ค.
ํ๋ก๋์ :
- ack = ๋ชจ๋
- ์ฌ์๋ > 0
- ํ์ฑํ.๋ฉฑ๋ฑ์ฑ = true
- max.in.flight.requests.per.connection โค 5(์์๋๋ก ์ ์กํ๋ ๊ฒฝ์ฐ 1)
- transactional.id = ${application-name}-${hostname}
์๋น์:
- ๊ฒฉ๋ฆฌ ์์ค = read_committed
ํฅํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ค๋ฅ๋ฅผ ์ต์ํํ๊ธฐ ์ํด ๋์ด๋ ๋งค๊ฐ๋ณ์ ์ค ์ผ๋ถ์ ๋ํ ๊ฐ์ด ์ด๋ฏธ ์ค์ ๋์ด ์๋ ์คํ๋ง ๊ตฌ์ฑ์ ๋ํ ์์ฒด ๋ํผ๋ฅผ ๋ง๋ค์์ต๋๋ค.
๋ค์์ ์์จ ํ์ต์ ์ํ ๋ช ๊ฐ์ง ์๋ฃ์ ๋๋ค.
์ถ์ฒ : habr.com