เบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เป€เบซเบ”เบเบฒเบ™เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบˆเบฒเบ Kafka

เบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เป€เบซเบ”เบเบฒเบ™เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบˆเบฒเบ Kafka

Hey Habr.

เป€เบกเบทเปˆเบญเบšเปเปˆเบ”เบปเบ™เบกเบฒเบ™เบตเป‰ I เปเบšเปˆเบ‡เบ›เบฑเบ™เบ›เบฐเบชเบปเบšเบเบฒเบ™เบ‚เบญเบ‡เบฅเบฒเบง เบเปˆเบฝเบงเบเบฑเบšเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป€เบ›เบฑเบ™เบ—เบตเบกเบชเปˆเบงเบ™เบซเบผเบฒเบเบกเบฑเบเบˆเบฐเปƒเบŠเป‰เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เบœเบฐเบฅเบดเบ”เปเบฅเบฐเบœเบนเป‰เบšเปเบฅเบดเป‚เบžเบ Kafka เป€เบžเบทเปˆเบญเป€เบ‚เบปเป‰เบฒเปƒเบเป‰เบเบฒเบ™เบˆเบฑเบ”เบชเบปเปˆเบ‡เบ—เบตเปˆเบฎเบฑเบšเบ›เบฐเบเบฑเบ™. เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบšเบญเบเบ—เปˆเบฒเบ™เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบˆเบฑเบ”เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ„เบทเบ™เปƒเบซเบกเปˆเบ‚เบญเบ‡เป€เบซเบ”เบเบฒเบ™เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบˆเบฒเบ Kafka เป€เบ›เบฑเบ™เบœเบปเบ™เบกเบฒเบˆเบฒเบเบเบฒเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป„เบ”เป‰เบŠเบปเปˆเบงเบ„เบฒเบงเบ‚เบญเบ‡เบฅเบฐเบšเบปเบšเบžเบฒเบเบ™เบญเบ.

เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบตเปˆเบ—เบฑเบ™เบชเบฐเป„เบซเบกเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™เบซเบผเบฒเบ. เป€เบซเบ”เบœเบปเบ™เบ—เบฒเบ‡เบ—เบธเบฅเบฐเบเบดเบ”เบซเปเปˆเบขเบนเปˆเปƒเบ™ stack เป€เบ•เบฑเบเป‚เบ™เป‚เบฅเบŠเบตเบ—เบตเปˆเบ—เบฑเบ™เบชเบฐเป„เบซเบก, เปเบฅเปˆเบ™เบขเบนเปˆเปƒเบ™เบฎเบนเบšเบžเบฒเบš Docker เบ„เบธเป‰เบกเบ„เบญเบ‡เป‚เบ”เบ orchestrator เป€เบŠเบฑเปˆเบ™ Kubernetes เบซเบผเบท OpenShift, เปเบฅเบฐเบ•เบดเบ”เบ•เปเปˆเบชเบทเปˆเบชเบฒเบ™เบเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบญเบทเปˆเบ™เป†เบซเบผเบทเบงเบดเบ—เบตเปเบเป‰เป„เบ‚เบงเบดเบชเบฒเบซเบฐเบเบดเบ”เป‚เบ”เบเบœเปˆเบฒเบ™เบฅเบฐเบšเบปเบšเบ•เปˆเบญเบ‡เป‚เบชเป‰เบ‚เบญเบ‡ routers เบ—เบฒเบ‡เบ”เป‰เบฒเบ™เบฎเปˆเบฒเบ‡เบเบฒเบเปเบฅเบฐ virtual. เปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ”เบฑเปˆเบ‡เบเปˆเบฒเบง, เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบชเบฒเบกเบฒเบ”เบ—เปเบฒเบฅเบฒเบเป„เบ”เป‰, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เป€เบซเบ”เบเบฒเบ™เบ„เบทเบ™เปƒเบซเบกเปˆเบ–เป‰เบฒเบฅเบฐเบšเบปเบšเบžเบฒเบเบ™เบญเบเบšเปเปˆเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป„เบ”เป‰เปเบกเปˆเบ™เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบ‚เบญเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ—เบธเบฅเบฐเบเบดเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ.

เบกเบฑเบ™เป€เบ›เบฑเบ™เปเบ™เบงเปƒเบ”เบเปˆเบญเบ™ Kafka

เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰ IBM MQ เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบปเปˆเบ‡เบ‚เปเป‰เบ„เบงเบฒเบก asynchronous. เบ–เป‰เบฒเบกเบตเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™, เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบชเบฒเบกเบฒเบ”เบ–เบทเบเบˆเบฑเบ”เปƒเบชเปˆเปƒเบ™เปเบ–เบงเบˆเบปเบ”เบซเบกเบฒเบเบ•เบฒเบ (DLQ) เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ„เบนเปˆเบกเบทเบ•เบทเปˆเบกเบญเบตเบ. DLQ เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เบขเบนเปˆเบ‚เป‰เบฒเบ‡เปเบ–เบงเบ—เบตเปˆเป€เบ‚เบปเป‰เบฒเบกเบฒ, เบ‚เปเป‰เบ„เบงเบฒเบกเบ–เบทเบเป‚เบญเบ™เบžเบฒเบเปƒเบ™ IBM MQ.

เบ–เป‰เบฒเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปเบกเปˆเบ™เบŠเบปเปˆเบงเบ„เบฒเบงเปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เบกเบฑเบ™เป„เบ”เป‰ (เบ•เบปเบงเบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™ ResourceAccessException เบขเบนเปˆเปƒเบ™เบเบฒเบ™เป‚เบ— HTTP เบซเบผเบท MongoTimeoutException เบขเบนเปˆเปƒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป MongoDb), เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบเบธเบ”เบ—เบฐเบชเบฒเบ”เบเบฒเบ™เบžเบฐเบเบฒเบเบฒเบกเปƒเบซเบกเปˆเบˆเบฐเบกเบตเบœเบปเบ™. เป‚เบ”เบเบšเปเปˆเบ„เปเบฒเบ™เบถเบ‡เป€เบ–เบดเบ‡เป€เบซเบ”เบœเบปเบ™เบ‚เบญเบ‡เบชเบฒเบ‚เบฒเบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™, เบ‚เปเป‰เบ„เบงเบฒเบกเบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบšเป„เบ”เป‰เบ–เบทเบเบเป‰เบฒเบเป„เบ›เบขเบนเปˆเปƒเบ™เปเบ–เบงเบฅเบฐเบšเบปเบšเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบปเปˆเบ‡เบ—เบตเปˆเบŠเบฑเบเบŠเป‰เบฒ, เบซเบผเบทเป„เบ›เบซเบฒเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบ—เบตเปˆเป€เบฎเบฑเบ”เบกเบฒเบ”เบปเบ™เปเบฅเป‰เบงเป€เบžเบทเปˆเบญเบชเบปเปˆเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเปƒเบซเบกเปˆ. เบ™เบตเป‰เบ›เบฐเบเบญเบšเบกเบตเบˆเปเบฒเบ™เบงเบ™เบเบฒเบ™เบชเบปเปˆเบ‡เบ„เบทเบ™เปƒเบ™เบชเปˆเบงเบ™เบซเบปเบงเบ‚เปเป‰เบ„เบงเบฒเบก, เป€เบŠเบดเปˆเบ‡เบœเบนเบเบกเบฑเบ”เบเบฑเบšเป„เบฅเบเบฐเบเบฒเบ™เบŠเบฑเบเบŠเป‰เบฒเบซเบผเบทเบˆเบธเบ”เบชเบดเป‰เบ™เบชเบธเบ”เบ‚เบญเบ‡เบเบธเบ”เบ—เบฐเบชเบฒเบ”เบฅเบฐเบ”เบฑเบšเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™. เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบกเบฒเบฎเบญเบ”เบˆเบธเบ”เบชเบดเป‰เบ™เบชเบธเบ”เบ‚เบญเบ‡เบเบธเบ”เบ—เบฐเบชเบฒเบ”เปเบ•เปˆเบฅเบฐเบšเบปเบšเบžเบฒเบเบ™เบญเบเบเบฑเบ‡เบšเปเปˆเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป„เบ”เป‰, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบˆเบฐเบ–เบทเบเบˆเบฑเบ”เปƒเบชเปˆเปƒเบ™ DLQ เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เปเบเบเบ„เบนเปˆเบกเบท.

เบŠเบญเบเบซเบฒเบงเบดเบ—เบตเปเบเป‰เป„เบ‚

เบŠเบญเบเบซเบฒเบขเบนเปˆเปƒเบ™เบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”, เบ—เปˆเบฒเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบŠเบญเบโ€‹เบซเบฒโ€‹เบ”เบฑเปˆเบ‡โ€‹เบ•เปเปˆโ€‹เป„เบ›โ€‹เบ™เบตเป‰โ€‹ เบเบฒเบ™เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆ. เปƒเบ™เบชเบฑเป‰เบ™, เบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเบชเบฐเป€เบซเบ™เบตเปƒเบซเป‰เบชเป‰เบฒเบ‡เบซเบปเบงเบ‚เปเป‰เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเป„เบฅเบเบฐเบเบฒเบ™เบŠเบฑเบเบŠเป‰เบฒเปเบฅเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบœเบนเป‰เบšเปเบฅเบดเป‚เบžเบเปƒเบ™เบ”เป‰เบฒเบ™เบ‚เป‰เบฒเบ‡, เป€เบŠเบดเปˆเบ‡เบˆเบฐเบญเปˆเบฒเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบŠเบฑเบเบŠเป‰เบฒเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™.

เบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เป€เบซเบ”เบเบฒเบ™เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบˆเบฒเบ Kafka

เป€เบ–เบดเบ‡เบงเปˆเบฒเบˆเบฐเบกเบตเบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เปƒเบ™เบ—เบฒเบ‡เบšเบงเบเบˆเปเบฒเบ™เบงเบ™เบซเบฅเบฒเบ, เบกเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบ‚เป‰เบญเบเบšเปเปˆเบ›เบฐเบชเบปเบšเบœเบปเบ™เบชเปเบฒเป€เบฅเบฑเบ”เบ—เบฑเบ‡เบซเบกเบปเบ”. เบเปˆเบญเบ™เบญเบทเปˆเบ™ เปเบปเบ”, เบเป‰เบญเบ™เบงเปˆเบฒเบœเบนเป‰เบžเบฑเบ”เบ—เบฐเบ™เบฒ, เบ™เบญเบเป€เบซเบ™เบทเบญเบˆเบฒเบเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ‚เบญเบ‡เบ—เบธเบฅเบฐเบเบดเบ”, เบˆเบฐเบ•เป‰เบญเบ‡เปƒเบŠเป‰เป€เบงเบฅเบฒเบซเบผเบฒเบเปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบปเบ™เป„เบเบ—เบตเปˆเป„เบ”เป‰เบญเบฐเบ—เบดเบšเบฒเบ.

เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบ–เป‰เบฒเบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบ–เบทเบเป€เบ›เบตเบ”เปƒเบŠเป‰เปƒเบ™เบเบธเปˆเบก Kafka, เบ—เปˆเบฒเบ™เบˆเบฐเบ•เป‰เบญเบ‡เปƒเบŠเป‰เป€เบงเบฅเบฒเปƒเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เบซเบปเบงเบ‚เปเป‰เปเบฅเบฐเบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบชเปเบฒเบฅเบฑเบšเบžเบงเบเป€เบ‚เบปเบฒ. เบ™เบญเบเป€เบซเบ™เบทเบญเป„เบ›เบˆเบฒเบเบ™เบตเป‰, เบ—เปˆเบฒเบ™เบˆเบฐเบ•เป‰เบญเบ‡เป€เบฅเบทเบญเบเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต retention.ms เบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบซเบปเบงเบ‚เปเป‰ retry เป€เบžเบทเปˆเบญเปƒเบซเป‰เบ‚เปเป‰เบ„เบงเบฒเบกเบกเบตเป€เบงเบฅเบฒเบ—เบตเปˆเบˆเบฐ reent เปเบฅเบฐเบšเปเปˆเบซเบฒเบเป„เบ›เบˆเบฒเบเบกเบฑเบ™. เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เปเบฅเบฐเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบˆเบฐเบ•เป‰เบญเบ‡เบŠเป‰เปเบฒเบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบšเปเบฅเบดเบเบฒเบ™เบ—เบตเปˆเบกเบตเบขเบนเปˆเปเบฅเป‰เบงเบซเบผเบทเปƒเบซเบกเปˆ.

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบเบปเบ™เป„เบเปƒเบ™เบžเบฒเบเบฎเบฝเบ™ spring เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›เปเบฅเบฐเบžเบฒเบเบฎเบฝเบ™ spring-kafka เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเปเบกเปˆเบ™เบชเบฐเบซเบ™เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบชเปเบฒเบฅเบฑเบš reprocessing เบ‚เปเป‰เบ„เบงเบฒเบก. Spring-kafka เบกเบตเบเบฒเบ™เป€เบžเบดเปˆเบ‡เบžเบฒเบญเบฒเป„เบชเปเบšเบšเบ‚เป‰เบฒเบกเบœเปˆเบฒเบ™เบ‚เบญเบ‡เบžเบฒเบเบฎเบฝเบ™ spring-retry, เป€เบŠเบดเปˆเบ‡เบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เบšเปเปˆเบกเบตเบ•เบปเบงเบ•เบปเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ„เบธเป‰เบกเบ„เบญเบ‡ BackOffPolicies เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™. เบ™เบตเป‰เปเบกเปˆเบ™เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบเบทเบ”เบซเบเบธเปˆเบ™เบžเปเบชเบปเบกเบ„เบงเบ™, เปเบ•เปˆเบ‚เปเป‰เบšเบปเบเบœเปˆเบญเบ‡เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบ‚เบญเบ‡เบกเบฑเบ™เปเบกเปˆเบ™เบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ‚เปเป‰เบ„เบงเบฒเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบปเปˆเบ‡เบ„เบทเบ™เปƒเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™. เบ™เบตเป‰เปเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบเบฒเบ™เบฃเบตเบชเบฐเบ•เบฒเบ”เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบเบฒเบ™เบญเบฑเบšเป€เบ”เบ” เบซเบผเบทเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™เบˆเบฐเบชเบปเปˆเบ‡เบœเบปเบ™เปƒเบซเป‰เบชเบนเบ™เป€เบชเบเบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบฑเบ‡เปเบปเบ”เบ—เบตเปˆเบเบฑเบ‡เบฅเปเบ–เป‰เบฒเบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ„เบทเบ™เปƒเปเปˆ. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบˆเบธเบ”เบ™เบตเป‰เปเบกเปˆเบ™เบชเปเบฒเบ„เบฑเบ™เบชเปเบฒเบฅเบฑเบšเบฅเบฐเบšเบปเบšเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเป„เบ”เป‰เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบกเบฑเบ™เบ•เบทเปˆเบกเบญเบตเบ.

spring-kafka เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบซเบผเบฒเบเบขเปˆเบฒเบ‡เบ‚เบญเบ‡ ContainerAwareErrorHandler, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡ SeekToCurrentErrorHandler, เบ—เบตเปˆโ€‹เบ—เปˆเบฒเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบ›เบฐโ€‹เบกเบงเบ™โ€‹เบœเบปเบ™โ€‹เบ‚เปเป‰โ€‹เบ„เบงเบฒเบกโ€‹เบ•เปเปˆโ€‹เบกเบฒโ€‹เป‚เบ”เบโ€‹เบšเปเปˆโ€‹เบกเบตโ€‹เบเบฒเบ™โ€‹เบ›เปˆเบฝเบ™โ€‹เปเบ›เบ‡โ€‹เบเบฒเบ™โ€‹เบŠเบปเบ”โ€‹เป€เบŠเบตเบโ€‹เปƒเบ™โ€‹เบเปโ€‹เบฅเบฐโ€‹เบ™เบตโ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹เบ„เบงเบฒเบกโ€‹เบœเบดเบ”โ€‹เบžเบฒเบ”โ€‹. เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบเป€เบงเบตเบŠเบฑเบ™เบ‚เบญเบ‡ spring-kafka 2.3, เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบ•เบฑเป‰เบ‡เบ„เปˆเบฒ BackOffPolicy.

เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบ–เบทเบเบ›เบธเบ‡เปเบ•เปˆเบ‡เบ„เบทเบ™เปƒเบซเบกเปˆเป€เบžเบทเปˆเบญเบขเบนเปˆเบฅเบญเบ”เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปƒเบซเบกเปˆเบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™, เปเบ•เปˆเบกเบฑเบ™เบเบฑเบ‡เบšเปเปˆเบกเบตเบเบปเบ™เป„เบ DLQ. เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เป€เบฅเบทเบญเบเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ™เบตเป‰เปƒเบ™เบ•เบญเบ™เบ•เบปเป‰เบ™เบ‚เบญเบ‡ 2019, เป€เบŠเบทเปˆเบญเบงเปˆเบฒเปƒเบ™เปเบ‡เปˆเบ”เบตเบงเปˆเบฒ DLQ เบˆเบฐเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™ (เบžเบงเบเป€เบฎเบปเบฒเป‚เบŠเบเบ”เบตเปเบฅเบฐเบ•เบปเบงเบˆเบดเบ‡เปเบฅเป‰เบงเบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบกเบฑเบ™เบซเบผเบฑเบ‡เบˆเบฒเบเบซเบผเบฒเบเป€เบ”เบทเบญเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบตเปˆเบกเบตเบฅเบฐเบšเบปเบšเบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง). เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบŠเบปเปˆเบงเบ„เบฒเบงเป€เบฎเบฑเบ”เปƒเบซเป‰ SeekToCurrentErrorHandler เป„เบŸเป„เปเป‰. เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญเป„เบ”เป‰เบ–เบทเบเบžเบดเบกเบญเบญเบเปƒเบ™เบšเบฑเบ™เบ—เบถเบ, เบชเบปเปˆเบ‡เบœเบปเบ™เปƒเบซเป‰เบกเบตเบเบฒเบ™เบŠเบปเบ”เป€เบŠเบตเบ, เปเบฅเบฐเบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡เบชเบทเบšเบ•เปเปˆเบเบฑเบšเบ‚เปเป‰เบ„เบงเบฒเบกเบ•เปเปˆเป„เบ›.

เบเบฒเบ™เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบชเบธเบ”เบ—เป‰เบฒเบ

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆ SeekToCurrentErrorHandler เป„เบ”เป‰เบเบฐเบ•เบธเป‰เบ™เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบžเบฑเบ”เบ—เบฐเบ™เบฒเบเบปเบ™เป„เบเบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบปเปˆเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเบ„เบทเบ™เปƒเบซเบกเปˆ.

เบเปˆเบญเบ™เบญเบทเปˆเบ™ เปเบปเบ”, เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰เบ›เบฐเบชเบปเบšเบเบฒเบ™เบ—เบตเปˆเบกเบตเบขเบนเปˆเปเบฅเบฐเบ‚เบฐเบซเบเบฒเบเบกเบฑเบ™เบ‚เบทเป‰เบ™เบเบฑเบšเป€เบซเบ”เบœเบปเบ™เบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™. เบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ•เบฒเบกเป€เบซเบ”เบœเบปเบ™เป€เบชเบฑเป‰เบ™, เบกเบฑเบ™เบˆเบฐเป€เบ›เบฑเบ™เบเบฒเบ™เบ”เบตเบ—เบตเปˆเบชเบธเบ”เบ—เบตเปˆเบˆเบฐเบขเบธเบ”เบเบฒเบ™เบญเปˆเบฒเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเปƒเบซเบกเปˆเปƒเบ™เป„เบฅเบเบฐเป€เบงเบฅเบฒเบชเบฑเป‰เบ™เป†เบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป‚เบ”เบเบเบธเบ”เบ—เบฐเบชเบฒเบ”เบเบฒเบ™เบฅเบญเบ‡เปƒเบซเบกเปˆ. เบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบญเบทเปˆเบ™เป†, เบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เบเบฒเบ™เบˆเบธเบ”เบ”เบฝเบงเบ—เบตเปˆเบˆเบฐเบšเบฑเบ‡เบ„เบฑเบšเปƒเบŠเป‰เบเบธเบ”เบ—เบฐเบชเบฒเบ”เบเบฒเบ™เบฅเบญเบ‡เปƒเบซเบกเปˆ. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบˆเบธเบ”เบ”เบฝเบงเบ™เบตเป‰เบ•เป‰เบญเบ‡เบกเบตเบซเบ™เป‰เบฒเบ—เบตเปˆ DLQ เบชเปเบฒเบฅเบฑเบšเบ—เบฑเบ‡เบชเบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™.

เบเบธเบ”เบ—เบฐเบชเบฒเบ”เบเบฒเบ™เบฅเบญเบ‡เปƒเบซเบกเปˆเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เบ•เป‰เบญเบ‡เบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™, เป€เบŠเบดเปˆเบ‡เบกเบตเบ„เบงเบฒเบกเบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเปƒเบ™เบเบฒเบ™เบ”เบถเบ‡เบ‚เปเป‰เบกเบนเบ™เป„เบฅเบเบฐเบ•เปเปˆเป„เบ›เป€เบกเบทเปˆเบญเบกเบตเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เบŠเบปเปˆเบงเบ„เบฒเบงเป€เบเบตเบ”เบ‚เบทเป‰เบ™.

เบเบฒเบ™เบขเบธเบ”เป€เบŠเบปเบฒเบœเบนเป‰เบšเปเบฅเบดเป‚เบžเบเบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ Linear Logic

เป€เบกเบทเปˆเบญเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบžเบฒเบเบฎเบฝเบ™ spring-kafka, เบฅเบฐเบซเบฑเบ”เป€เบžเบทเปˆเบญเบขเบธเบ”เบœเบนเป‰เบšเปเบฅเบดเป‚เบžเบเบญเบฒเบ”เบˆเบฐเบกเบตเบฅเบฑเบเบชเบฐเบ™เบฐเป€เบŠเบฑเปˆเบ™เบ™เบตเป‰:

public void pauseListenerContainer(MessageListenerContainer listenerContainer, 
                                   Instant retryAt) {
        if (nonNull(retryAt) && listenerContainer.isRunning()) {
            listenerContainer.stop();
            taskScheduler.schedule(() -> listenerContainer.start(), retryAt);
            return;
        }
        // to DLQ
    }

เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡, retryAt เปเบกเปˆเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบˆเบฐ restart MessageListenerContainer เบ–เป‰เบฒเบกเบฑเบ™เบเบฑเบ‡เปเบฅเปˆเบ™เบขเบนเปˆ. เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเปƒเบซเบกเปˆเบˆเบฐเป€เบเบตเบ”เบ‚เบทเป‰เบ™เปƒเบ™เบเบฐเบ—เบนเป‰เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบ—เบตเปˆเป€เบ›เบตเบ”เบ•เบปเบงเปƒเบ™ TaskScheduler, เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบชเบฐเบซเบ™เบญเบ‡เปƒเบซเป‰เป‚เบ”เบเบžเบฒเบเบฎเบฝเบ™ spring.

เบžเบงเบเป€เบฎเบปเบฒเบŠเบญเบเบซเบฒเบ„เปˆเบฒ retryAt เบ”เป‰เบงเบเบงเบดเบ—เบตเบ•เปเปˆเป„เบ›เบ™เบตเป‰:

  1. เบกเบนเบ™เบ„เปˆเบฒเบ‚เบญเบ‡เป€เบ„เบปเบฒเป€เบ•เบตเบเบฒเบ™เป‚เบ—เบ„เบทเบ™เปเบกเปˆเบ™เป€เบšเบดเปˆเบ‡เบ‚เบถเป‰เบ™.
  2. เบญเบตเบ‡เบ•เบฒเบกเบเบฒเบ™เบ™เบฑเบšเบกเบนเบ™เบ„เปˆเบฒ, เป„เบฅเบเบฐเบเบฒเบ™เบŠเบฑเบเบŠเป‰เบฒเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เปƒเบ™เบเบธเบ”เบ—เบฐเบชเบฒเบ”เบเบฒเบ™เบฅเบญเบ‡เปƒเบซเบกเปˆเปเบกเปˆเบ™เบŠเบญเบเบซเบฒ. เบเบธเบ”เบ—เบฐเบชเบฒเบ”เป„เบ”เป‰เบ–เบทเบเบ›เบฐเบเบฒเบ”เบขเบนเปˆเปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡; เบžเบงเบเป€เบฎเบปเบฒเป€เบฅเบทเบญเบเบฎเบนเบšเปเบšเบš JSON เป€เบžเบทเปˆเบญเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบกเบฑเบ™.
  3. เป„เบฅเบเบฐเบซเปˆเบฒเบ‡เบ—เบตเปˆเบžเบปเบšเป€เบซเบฑเบ™เบขเบนเปˆเปƒเบ™เบญเบฒเป€เบฃ JSON เบ›เบฐเบเบญเบšเบกเบตเบˆเปเบฒเบ™เบงเบ™เบงเบดเบ™เบฒเบ—เบตเบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบˆเบฐเบ•เป‰เบญเบ‡เบŠเป‰เปเบฒเบญเบตเบ. เบˆเปเบฒเบ™เบงเบ™เบงเบดเบ™เบฒเบ—เบตเบ™เบตเป‰เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเป€เบงเบฅเบฒเบ›เบฐเบˆเบธเบšเบฑเบ™เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบ„เปˆเบฒเบชเปเบฒเบฅเบฑเบš retryAt.
  4. เบ–เป‰เบฒเบšเปเปˆเบžเบปเบšเป„เบฅเบเบฐเบซเปˆเบฒเบ‡, เบ„เปˆเบฒเบ‚เบญเบ‡ retryAt เปเบกเปˆเบ™ null เปเบฅเบฐเบ‚เปเป‰เบ„เบงเบฒเบกเบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡เป„เบ›เบซเบฒ DLQ เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ„เบนเปˆเบกเบท.

เบ”เป‰เบงเบเบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰, เบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญเปเบกเปˆเบ™เป€เบžเบทเปˆเบญเบšเบฑเบ™เบ—เบถเบเบˆเปเบฒเบ™เบงเบ™เบเบฒเบ™เป‚เบ—เบŠเป‰เปเบฒเบเบฑเบ™เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบเปเบฒเบฅเบฑเบ‡เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™, เบ•เบปเบงเบขเปˆเบฒเบ‡เปƒเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™. เบเบฒเบ™เบฎเบฑเบเบชเบฒเบเบฒเบ™เบ™เบฑเบšเบเบฒเบ™เบžเบฐเบเบฒเบเบฒเบกเบ„เบทเบ™เปƒเบซเบกเปˆเปƒเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเปเบกเปˆเบ™เบšเปเปˆเบชเปเบฒเบ„เบฑเบ™เบชเปเบฒเบฅเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ logic เป€เบชเบฑเป‰เบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เบˆเบฑเบ”เบเบฒเบ™เบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”. เบšเปเปˆเบ„เบทเบเบฑเบšเบžเบฒเบเบฎเบฝเบ™ spring-retry, restart app เบˆเบฐเบšเปเปˆเป€เบฎเบฑเบ”เปƒเบซเป‰เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบชเบนเบ™เป€เบชเบเป„เบ›เป€เบžเบทเปˆเบญ reprocessed, เปเบ•เปˆเบžเบฝเบ‡เปเบ•เปˆเบˆเบฐ restart เบเบธเบ”เบ—เบฐเบชเบฒเบ”.

เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เบŠเปˆเบงเบเป€เบญเบปเบฒเบเบฒเบ™เป‚เบซเบผเบ”เบญเบญเบเบˆเบฒเบเบฅเบฐเบšเบปเบšเบžเบฒเบเบ™เบญเบ, เป€เบŠเบดเปˆเบ‡เบญเบฒเบ”เบˆเบฐเบšเปเปˆเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป„เบ”เป‰เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบเบฒเบ™เป‚เบซเบผเบ”เบซเบ™เบฑเบเบซเบผเบฒเบ. เปƒเบ™เบ„เปเบฒเบชเบฑเบšเบ•เปˆเบฒเบ‡เป†เบญเบทเปˆเบ™เป†, เบ™เบญเบเป€เบซเบ™เบทเบญเบˆเบฒเบเบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡เปƒเบซเบกเปˆ, เบžเบงเบเป€เบฎเบปเบฒเบšเบฑเบ™เบฅเบธเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบฎเบนเบšเปเบšเบš เบงเบปเบ‡เบˆเบญเบ™เบงเบปเบ‡เบˆเบญเบ™.

เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เบ‚เบญเบšเป€เบ‚เบ”เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปเบกเปˆเบ™เบžเบฝเบ‡เปเบ•เปˆ 1, เปเบฅเบฐเป€เบžเบทเปˆเบญเบซเบผเบธเบ”เบœเปˆเบญเบ™เบเบฒเบ™เบขเบธเบ”เบฅเบฐเบšเบปเบšเป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบเบฒเบ™เบขเบธเบ”เบŠเบปเปˆเบงเบ„เบฒเบงเบ‚เบญเบ‡เป€เบ„เบทเบญเบ‚เปˆเบฒเบ, เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰เบเบธเบ”เบ—เบฐเบชเบฒเบ”เบเบฒเบ™เบžเบฐเบเบฒเบเบฒเบกเปƒเบซเบกเปˆเบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบฅเบฐเบญเบฝเบ”เบซเบผเบฒเบเบ—เบตเปˆเบกเบตเป„เบฅเบเบฐเบเบฒเบ™ latency เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบ. เบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเบšเปเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบเบธเปˆเบกเบ—เบฑเบ‡เบซเบกเบปเบ”, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ„เบงเบฒเบกเบชเปเบฒเบžเบฑเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบ‚เบญเบšเป€เบ‚เบ”เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปเบฅเบฐเบ„เปˆเบฒเป„เบฅเบเบฐเบซเปˆเบฒเบ‡เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ„เบฑเบ”เป€เบฅเบทเบญเบเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบ„เบธเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ‚เบญเบ‡เบฅเบฐเบšเบปเบš.

เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบˆเบฒเบเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบตเปˆเบกเบตเป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเบšเปเปˆเบเปเบฒเบ™เบปเบ”

เบ™เบตเป‰เปเบกเปˆเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบชเบปเปˆเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเป„เบ›เบซเบฒเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง (Retryer), เป€เบŠเบดเปˆเบ‡เบˆเบฐเบชเบปเปˆเบ‡เป„เบ›เบ—เบตเปˆเบซเบปเบงเบ‚เปเป‰ DESTINATION เป€เบกเบทเปˆเบญเบฎเบญเบ”เป€เบงเบฅเบฒ RETRY_AT:


public <K, V> void retry(ConsumerRecord<K, V> record, String retryToTopic, 
                         Instant retryAt, String counter, String groupId, Exception e) {
        Headers headers = ofNullable(record.headers()).orElse(new RecordHeaders());
        List<Header> arrayOfHeaders = 
            new ArrayList<>(Arrays.asList(headers.toArray()));
        updateHeader(arrayOfHeaders, GROUP_ID, groupId::getBytes);
        updateHeader(arrayOfHeaders, DESTINATION, retryToTopic::getBytes);
        updateHeader(arrayOfHeaders, ORIGINAL_PARTITION, 
                     () -> Integer.toString(record.partition()).getBytes());
        if (nonNull(retryAt)) {
            updateHeader(arrayOfHeaders, COUNTER, counter::getBytes);
            updateHeader(arrayOfHeaders, SEND_TO, "retry"::getBytes);
            updateHeader(arrayOfHeaders, RETRY_AT, retryAt.toString()::getBytes);
        } else {
            updateHeader(arrayOfHeaders, REASON, 
                         ExceptionUtils.getStackTrace(e)::getBytes);
            updateHeader(arrayOfHeaders, SEND_TO, "backout"::getBytes);
        }
        ProducerRecord<K, V> messageToSend =
            new ProducerRecord<>(retryTopic, null, null, record.key(), record.value(), arrayOfHeaders);
        kafkaTemplate.send(messageToSend);
    }

เบ•เบปเบงเบขเปˆเบฒเบ‡เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบงเปˆเบฒเบ‚เปเป‰เบกเบนเบ™เบˆเปเบฒเบ™เบงเบ™เบซเบฅเบฒเบเบ–เบทเบเบชเบปเปˆเบ‡เบขเบนเปˆเปƒเบ™เบชเปˆเบงเบ™เบซเบปเบง. เบกเบนเบ™เบ„เปˆเบฒเบ‚เบญเบ‡ RETRY_AT เปเบกเปˆเบ™เบžเบปเบšเปƒเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบเบปเบ™เป„เบเบเบฒเบ™เบžเบฐเบเบฒเบเบฒเบกเบ„เบทเบ™เปƒเปเปˆเบœเปˆเบฒเบ™เบˆเบธเบ”เบขเบธเบ”เบ‚เบญเบ‡เบœเบนเป‰เบšเปเบฅเบดเป‚เบžเบ. เบ™เบญเบเบˆเบฒเบ DESTINATION เปเบฅเบฐ RETRY_AT เบžเบงเบเป€เบฎเบปเบฒเบœเปˆเบฒเบ™:

  • GROUP_ID, เป‚เบ”เบเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบˆเบฑเบ”เบเบธเปˆเบกเบ‚เปเป‰เบ„เบงเบฒเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ„เบนเปˆเบกเบทเปเบฅเบฐเบเบฒเบ™เบ„เบปเป‰เบ™เบซเบฒเบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบ.
  • ORIGINAL_PARTITION เป€เบžเบทเปˆเบญเบžเบฐเบเบฒเบเบฒเบกเบฎเบฑเบเบชเบฒเบœเบนเป‰เบšเปเบฅเบดเป‚เบžเบเบ”เบฝเบงเบเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡เบ„เบทเบ™เปƒเบซเบกเปˆ. เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบ›เบฑเบ™ null, เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบเบฒเบ™เปเบšเปˆเบ‡เบ›เบฑเบ™เปƒเบซเบกเปˆเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเป‚เบ”เบเปƒเบŠเป‰เบ›เบธเปˆเบก record.key() เบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš.
  • เบญเบฑเบšเป€เบ”เบ”เบ„เปˆเบฒ COUNTER เป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเบเบธเบ”เบ—เบฐเบชเบฒเบ”เบเบฒเบ™เบฅเบญเบ‡เบญเบตเบเบ„เบฑเป‰เบ‡.
  • SEND_TO เปเบกเปˆเบ™เบ•เบปเบงเบŠเบตเป‰เบšเบญเบเบ„เบปเบ‡เบ—เบตเปˆเบงเปˆเบฒเบ‚เปเป‰เบ„เบงเบฒเบกเบ–เบทเบเบชเบปเปˆเบ‡เป€เบžเบทเปˆเบญเบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ„เบทเบ™เปƒเปเปˆเป€เบกเบทเปˆเบญเบฎเบญเบ” RETRY_AT เบซเบผเบทเบงเบฒเบ‡เป„เบงเป‰เปƒเบ™ DLQ.
  • เป€เบซเบ”เบœเบปเบ™ - เป€เบซเบ”เบœเบปเบ™เบงเปˆเบฒเป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบ–เบทเบเบฅเบปเบšเบเบงเบ™.

Retryer เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ‚เปเป‰เบ„เบงเบฒเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบปเปˆเบ‡เบ„เบทเบ™เปเบฅเบฐเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡เปƒเบ™ PostgreSQL. เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบšเป€เบงเบฅเบฒเป€เบฅเบตเปˆเบกเบงเบฝเบเบ‡เบฒเบ™เบ—เบตเปˆเบŠเบญเบเบซเบฒเบ‚เปเป‰เบ„เบงเบฒเบกเบ”เป‰เบงเบ RETRY_AT เปเบฅเบฐเบชเบปเปˆเบ‡เบžเบงเบเบกเบฑเบ™เบเบฑเบšเบ„เบทเบ™เป„เบ›เบซเบฒเบžเบฒเบเบชเปˆเบงเบ™ ORIGINAL_PARTITION เบ‚เบญเบ‡เบซเบปเบงเบ‚เปเป‰ DESTINATION เบ”เป‰เบงเบเบฅเบฐเบซเบฑเบ” record.key().

เป€เบกเบทเปˆเบญเบชเบปเปˆเบ‡เปเบฅเป‰เบง, เบ‚เปเป‰เบ„เบงเบฒเบกเบˆเบฐเบ–เบทเบเบฅเบถเบšเบญเบญเบเบˆเบฒเบ PostgreSQL. เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ‚เปเป‰เบ„เบงเบฒเบกเบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡เป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™ UI เบ‡เปˆเบฒเบเป†เบ—เบตเปˆเบžเบปเบงเบžเบฑเบ™เบเบฑเบš Retryer เบœเปˆเบฒเบ™ REST API. เบฅเบฑเบเบชเบฐเบ™เบฐเบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡เบกเบฑเบ™เปเบกเปˆเบ™เบเบฒเบ™เบชเบปเปˆเบ‡เบ„เบทเบ™เบซเบผเบทเบฅเบถเบšเบ‚เปเป‰เบ„เบงเบฒเบกเบˆเบฒเบ DLQ, เป€เบšเบดเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปเบฅเบฐเบเบฒเบ™เบŠเบญเบเบซเบฒเบ‚เปเป‰เบ„เบงเบฒเบก, เบ•เบปเบงเบขเปˆเบฒเบ‡เป‚เบ”เบเบŠเบทเปˆเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”.

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป„เบ”เป‰เบ–เบทเบเป€เบ›เบตเบ”เปƒเบŠเป‰เบขเบนเปˆเปƒเบ™เบเบธเปˆเบกเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เบกเบฑเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเป‰เบญเบ‡เบ‚เปเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบซเบปเบงเบ‚เปเป‰เบ—เบตเปˆ Retryer เบเปเบฒเบฅเบฑเบ‡เบŸเบฑเบ‡เบ•เบทเปˆเบกเบญเบตเบ, เปเบฅเบฐเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰ Retryer เบ‚เบฝเบ™เป„เบ›เบซเบฒเบซเบปเบงเบ‚เปเป‰ DESTINATION. เบ™เบตเป‰เปเบกเปˆเบ™เบ„เบงเบฒเบกเบšเปเปˆเบชเบฐเบ”เบงเบ, เปเบ•เปˆ, เบšเปเปˆเป€เบซเบกเบทเบญเบ™เบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เบซเบปเบงเบ‚เปเป‰เป„เบฅเบเบฐเบซเปˆเบฒเบ‡, เบžเบงเบเป€เบฎเบปเบฒเบกเบต DLQ เปเบฅเบฐ UI เป€เบ•เบฑเบกเบฎเบนเบšเปเบšเบšเป€เบžเบทเปˆเบญเบˆเบฑเบ”เบเบฒเบ™เบกเบฑเบ™.

เบกเบตเบšเบฒเบ‡เบเปเบฅเบฐเบ™เบตเป€เบกเบทเปˆเบญเบซเบปเบงเบ‚เปเป‰เบ—เบตเปˆเป€เบ‚เบปเป‰เบฒเบกเบฒเบ–เบทเบเบญเปˆเบฒเบ™เป‚เบ”เบเบเบธเปˆเบกเบœเบนเป‰เบšเปเบฅเบดเป‚เบžเบเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบซเบผเบฒเบ, เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™. เบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบ„เบทเบ™เปƒเปเปˆเบœเปˆเบฒเบ™ Retryer เบชเบณเบฅเบฑเบšเปœเบถเปˆเบ‡เปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบˆเบฐเบชเบปเปˆเบ‡เบœเบปเบ™เปƒเบซเป‰เบŠเป‰เบณเบเบฑเบšเบญเบตเบเบญเบฑเบ™เปœเบถเปˆเบ‡. เป€เบžเบทเปˆเบญเบ›เป‰เบญเบ‡เบเบฑเบ™เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เบซเบปเบงเบ‚เปเป‰เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡เบ„เบทเบ™เปƒเบซเบกเปˆ. เบซเบปเบงเบ‚เปเป‰เบ—เบตเปˆเป€เบ‚เบปเป‰เบฒเบกเบฒเปเบฅเบฐเบฅเบญเบ‡เปƒเบซเบกเปˆเบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เป„เบ”เป‰เป‚เบ”เบเบœเบนเป‰เบšเปเบฅเบดเป‚เบžเบเบ”เบฝเบงเบเบฑเบ™เป‚เบ”เบเบšเปเปˆเบกเบตเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เปƒเบ”เป†.

เบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เป€เบซเบ”เบเบฒเบ™เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบˆเบฒเบ Kafka

เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เบšเปเปˆเป„เบ”เป‰เบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เบ—เปเบฒเบ‡เบฒเบ™เบ‚เบญเบ‡ breaker เบงเบปเบ‡เบˆเบญเบ™, เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบ–เบทเบเป€เบžเบตเปˆเบกเป€เบ‚เบปเป‰เบฒเปƒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ spring-cloud-netflix เบซเบผเบทเปƒเบซเบกเปˆ เบ•เบปเบงเบ•เบฑเบ”เบงเบปเบ‡เบˆเบญเบ™เบŸเบฑเบ‡เบžเบฒเบเบฎเบฝเบ™ spring, เบซเปเปˆเบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบšเปˆเบญเบ™เบ—เบตเปˆเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบžเบฒเบเบ™เบญเบเบ–เบทเบเป€เบญเบตเป‰เบ™เบงเปˆเบฒเป€เบ›เบฑเบ™ abstractions เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบก. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเป€เบฅเบทเบญเบเป€เบญเบปเบฒเบเบธเบ”เบ—เบฐเบชเบฒเบ”เบชเปเบฒเบฅเบฑเบš เบ›เบฐเบฅเบดเบกเบฒเบ™ เบฎเบนเบšเปเบšเบš, เป€เบŠเบดเปˆเบ‡เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”. เบ•เบปเบงเบขเปˆเบฒเบ‡, เปƒเบ™เบžเบฒเบเบฎเบฝเบ™ spring-cloud-netflix เบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™เบชเบฐเบ™เบธเบเป€เบเบต thread เบซเบผเบท semaphore.

เบชเบฐเบซเบฅเบธเบš

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบ—เบตเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเป€เบฎเบฑเบ”เบŠเป‰เปเบฒเบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบฅเบฐเบšเบปเบšเบžเบฒเบเบ™เบญเบเปƒเบ”เบšเปเปˆเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป„เบ”เป‰เบŠเบปเปˆเบงเบ„เบฒเบง.

เบซเบ™เบถเปˆเบ‡เปƒเบ™เบ‚เปเป‰เป„เบ”เป‰เบ›เบฝเบšเบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเปเบกเปˆเบ™เบงเปˆเบฒเบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป‚เบ”เบเบฅเบฐเบšเบปเบšเบžเบฒเบเบ™เบญเบเบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เบเบธเปˆเบก Kafka เบ”เบฝเบงเบเบฑเบ™, เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบ”เบฑเบ”เปเบ›เบ‡เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบขเบนเปˆเบ‚เป‰เบฒเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ! เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบžเบฝเบ‡เปเบ•เปˆเบˆเบฐเบ•เป‰เบญเบ‡เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบซเบปเบงเบ‚เปเป‰ retry, เบ•เบทเปˆเบกเบ‚เปเป‰เบกเบนเบ™เปƒเบชเปˆเปƒเบ™เบšเบฒเบ‡เบชเปˆเบงเบ™เบซเบปเบง Kafka เปเบฅเบฐเบชเบปเปˆเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเป„เบ›เบซเบฒ Retryer. เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบเบปเบเบชเบนเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™เปƒเบ”เป†. เปเบฅเบฐเป€เบžเบทเปˆเบญเบซเบผเบธเบ”เบœเปˆเบญเบ™เบˆเปเบฒเบ™เบงเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบ–เบทเบเป‚เบญเบ™เบˆเบฒเบเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เป„เบ›เบซเบฒ Retryer เปเบฅเบฐเบเบฑเบšเบ„เบทเบ™, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบเปเบฒเบ™เบปเบ”เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบตเปˆเบกเบตเป€เบซเบ”เบœเบปเบ™เป€เบชเบฑเป‰เบ™เปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ„เบทเบ™เปƒเบซเบกเปˆเป‚เบ”เบเบœเปˆเบฒเบ™เบเบฒเบ™เบขเบธเบ”เบ‚เบญเบ‡เบœเบนเป‰เบšเปเบฅเบดเป‚เบžเบ.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™