데이터베이스/Redis

Redis와 AWS SQS

Jinwookoh 2025. 4. 17. 23:59

1. Redis Pub/Sub 자바 구독 코드

라이브러리

// build.gradle
implementation 'redis.clients:jedis:5.1.0'

구독 코드 (Subscriber)

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;

public class RedisSubscriber {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost", 6379);

        JedisPubSub listener = new JedisPubSub() {
            @Override
            public void onMessage(String channel, String message) {
                System.out.println("Received message from channel " + channel + ": " + message);
            }
        };

        jedis.subscribe(listener, "my-channel"); // 블로킹됨
    }
}

발행 코드 (Publisher)

Jedis jedis = new Jedis("localhost", 6379);
jedis.publish("my-channel", "Hello from Redis");

2. AWS SQS Long Polling 자바 구독 코드

라이브러리

implementation 'software.amazon.awssdk:sqs:2.25.27'

설정

AWS 자격 증명은 ~/.aws/credentials 또는 환경 변수, EC2 role 등을 사용할 수 있습니다.

메시지 수신 코드

import software.amazon.awssdk.services.sqs.SqsClient;
import software.amazon.awssdk.services.sqs.model.*;

import java.util.List;

public class SqsConsumer {
    public static void main(String[] args) {
        String queueUrl = "https://sqs.ap-northeast-2.amazonaws.com/123456789012/my-queue";

        try (SqsClient sqsClient = SqsClient.create()) {
            while (true) {
                ReceiveMessageRequest receiveRequest = ReceiveMessageRequest.builder()
                        .queueUrl(queueUrl)
                        .waitTimeSeconds(20)  // long polling
                        .maxNumberOfMessages(5)
                        .build();

                List messages = sqsClient.receiveMessage(receiveRequest).messages();

                for (Message message : messages) {
                    System.out.println("Received: " + message.body());

                    // 메시지 삭제
                    DeleteMessageRequest deleteRequest = DeleteMessageRequest.builder()
                            .queueUrl(queueUrl)
                            .receiptHandle(message.receiptHandle())
                            .build();
                    sqsClient.deleteMessage(deleteRequest);
                }
            }
        }
    }
}

차이점 요약

항목 Redis Pub/Sub AWS SQS

메시지 저장 X (전송 시점만 유효) O (지정 시간 동안 보관 가능)
메시지 순서 보장 안됨 FIFO 가능 (FIFO Queue 사용 시)
구독 방식 블로킹, 실시간 Polling 기반 (long polling)
확장성 수동 설정 필요 AWS 인프라로 자동 확장

Redis는 빠른 메시지 전달이 필요할 때,
SQS는 안정성 있는 메시지 큐잉이 필요할 때 적합합니다.