Skip to content

Commit 737a94a

Browse files
committed
refactor: remove batch processing in kafka listener
1 parent acc0562 commit 737a94a

File tree

8 files changed

+45
-36
lines changed

8 files changed

+45
-36
lines changed

gateway-service/Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ RUN mkdir -p ${MODULE_NAME}/build/extracted && (java -Djarmode=layertools -jar $
1313

1414
FROM eclipse-temurin:17-jdk
1515
VOLUME /tmp
16+
1617
RUN ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
1718
ENV TZ=Asia/Seoul
1819

quiz-service/quiz-infra/src/main/kotlin/com/grepp/quizy/quiz/infra/quizread/messaging/listener/CDCEventListener.kt

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,31 +11,32 @@ private val log = KotlinLogging.logger {}
1111

1212
@Component
1313
class CDCEventListener(
14-
private val CDCEventHandlerFactory: CDCEventHandlerFactory
14+
private val cdcEventHandlerFactory: CDCEventHandlerFactory
1515
) {
1616

17-
@KafkaListener(topics = ["\${kafka.topic.cdc_events}"] , groupId = "\${kafka.consumer-group.cdc_events}")
18-
fun receive(records: List<ConsumerRecord<String, DebeziumEvent>>, acknowledgment: Acknowledgment) {
19-
val sortedRecords: List<ConsumerRecord<String, DebeziumEvent>> = records.stream()
20-
.filter { shouldProcessEvent(it.value().payload) }
21-
.sorted(Comparator.comparing { r -> r.value().payload.date })
22-
.toList()
17+
@KafkaListener(topics = ["\${kafka.topic.cdc_events}"], groupId = "\${kafka.consumer-group.cdc_events}")
18+
fun receive(record: ConsumerRecord<String, DebeziumEvent>, acknowledgment: Acknowledgment) {
19+
val payload = record.value().payload
2320

24-
log.info { "${sortedRecords.size} 개의 이벤트를 처리 요청" }
21+
if (isReadOperation(payload)) {
22+
log.info { "처리하지 않는 이벤트: ${payload.operation}" }
23+
acknowledgment.acknowledge()
24+
return
25+
}
2526

27+
log.info { "${payload.source["table"]} - ${payload.operation} 이벤트를 ${record.topic()} 토픽에서 처리 요청" }
2628

27-
sortedRecords.forEach { record ->
28-
log.info {
29-
"${record.value().payload.operation} 이벤트를 ${record.topic()} 토픽에 처리 요청"
30-
}
31-
CDCEventHandlerFactory.getHandler(getTableName(record)).process(record.value())
29+
try {
30+
val tableName = getTableName(record)
31+
cdcEventHandlerFactory.getHandler(tableName).process(record.value())
32+
acknowledgment.acknowledge()
33+
} catch (ex: Exception) {
34+
log.error(ex) { "이벤트 처리 중 오류 발생: ${record.value()}" }
3235
}
33-
acknowledgment.acknowledge()
3436
}
3537

36-
private fun shouldProcessEvent(payload: DebeziumEvent.DebeziumEventPayload): Boolean {
37-
// READ 이벤트 처리하지 않음
38-
return payload.operation != DebeziumEvent.DebeziumEventPayloadOperation.READ
38+
private fun isReadOperation(payload: DebeziumEvent.DebeziumEventPayload): Boolean {
39+
return payload.operation == DebeziumEvent.DebeziumEventPayloadOperation.READ
3940
}
4041

4142
private fun getTableName(record: ConsumerRecord<String, DebeziumEvent>): String {

quiz-service/quiz-infra/src/main/kotlin/com/grepp/quizy/quiz/infra/quizread/messaging/listener/QuizCDCEventHandler.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import org.springframework.stereotype.Component
99
@Component
1010
class QuizCDCEventHandler(
1111
mapper: ObjectMapper,
12-
private val quizSynchronizer: QuizSynchronizer,
12+
private val quizDocumentSynchronizer: QuizDocumentSynchronizer,
1313
) : AbstractSimpleEventHandler<QuizCDCEvent>(mapper), EventHandler {
1414

1515
init {
@@ -19,14 +19,14 @@ class QuizCDCEventHandler(
1919

2020
final override fun initActions() {
2121
actions.put(DebeziumEvent.DebeziumEventPayloadOperation.CREATE) { _, after ->
22-
after?.let { quizSynchronizer.createQuiz(it) }
22+
after?.let { quizDocumentSynchronizer.createQuiz(it) }
2323
}
2424

2525
actions.put(DebeziumEvent.DebeziumEventPayloadOperation.UPDATE) { _, after ->
26-
after?.let { quizSynchronizer.updateQuiz(it) }
26+
after?.let { quizDocumentSynchronizer.updateQuiz(it) }
2727
}
2828
actions.put(DebeziumEvent.DebeziumEventPayloadOperation.DELETE) { before, _ ->
29-
before?.let { quizSynchronizer.removeQuiz(it.id) }
29+
before?.let { quizDocumentSynchronizer.removeQuiz(it.id) }
3030
}
3131
}
3232
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import org.springframework.data.repository.findByIdOrNull
99
import org.springframework.stereotype.Component
1010

1111
@Component
12-
class QuizSynchronizer(
12+
class QuizDocumentSynchronizer(
1313
private val quizElasticRepository: QuizElasticRepository,
1414
private val quizTagJpaRepository: QuizTagJpaRepository
1515
) {

quiz-service/quiz-infra/src/main/kotlin/com/grepp/quizy/quiz/infra/quizread/messaging/listener/QuizOptionCDCEventHandler.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,19 @@ import org.springframework.stereotype.Component
99
@Component
1010
class QuizOptionCDCEventHandler(
1111
mapper: ObjectMapper,
12-
private val quizSynchronizer: QuizSynchronizer
12+
private val quizDocumentSynchronizer: QuizDocumentSynchronizer
1313
) : AbstractSimpleEventHandler<QuizOptionCDCEvent>(mapper), EventHandler {
1414
init {
1515
initActions()
1616
}
1717

1818
final override fun initActions() {
1919
actions.put(DebeziumEvent.DebeziumEventPayloadOperation.CREATE) { _, after ->
20-
after?.let { quizSynchronizer.addQuizOption(it) }
20+
after?.let { quizDocumentSynchronizer.addQuizOption(it) }
2121
}
2222

2323
actions.put(DebeziumEvent.DebeziumEventPayloadOperation.DELETE) { before, _ ->
24-
before?.let { quizSynchronizer.removeQuizOption(it.quizId, it.optionNumber) }
24+
before?.let { quizDocumentSynchronizer.removeQuizOption(it.quizId, it.optionNumber) }
2525
}
2626
}
2727
}

quiz-service/quiz-infra/src/main/kotlin/com/grepp/quizy/quiz/infra/quizread/messaging/listener/QuizTagMappingCDCEventHandler.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import org.springframework.stereotype.Component
99
@Component
1010
class QuizTagMappingCDCEventHandler(
1111
mapper: ObjectMapper,
12-
private val quizSynchronizer: QuizSynchronizer
12+
private val quizDocumentSynchronizer: QuizDocumentSynchronizer
1313
) : AbstractSimpleEventHandler<QuizTagMappingCDCEvent>(mapper), EventHandler {
1414

1515
init {
@@ -18,11 +18,11 @@ class QuizTagMappingCDCEventHandler(
1818

1919
override fun initActions() {
2020
actions.put(DebeziumEvent.DebeziumEventPayloadOperation.CREATE) { _, after ->
21-
after?.let { quizSynchronizer.addQuizTag(it) }
21+
after?.let { quizDocumentSynchronizer.addQuizTag(it) }
2222
}
2323

2424
actions.put(DebeziumEvent.DebeziumEventPayloadOperation.DELETE) { before, _ ->
25-
before?.let { quizSynchronizer.removeQuizTag(it.quizId, it.tagId) }
25+
before?.let { quizDocumentSynchronizer.removeQuizTag(it.quizId, it.tagId) }
2626
}
2727
}
2828
}

quiz-service/quiz-infra/src/main/kotlin/com/grepp/quizy/quiz/infra/user/messaging/listener/UserEventKafkaListener.kt

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,20 @@ class UserEventKafkaListener(
1313
private val eventHandlerFactory: EventHandlerFactory,
1414
) {
1515

16-
@KafkaListener(topics = ["#{'\${kafka.topic.user-outbox}'.split(',')}"], groupId = "\${kafka.consumer-group.quiz}")
17-
fun receive(records: List<ConsumerRecord<String, Event>>, ack: Acknowledgment) {
18-
records.forEach { record ->
19-
val appEvent = record.value()
20-
log.info { "User Outbox 이벤트를 받았습니다. $appEvent" }
16+
@KafkaListener(
17+
topics = ["#{'\${kafka.topic.user-outbox}'.split(',')}"],
18+
groupId = "\${kafka.consumer-group.quiz}"
19+
)
20+
fun receive(record: ConsumerRecord<String, Event>, ack: Acknowledgment) {
21+
val appEvent = record.value()
22+
log.info { "User Outbox 이벤트를 받았습니다. $appEvent" }
23+
24+
try {
2125
eventHandlerFactory.getEventHandler(appEvent.origin).process(appEvent)
26+
ack.acknowledge()
27+
} catch (ex: Exception) {
28+
log.error(ex) { "이벤트 처리 중 오류 발생: $appEvent" }
29+
// ack.acknowledge()를 호출하지 않음으로써 메시지를 재처리 가능하도록 유지
2230
}
23-
ack.acknowledge()
2431
}
25-
}
32+
}

quiz-service/quiz-infra/src/main/resources/application-infra.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ kafka-consumer-config:
5959
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
6060
value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
6161
auto-offset-reset: earliest
62-
batch-listener: true
62+
batch-listener: false
6363
auto-startup: true
6464
concurrency-level: 3
6565
session-timeout-ms: 10000

0 commit comments

Comments
 (0)