O0oO0Oo / netty-reservation-service

트랜잭션, 동시성을 공부하기 위한 토이 프로젝트입니다.
0 stars 0 forks source link

fix: kafka producer problem #31

Closed O0oO0Oo closed 2 months ago

O0oO0Oo commented 2 months ago

버그 설명

카프카 트랜잭션 타임아웃

1. 토픽에 들어가는 바이트

image 생산되는 메시지의 수가 현저히 낮다.

2. ExactlyOnceKafkaMessageProducer 문제 발생 로그

024-08-27T17:41:04.980+09:00 ERROR 17860 --- [rsaga.netty-core] [ntLoopGroup-0-3] .m.a.p.i.ExactlyOnceKafkaMessageProducer : Transaction id create-reservation-transaction is aborted, Exception thrown : Cannot attempt operation `beginTransaction` because the previous call to `commitTransaction` timed out and must be retried
2024-08-27T17:41:04.980+09:00  INFO 17860 --- [rsaga.netty-core] [ntLoopGroup-0-3] o.a.k.clients.producer.KafkaProducer     : [Producer clientId=producer-create-reservation-transaction, transactionalId=create-reservation-transaction] Aborting incomplete transaction
2024-08-27T17:41:04.980+09:00  WARN 17860 --- [rsaga.netty-core] [ntLoopGroup-0-3] i.netty.util.concurrent.DefaultPromise   : An exception was thrown by org.server.rsaga.saga.promise.impl.SagaPromiseAggregator$$Lambda$2246/0x0000019141cd0400.operationComplete()
java.lang.IllegalStateException: Cannot attempt operation `abortTransaction` because the previous call to `commitTransaction` timed out and must be retried
    at org.apache.kafka.clients.producer.internals.TransactionManager.handleCachedTransactionRequestResult(TransactionManager.java:1138) ~[kafka-clients-3.7.0.jar:na]
    at org.apache.kafka.clients.producer.internals.TransactionManager.beginAbort(TransactionManager.java:323) ~[kafka-clients-3.7.0.jar:na]
    at org.apache.kafka.clients.producer.KafkaProducer.abortTransaction(KafkaProducer.java:837) ~[kafka-clients-3.7.0.jar:na]
    at org.server.rsaga.messaging.adapter.producer.impl.ExactlyOnceKafkaMessageProducer.produce(ExactlyOnceKafkaMessageProducer.java:52) ~[classes/:na]
        .....

Cannot attempt operation beginTransaction because the previous call to commitTransaction timed out and must be retried 으로 인해 ExactlyOnceKafkaMessageProducer 에서 문제가 발생한다.

사용 환경

현재 환경 문제점

image

  1. 사가 코디네이터는 하나의 요청마다 단일 프로듀서를 통해 여러 토픽에 ExactlyOnce 방식으로 메시지를 발행한다. 그러나 여러 요청이 들어오면 카프카 트랜잭션 코디네이터를 통해 복잡한 작업이 여러 번 진행되며, 이 과정에서 트랜잭션이 중단되거나 commitTransaction 호출이 타임아웃되어 재시도해야 하는 문제가 발생한다.

해결 방법

해결 방법 1. 각 토픽 프로듀서 AtLeastOnce 변경, 메시지 모아서 발행

image

해결 방법 1 결과.

스크린샷

추가적인 정보