Async Task Processing [2편] - 비동기 테스크 처리 아키텍처 구현 및 실무

 비동기 테스크 처리 아키텍처 구현 및 실무 사례



앞서 PostgreSQL Notify/Listen, Redis Pub/Sub, Kafka, RabbitMQ의 기본적인 동작 원리와 특징을 살펴보았습니다. 이번 페이지에서는 각각의 아키텍처를 실제로 구현하는 방법과 실무에서 활용된 사례를 중심으로 더욱 상세히 다룹니다. 특히 Spring Boot를 활용하여 이들 기술을 통합하는 방법을 중점적으로 설명합니다.


1. PostgreSQL Notify/Listen 구현 (Spring Boot)

PostgreSQL Notify/Listen 메커니즘은 데이터베이스를 활용하여 간단한 메시지 브로커 역할을 수행합니다. Spring Boot에서는 데이터베이스 이벤트를 처리하기 위해 PostgreSQL의 Notify/Listen 기능과 함께 스케줄링 작업을 활용할 수 있습니다.

구현 예제

  1. 테이블 생성 및 트리거 설정:

    CREATE TABLE events (
        id SERIAL PRIMARY KEY,
        data TEXT NOT NULL
    );
    
    CREATE OR REPLACE FUNCTION notify_event()
    RETURNS TRIGGER AS $$
    BEGIN
        PERFORM pg_notify('event_channel', NEW.data);
        RETURN NEW;
    END;
    $$ LANGUAGE plpgsql;
    
    CREATE TRIGGER event_trigger
    AFTER INSERT ON events
    FOR EACH ROW
    EXECUTE FUNCTION notify_event();
  2. Spring Boot Listener:

    @Component
    public class PostgresListener {
    
        private final JdbcTemplate jdbcTemplate;
    
        public PostgresListener(JdbcTemplate jdbcTemplate) {
            this.jdbcTemplate = jdbcTemplate;
        }
    
        @EventListener(ApplicationReadyEvent.class)
        public void startListening() {
            jdbcTemplate.execute("LISTEN event_channel");
    
            new Thread(() -> {
                while (true) {
                    jdbcTemplate.query("SELECT 1", rs -> {
                        System.out.println("Received event: " + rs.getString("data"));
                    });
                }
            }).start();
        }
    }

실무 사례

  • Spring Boot 기반의 소규모 CRUD 애플리케이션에서 데이터 변경 사항에 대해 실시간 알림이 필요한 경우.

  • 기존 데이터베이스에 Notify/Listen을 통합하여 간단한 이벤트 전달 구현.


2. Redis Pub/Sub 구현 (Spring Boot)

Redis의 Pub/Sub 모델은 간단하면서도 강력한 실시간 메시징 기능을 제공합니다. Spring Boot에서는 RedisTemplate을 활용하여 손쉽게 Pub/Sub 기능을 구현할 수 있습니다.

구현 예제

  1. Publisher:

    @RestController
    public class PublisherController {
    
        private final RedisTemplate<String, Object> redisTemplate;
    
        public PublisherController(RedisTemplate<String, Object> redisTemplate) {
            this.redisTemplate = redisTemplate;
        }
    
        @PostMapping("/publish")
        public String publishMessage(@RequestParam String message) {
            redisTemplate.convertAndSend("my_channel", message);
            return "Message published: " + message;
        }
    }
  2. Subscriber:

    @Service
    public class SubscriberService {
    
        @EventListener
        public void handleMessage(String message) {
            System.out.println("Received: " + message);
        }
    }

실무 사례

  • Spring Boot 기반 실시간 채팅 애플리케이션에서 메시지 전달.

  • 알림 시스템에서 이벤트 발생 시 메시지 브로드캐스트.


3. Apache Kafka 구현 (Spring Boot)

Kafka는 대규모 데이터 스트리밍을 위한 강력한 분산 메시징 플랫폼입니다. Spring Boot는 Kafka와의 통합을 위해 spring-kafka 라이브러리를 제공합니다.

구현 예제

  1. Producer:

    @RestController
    public class KafkaProducerController {
    
        private final KafkaTemplate<String, String> kafkaTemplate;
    
        public KafkaProducerController(KafkaTemplate<String, String> kafkaTemplate) {
            this.kafkaTemplate = kafkaTemplate;
        }
    
        @PostMapping("/send")
        public String sendMessage(@RequestParam String message) {
            kafkaTemplate.send("test-topic", message);
            return "Message sent: " + message;
        }
    }
  2. Consumer:

    @Service
    public class KafkaConsumerService {
    
        @KafkaListener(topics = "test-topic", groupId = "group_id")
        public void consume(String message) {
            System.out.println("Received: " + message);
        }
    }

실무 사례

  • 대규모 로그 데이터 분석 시스템에서 Kafka를 통해 데이터를 실시간으로 수집.

  • 마이크로서비스 간 이벤트 전달 및 스트리밍.


4. RabbitMQ 구현 (Spring Boot)

RabbitMQ는 신뢰성 높은 메시지 전달과 다양한 메시징 패턴을 제공합니다. Spring Boot에서는 spring-amqp 모듈을 통해 쉽게 RabbitMQ를 통합할 수 있습니다.

구현 예제

  1. Producer:

    @RestController
    public class RabbitMQProducerController {
    
        private final RabbitTemplate rabbitTemplate;
    
        public RabbitMQProducerController(RabbitTemplate rabbitTemplate) {
            this.rabbitTemplate = rabbitTemplate;
        }
    
        @PostMapping("/send")
        public String sendMessage(@RequestParam String message) {
            rabbitTemplate.convertAndSend("my_queue", message);
            return "Message sent: " + message;
        }
    }
  2. Consumer:

    @Service
    public class RabbitMQConsumerService {
    
        @RabbitListener(queues = "my_queue")
        public void receiveMessage(String message) {
            System.out.println("Received: " + message);
        }
    }

실무 사례

  • Spring Boot 기반의 작업 큐(Task Queue) 구현.

  • 백엔드 서비스 간 신뢰성 높은 메시지 전달.


다음 페이지에서는 각 아키텍처를 비교하고 적합한 선택을 위한 가이드를 제시합니다.

다음 이전