ํค์ด ํ๋ธ๋ฅด.
์ต๊ทผ์ ๋๋
์ต์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋งค์ฐ ๋ณต์กํ ํ๊ฒฝ์์ ์๋ํฉ๋๋ค. ํ๋ ๊ธฐ์ ์คํ์ผ๋ก ๊ฐ์ธ์ธ ๋น์ฆ๋์ค ๋ก์ง์ Kubernetes ๋๋ OpenShift์ ๊ฐ์ ์ค์ผ์คํธ๋ ์ดํฐ๊ฐ ๊ด๋ฆฌํ๋ Docker ์ด๋ฏธ์ง์์ ์คํ๋๋ฉฐ ๋ฌผ๋ฆฌ์ ๋ฐ ๊ฐ์ ๋ผ์ฐํฐ ์ฒด์ธ์ ํตํด ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ๋๋ ์ํฐํ๋ผ์ด์ฆ ์๋ฃจ์ ๊ณผ ํต์ ํฉ๋๋ค. ์ด๋ฌํ ํ๊ฒฝ์์๋ ํญ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ์ธ๋ถ ์์คํ ์ค ํ๋๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ์ด๋ฒคํธ๋ฅผ ์ฌ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๋น์ฆ๋์ค ํ๋ก์ธ์ค์ ์ค์ํ ๋ถ๋ถ์ ๋๋ค.
์นดํ์นด ์ด์ ์๋ ์ด๋ ๋์?
ํ๋ก์ ํธ ์ด๊ธฐ์๋ ๋น๋๊ธฐ์ ๋ฉ์์ง ์ ๋ฌ์ ์ํด IBM MQ๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ์๋น์ค ์์ ์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์์ ๋ ๋ฉ์์ง๋ ์ถ๊ฐ ์๋ ๊ตฌ๋ฌธ ๋ถ์์ ์ํด DLQ(๋ฐฐ๋ฌ ๋ชปํ ํธ์ง ๋๊ธฐ์ด)์ ๋ฐฐ์น๋ ์ ์์ต๋๋ค. DLQ๋ ์์ ํ ์์ ์์ฑ๋์์ผ๋ฉฐ ๋ฉ์์ง๋ IBM MQ ๋ด๋ถ๋ก ์ ์ก๋์์ต๋๋ค.
์ค๋ฅ๊ฐ ์ผ์์ ์ด๊ณ ์ด๋ฅผ ํ์ธํ ์ ์๋ ๊ฒฝ์ฐ(์: HTTP ํธ์ถ์ ResourceAccessException ๋๋ MongoDb ์์ฒญ์ MongoTimeoutException) ์ฌ์๋ ์ ๋ต์ด ์ ์ฉ๋ฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ถ๊ธฐ ๋ ผ๋ฆฌ์ ๊ด๊ณ์์ด ์๋ ๋ฉ์์ง๋ ์ง์ฐ ์ ์ก์ ์ํด ์์คํ ํ๋ก ์ด๋๋๊ฑฐ๋ ๋ฉ์์ง๋ฅผ ์ฌ์ ์กํ๊ธฐ ์ํด ์ค๋ ์ ์ ๋ง๋ค์ด์ง ๋ณ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์ด๋๋์์ต๋๋ค. ์ฌ๊ธฐ์๋ ์ง์ฐ ๊ฐ๊ฒฉ ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ค ์ ๋ต์ ๋๊ณผ ์ฐ๊ฒฐ๋ ๋ฉ์์ง ํค๋์ ์ฌ์ ์ก ๋ฒํธ๊ฐ ํฌํจ๋ฉ๋๋ค. ์ ๋ต์ด ๋๋ฌ์ง๋ง ์ธ๋ถ ์์คํ ์ ์ฌ์ ํ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ์๋ ๊ตฌ๋ฌธ ๋ถ์์ ์ํด ๋ฉ์์ง๊ฐ DLQ์ ๋ฐฐ์น๋ฉ๋๋ค.
์๋ฃจ์ ๊ฒ์
๋ง์ ๊ธ์ ์ ์ธ ๋ฆฌ๋ทฐ์๋ ๋ถ๊ตฌํ๊ณ ์์ ํ ์ฑ๊ณตํ์ง๋ ๋ชปํ ๊ฒ ๊ฐ์ต๋๋ค. ์ฐ์ , ๊ฐ๋ฐ์๋ ๋น์ฆ๋์ค ์๊ตฌ ์ฌํญ์ ๊ตฌํํ๋ ๊ฒ ์ธ์๋ ์ค๋ช ๋ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํ๋ ๋ฐ ๋ง์ ์๊ฐ์ ์๋นํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ํ Kafka ํด๋ฌ์คํฐ์์ ์ก์ธ์ค ์ ์ด๊ฐ ํ์ฑํ๋ ๊ฒฝ์ฐ ์ฃผ์ ๋ฅผ ์์ฑํ๊ณ ํ์ํ ์ก์ธ์ค ๊ถํ์ ์ ๊ณตํ๋ ๋ฐ ์๊ฐ์ ํฌ์ํด์ผ ํฉ๋๋ค. ๋ํ ๋ฉ์์ง๊ฐ ์ฌ์ ์ก๋ ์๊ฐ์ ๊ฐ๊ณ ๋ฉ์์ง์์ ์ฌ๋ผ์ง์ง ์๋๋ก ๊ฐ ์ฌ์๋ ํญ๋ชฉ์ ๋ํด ์ฌ๋ฐ๋ฅธtention.ms ๋งค๊ฐ ๋ณ์๋ฅผ ์ ํํด์ผ ํฉ๋๋ค. ๊ธฐ์กด ์๋น์ค๋ ์ ๊ท ์๋น์ค ๊ฐ๊ฐ์ ๋ํด ์ก์ธ์ค ๊ตฌํ ๋ฐ ์์ฒญ์ ๋ฐ๋ณตํด์ผ ํฉ๋๋ค.
์ด์ ๋ฉ์์ง ์ฌ์ฒ๋ฆฌ๋ฅผ ์ํด ์ผ๋ฐ์ ์ผ๋ก spring-kafka๊ฐ ์ ๊ณตํ๋ ๋ฉ์ปค๋์ฆ์ด ๋ฌด์์ธ์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค. Spring-kafka๋ ๋ค์ํ BackOffPolicy๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ์ถ์ํ๋ฅผ ์ ๊ณตํ๋ spring-retry์ ๋ํ ์ ์ด์ ์ข ์์ฑ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๋ ์๋นํ ์ ์ฐํ ๋๊ตฌ์ด์ง๋ง ์ ํ๋ฆฌ์ผ์ด์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ์ ์กํ๊ธฐ ์ํด ๋ฉ์์ง๋ฅผ ์ ์ฅํ๋ค๋ ๊ฒ์ด ์ค์ํ ๋จ์ ์ ๋๋ค. ์ฆ, ์ ๋ฐ์ดํธ๋ ์์ ์ค๋ฅ๋ก ์ธํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ ์์ํ๋ฉด ์ฌ์ฒ๋ฆฌ๋ฅผ ๋ณด๋ฅ ์ค์ธ ๋ชจ๋ ๋ฉ์์ง๊ฐ ์์ค๋ฉ๋๋ค. ์ด ์ ์ ์ฐ๋ฆฌ ์์คํ ์ ๋งค์ฐ ์ค์ํ๋ฏ๋ก ๋ ์ด์ ๊ณ ๋ คํ์ง ์์์ต๋๋ค.
spring-kafka ์์ฒด๋ ContainerAwareErrorHandler์ ์ฌ๋ฌ ๊ตฌํ์ ์ ๊ณตํฉ๋๋ค. ์๋ฅผ ๋ค์ด
์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์ฌ์ฒ๋ฆฌ๋ ๋ฉ์์ง๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ ์์ํด๋ ์ด์๋จ์ ์ ์์ง๋ง ์์ง DLQ ๋ฉ์ปค๋์ฆ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ 2019๋ ์ด์ DLQ๊ฐ ํ์ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ๋๊ด์ ์ผ๋ก ๋ฏฟ๊ณ ์ด ์ต์ ์ ์ ํํ์ต๋๋ค(์ด์ด ์ข์๊ณ ์ด๋ฌํ ์ฌ์ฒ๋ฆฌ ์์คํ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ช ๋ฌ ๋์ ์ด์ํ ํ์๋ ์ค์ ๋ก๋ ํ์ํ์ง ์์์ต๋๋ค). ์ผ์์ ์ธ ์ค๋ฅ๋ก ์ธํด SeekToCurrentErrorHandler๊ฐ ์คํ๋์์ต๋๋ค. ๋๋จธ์ง ์ค๋ฅ๋ ๋ก๊ทธ์ ์ธ์๋์ด ์คํ์ ์ด ๋ฐ์ํ๊ณ ๋ค์ ๋ฉ์์ง์์ ์ฒ๋ฆฌ๊ฐ ๊ณ์๋์์ต๋๋ค.
์ต์ข ๊ฒฐ์
SeekToCurrentErrorHandler๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ๊ตฌํ์ ํตํด ๋ฉ์์ง ์ฌ์ ์ก์ ์ํ ์์ฒด ๋ฉ์ปค๋์ฆ์ ๊ฐ๋ฐํ๊ฒ ๋์์ต๋๋ค.
์ฐ์ ๊ธฐ์กด ๊ฒฝํ์ ํ์ฉํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง์ ๋ฐ๋ผ ํ์ฅํ๊ณ ์ถ์์ต๋๋ค. ์ ํ ๋ ผ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ์ฌ์๋ ์ ๋ต์ ์ง์ ๋ ์งง์ ๊ธฐ๊ฐ ๋์ ์ ๋ฉ์์ง ์ฝ๊ธฐ๋ฅผ ์ค์งํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ์ฌ์๋ ์ ๋ต์ ์ํํ๋ ๋จ์ผ ์ง์ ์ ๊ฐ๊ณ ์ถ์์ต๋๋ค. ๋ํ ์ด ๋จ์ผ ์ง์ ์๋ ๋ ์ ๊ทผ ๋ฐฉ์ ๋ชจ๋์ ๋ํ DLQ ๊ธฐ๋ฅ์ด ์์ด์ผ ํฉ๋๋ค.
์ฌ์๋ ์ ๋ต ์์ฒด๋ ์ผ์์ ์ธ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๋ ๋ค์ ๊ฐ๊ฒฉ์ ๊ฒ์ํ๋ ์ญํ ์ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฅ๋์ด์ผ ํฉ๋๋ค.
์ ํ ๋ ผ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ์๋น์ ์ค์ง
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๋ MessageListenerContainer๊ฐ ์์ง ์คํ ์ค์ธ ๊ฒฝ์ฐ ์ด๋ฅผ ๋ค์ ์์ํ๋ ์๊ฐ์ ๋๋ค. ๋ค์ ์์์ TaskScheduler์์ ์์๋ ๋ณ๋์ ์ค๋ ๋์์ ๋ฐ์ํ๋ฉฐ ๊ทธ ๊ตฌํ๋ Spring์์ ์ ๊ณต๋ฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก retryAt ๊ฐ์ ์ฐพ์ต๋๋ค.
- ๋ฆฌ์ฝ ์นด์ดํฐ์ ๊ฐ์ ์กฐํํฉ๋๋ค.
- ์นด์ดํฐ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ฌ์๋ ์ ๋ต์ ํ์ฌ ์ง์ฐ ๊ฐ๊ฒฉ์ ๊ฒ์ํฉ๋๋ค. ์ ๋ต์ ์ ํ๋ฆฌ์ผ์ด์ ์์ฒด์์ ์ ์ธ๋๋ฉฐ ์ด๋ฅผ ์ ์ฅํ๊ธฐ ์ํด JSON ํ์์ ์ ํํ์ต๋๋ค.
- JSON ๋ฐฐ์ด์ ์๋ ๊ฐ๊ฒฉ์๋ ์ฒ๋ฆฌ๋ฅผ ๋ฐ๋ณตํด์ผ ํ๋ ์๊ฐ(์ด)์ด ํฌํจ๋ฉ๋๋ค. ์ด ์ด ์๋ ํ์ฌ ์๊ฐ์ ์ถ๊ฐ๋์ด retryAt ๊ฐ์ ํ์ฑํฉ๋๋ค.
- ๊ฐ๊ฒฉ์ ์ฐพ์ ์ ์์ผ๋ฉด retryAt ๊ฐ์ null์ด๊ณ ๋ฉ์์ง๋ ์๋ ๊ตฌ๋ฌธ ๋ถ์์ ์ํด DLQ๋ก ์ ์ก๋ฉ๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ํ์ฌ ์ฒ๋ฆฌ ์ค์ธ ๊ฐ ๋ฉ์์ง์ ๋ํ ๋ฐ๋ณต ํธ์ถ ํ์(์: ์ ํ๋ฆฌ์ผ์ด์ ๋ฉ๋ชจ๋ฆฌ)๋ฅผ ์ ์ฅํ๋ ๊ฒ๋ง ๋จ์ต๋๋ค. ์ ํ ๋ ผ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฒด ์ฒ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด ์ ๊ทผ ๋ฐฉ์์์๋ ์ฌ์๋ ํ์๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์งํ๋ ๊ฒ์ด ์ค์ํ์ง ์์ต๋๋ค. spring-retry์ ๋ฌ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ ์์ํ๋ฉด ๋ชจ๋ ๋ฉ์์ง๊ฐ ์์ค๋์ด ์ฌ์ฒ๋ฆฌ๋์ง ์๊ณ ๋จ์ํ ์ ๋ต์ด ๋ค์ ์์๋ฉ๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ ๋งค์ฐ ๋์ ๋ก๋๋ก ์ธํด ์ฌ์ฉํ ์ ์๋ ์ธ๋ถ ์์คํ
์ ๋ก๋๋ฅผ ์ค์ด๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ฆ, ์ฌ์ฒ๋ฆฌ ์ธ์๋ ํจํด ๊ตฌํ์ ๋ฌ์ฑํ์ต๋๋ค.
์ฐ๋ฆฌ์ ๊ฒฝ์ฐ ์ค๋ฅ ์๊ณ๊ฐ์ 1์ ๋ถ๊ณผํ๋ฉฐ ์ผ์์ ์ธ ๋คํธ์ํฌ ์ค๋จ์ผ๋ก ์ธํ ์์คํ ๊ฐ๋ ์ค์ง ์๊ฐ์ ์ต์ํํ๊ธฐ ์ํด ์งง์ ๋๊ธฐ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ๋งค์ฐ ์ธ๋ถํ๋ ์ฌ์๋ ์ ๋ต์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๋ชจ๋ ๊ทธ๋ฃน ์ ์ฉ์ ์ ํฉํ์ง ์์ ์ ์์ผ๋ฏ๋ก ์์คํ ํน์ฑ์ ๋ฐ๋ผ ์ค๋ฅ ์๊ณ๊ฐ๊ณผ ๊ฐ๊ฒฉ ๊ฐ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ ํํด์ผ ํฉ๋๋ค.
๋น๊ฒฐ์ ์ ๋ ผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ณ๋์ ์ ํ๋ฆฌ์ผ์ด์
๋ค์์ RETRY_AT ์๊ฐ์ ๋๋ฌํ๋ฉด DESTINATION ์ฃผ์ ๋ก ๋ค์ ๋ณด๋ด๋ ์ ํ๋ฆฌ์ผ์ด์ (Retryer)์ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ์ฝ๋์ ์์ ๋๋ค.
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์ ๋ฐฐ์น๋๋์ง๋ฅผ ๋ํ๋ด๋ ์์์ ๋๋ค.
- REASON - ๋ฉ์์ง ์ฒ๋ฆฌ๊ฐ ์ค๋จ๋ ์ด์ ์ ๋๋ค.
Retryer๋ PostgreSQL์์ ์ฌ์ ์ก ๋ฐ ์๋ ๊ตฌ๋ฌธ ๋ถ์์ ์ํด ๋ฉ์์ง๋ฅผ ์ ์ฅํฉ๋๋ค. ํ์ด๋จธ๋ RETRY_AT๊ฐ ์๋ ๋ฉ์์ง๋ฅผ ์ฐพ๋ ์์ ์ ์์ํ๊ณ ์ด๋ฅผ Record.key() ํค๋ฅผ ์ฌ์ฉํ์ฌ DESTINATION ์ฃผ์ ์ ORIGINAL_PARTITION ํํฐ์ ์ผ๋ก ๋ค์ ๋ณด๋ ๋๋ค.
๋ฉ์์ง๊ฐ ์ ์ก๋๋ฉด PostgreSQL์์ ์ญ์ ๋ฉ๋๋ค. ๋ฉ์์ง์ ์๋ ๊ตฌ๋ฌธ ๋ถ์์ REST API๋ฅผ ํตํด Retryer์ ์ํธ ์์ฉํ๋ ๊ฐ๋จํ UI์์ ๋ฐ์ํฉ๋๋ค. ์ฃผ์ ๊ธฐ๋ฅ์ DLQ์์ ๋ฉ์์ง ์ฌ์ ์ก ๋๋ ์ญ์ , ์ค๋ฅ ์ ๋ณด ๋ณด๊ธฐ, ์ค๋ฅ ์ด๋ฆ ๋ฑ์ผ๋ก ๋ฉ์์ง ๊ฒ์ ๋ฑ์ ๋๋ค.
์ฐ๋ฆฌ ํด๋ฌ์คํฐ์๋ ์ ๊ทผ ์ ์ด๊ฐ ํ์ฑํ๋์ด ์์ผ๋ฏ๋ก Retryer๊ฐ ์ฒญ์ทจ ์ค์ธ ์ฃผ์ ์ ๋ํ ์ ๊ทผ์ ์ถ๊ฐ๋ก ์์ฒญํ๊ณ , Retryer๊ฐ DESTINATION ์ฃผ์ ์ ์ธ ์ ์๋๋ก ํ์ฉํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ด ๋ถํธํ์ง๋ง ๊ฐ๊ฒฉ์ฃผ์ ์ ๊ทผ๋ฐฉ์๊ณผ ๋ฌ๋ฆฌ ์ด๋ฅผ ๊ด๋ฆฌํ ์ ์๋ ๋ณธ๊ฒฉ์ ์ธ DLQ์ UI๋ฅผ ๊ฐ์ถ๊ณ ์์ต๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ก ๋ค๋ฅธ ๋ก์ง์ ๊ตฌํํ๋ ์ฌ๋ฌ ๋ค๋ฅธ ์๋น์ ๊ทธ๋ฃน์ด ์์ ์ฃผ์ ๋ฅผ ์ฝ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ด๋ฌํ ์ ํ๋ฆฌ์ผ์ด์ ์ค ํ๋์ ๋ํด Retryer๋ฅผ ํตํด ๋ฉ์์ง๋ฅผ ์ฌ์ฒ๋ฆฌํ๋ฉด ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์๋ ์ค๋ณต์ด ๋ฐ์ํฉ๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ณ๋์ ์ฃผ์ ๋ฅผ ๋ง๋ญ๋๋ค. ์์ ๋ฐ ์ฌ์๋ ์ฃผ์ ๋ ์๋ฌด๋ฐ ์ ํ ์์ด ๋์ผํ ์๋น์๊ฐ ์ฝ์ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ด ์ ๊ทผ ๋ฐฉ์์ ํ๋ก ์ฐจ๋จ๊ธฐ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง ์์ง๋ง ๋ค์์ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
์ถ๋ ฅ
๊ฒฐ๊ณผ์ ์ผ๋ก, ์ธ๋ถ ์์คํ ์ ์ผ์์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ๋ฉ์์ง ์ฒ๋ฆฌ๋ฅผ ๋ฐ๋ณตํ ์ ์๋ ๋ณ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ต๋๋ค.
์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฃผ์ ์ฅ์ ์ค ํ๋๋ ๋์ผํ Kafka ํด๋ฌ์คํฐ์์ ์คํ๋๋ ์ธ๋ถ ์์คํ ์์ ์๋นํ ์์ ์์ด ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค! ์ด๋ฌํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์๋ ์ฃผ์ ์ ์ก์ธ์คํ๊ณ Kafka ํค๋ ๋ช ๊ฐ๋ฅผ ์ ๋ ฅํ ํ ์ฌ์๋์์๊ฒ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ์ถ๊ฐ์ ์ธ ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์์ Retryer๋ก ์ ์ก๋๋ ๋ฉ์์ง ์๋ฅผ ์ค์ด๊ธฐ ์ํด ์ ํ ๋ก์ง์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ณํ๊ณ Consumer stop์ ํตํด ์ฌ์ฒ๋ฆฌํ์ต๋๋ค.
์ถ์ฒ : habr.com