항해99

항해99 실전 프로젝트 (15일차)

blablax5 2024. 2. 16. 00:55

Pasted image 20240127002218.png

카프카 스프링 부트에서 동적으로 토픽 생성

토픽을 동적으로 생성하는 방법 중 하나는 Kafka Admin Client를 사용하는 것입니다. 아파치 카프카는 자바로 개발된 Admin Client API를 제공하며, 이 API를 통해 토픽을 생성하고 관리할 수 있습니다. 예를 들어, Java로 작성된 코드에서 Admin Client API를 사용하여 특정 이벤트에 대한 새로운 토픽을 생성할 수 있습니다.

import org.apache.kafka.clients.admin.AdminClient;
import org.apache.kafka.clients.admin.AdminClientConfig;
import org.apache.kafka.clients.admin.NewTopic;

import java.util.Properties;

public class DynamicTopicCreation {
    public static void main(String[] args) {
        // Kafka 서버 설정
        Properties properties = new Properties();
        properties.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "your_bootstrap_servers");

        // Admin Client 생성
        try (AdminClient adminClient = AdminClient.create(properties)) {
            // 새로운 토픽 생성
            String topicName = "your_dynamic_topic";
            NewTopic newTopic = new NewTopic(topicName, 1, (short) 1);
            adminClient.createTopics(Collections.singleton(newTopic));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

목표 기능 정리

  1. 행사 시간 삭제 시 예매 테이블도 행사 시간에 맞게 삭제 되게
  2. 티켓 생성이 됐을경우 (결제완료) 일 때, 예매도 결제 상태로 변경하면 됨 환불을 했을때 티켓을 삭제 하고, 예매 결제 상태 변경 (구현완료)
    • 이 단계는 마지막 단계이므로 지금 처리 안해도 됨
  3. 행사 시간 선택 후 예매하기 버튼 눌렀을 때 대기열에 진입이 됨 → 좌석 보여주기
  4. 카프카 토픽 생성 시점은 행사 시간을 생성 했을 때
    행사 종료시간엔 해당 토픽들을 삭제

레디스 키 만료 됐을 때 PostgreSQL 업데이트

@Component  
public class RedisKeyExpiredListener extends KeyExpirationEventMessageListener {  
  
    private final TicketService ticketService;  
    public RedisKeyExpiredListener(RedisMessageListenerContainer listenerContainer, TicketService ticketService) {  
       super(listenerContainer);  
        this.ticketService = ticketService;  
    }  
  
    @Override  
    public void onMessage(Message message, byte[] pattern) {  
       String expiredKey = new String(message.getBody());  
  
       if (expiredKey.startsWith("seat_lock:")) {  
          ticketService.updateReservationStatusWithUnLocked(expiredKey);  
       }  
    }  
}