programing

jpa와 함께 kafka를 사용할 때 모범 사례

randomtip 2023. 7. 20. 23:57
반응형

jpa와 함께 kafka를 사용할 때 모범 사례

저는 현재 JPA와 카프카를 사용하는 프로젝트에 참여하고 있습니다.저는 그 수술들을 결합하기 위한 일련의 좋은 관행을 찾으려고 노력하고 있습니다.

기존 코드에서 생산자는 jpa와 동일한 거래에 사용되지만, 제가 읽은 바로는 거래를 공유하지 않는 것 같습니다.

@PostMapping
@Transactional
public XDto createX(@RequestBody XRequest request) {
    Xdto dto = xService.create(request);
    kafkaProducer.putToQueue(dto, Type.CREATE);
    return dto;
}

여기서 카프카 생산자는 다음과 같이 정의됩니다.

public class KafkaProducer {
    @Autowired
    private KafkaTemplate<String, Type> template;

    public void putToQueue(Dto dto, Type eventType) {
        template.send("event", new Event(dto, eventType));
    }
}

이것은 jpa와 kafka를 결합하는 데 유효한 사용 사례입니까, 트랜잭션 경계가 올바르게 정의되었습니까?

트랜잭션이 실패할 때 이 작업이 의도한 대로 작동하지 않습니다.카프카 상호 작용은 트랜잭션의 일부가 아닙니다.

Transactional Event Listener를 확인할 수 있습니다. AFT_COMMIT 이벤트에서 카프카에 메시지를 작성할 수 있습니다.카프카 출판이 실패할 수도 있습니다.

다른 방법은 당신이 하고 있는 것처럼 jpa를 사용하여 db에 쓰는 것입니다.데베지움이 데이터베이스에서 업데이트된 데이터를 읽고 카프카에 푸시합니다.그 행사는 다른 형식이지만 훨씬 더 풍부할 것입니다.

질문 내용을 보면 OLTP 시스템의 CDC(Change Data Capture)를 달성하려고 하는 것 같습니다. 즉, 트랜잭션 데이터베이스에 적용되는 모든 변경 사항을 기록하는 것입니다.이에 접근하는 방법은 두 가지가 있습니다.

  1. 응용 프로그램 코드는 Kafka뿐만 아니라 트랜잭션 DB에도 이중 쓰기를 수행합니다.일관성이 없고 성능을 저하시킵니다.일관성이 없습니다. 두 개의 독립적인 시스템에 이중 쓰기를 수행할 때 두 쓰기 중 하나가 실패할 경우 데이터가 손상되고 트랜잭션 흐름에서 데이터를 Kafka로 푸시하면 지연 시간이 추가되므로 이 문제를 해결할 수 없습니다.
  2. DB commit(데이터베이스/애플리케이션 수준 트리거 또는 트랜잭션 로그)에서 변경사항을 추출하여 Kafka로 보냅니다.이것은 매우 일관적이며 당신의 거래에 전혀 영향을 주지 않습니다.DB 커밋 로그는 커밋 성공 후 DB 트랜잭션의 반영이므로 일관성이 있습니다.데이터 버스, 맥스웰, 데베지움 등과 같은 이 접근 방식을 활용하는 많은 솔루션을 사용할 수 있습니다.

CDC가 사용 사례인 경우 이미 사용 가능한 솔루션 중 하나를 사용해 보십시오.

다른 사용자가 말했듯이 변경 데이터 캡처를 사용하여 데이터베이스에 적용된 변경 사항을 Apache Kafka에 안전하게 전파할 수 있습니다.데이터베이스와 카프카는 어떤 종류의 2단계 커밋 프로토콜도 지원하지 않기 때문에 한 번의 트랜잭션으로 업데이트할 수 없습니다.

테이블 자체를 CDC하거나, 카프카로 전송되는 구조를 좀 더 제어하고 싶다면 "발신" 패턴을 적용할 수 있습니다.이 경우 응용 프로그램은 실제 비즈니스 테이블과 카프카로 보낼 메시지가 포함된 "발송함" 테이블에 기록됩니다.이 접근 방식에 대한 자세한 설명은 블로그 게시물에서 확인할 수 있습니다.

고지 사항:저는 이 글의 저자이며, 다른 답변들 중 일부에서 언급된 CDC 솔루션 중 하나인 Debezium의 리드입니다.

당신은 카프카에게 보내는 메시지를 거래에 넣으면 안 됩니다.이벤트를 카프카로 전송하지 못했을 때 논리가 필요하면 트랜잭션을 되돌리는 것이 좋습니다.spring-retry이 경우에는카프카에 보내는 이벤트와 관련된 코드를 넣기만 하면 됩니다.@Retryable주석이 달린 방법, 그리고 추가.@Recover이전에 수행한 변경 사항을 DB로 되돌리는 논리를 가진 주석 처리 방법.

언급URL : https://stackoverflow.com/questions/51052406/good-practice-when-using-kafka-with-jpa

반응형