

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 읽기 전용 복제본 사용 모범 사례
<a name="ReadReplicas"></a>

세션 스토어, 리더보드, 추천 엔진과 같은 많은 애플리케이션은 고가용성이 필요하며 쓰기 작업보다 훨씬 더 많은 읽기 작업을 처리합니다. 이러한 애플리케이션은 종종 약간 오래된 데이터(이벤트 일관성)를 허용할 수 있습니다. 즉, 서로 다른 사용자가 일시적으로 동일한 데이터의 약간 다른 버전을 보는 경우 허용됩니다. 예제:
+ 캐시된 쿼리 결과는 특히 사실의 출처가 외부인 캐시 어사이드 패턴에서 약간 오래된 데이터를 허용할 수 있는 경우가 많습니다.
+ 게임 리더보드에서 업데이트된 점수의 몇 초 지연은 사용자 경험에 큰 영향을 미치지 않는 경우가 많습니다.
+ 세션 스토어의 경우 복제본 간에 세션 데이터를 전파하는 데 약간의 지연이 발생하면 애플리케이션 기능에 거의 영향을 미치지 않습니다.
+ 권장 엔진은 일반적으로 과거 데이터 분석을 사용하므로 실시간 일관성은 덜 중요합니다.

최종 일관성이란 복제 프로세스가 완료되면 일반적으로 밀리초 이내에 모든 복제본 노드가 동일한 데이터를 반환한다는 의미입니다. 이러한 사용 사례에서 읽기 전용 복제본을 구현하는 것은 ElastiCache 인스턴스에서 읽을 때 지연 시간을 줄이는 효과적인 전략입니다.

Amazon ElastiCache에서 읽기 전용 복제본을 사용하면 다음을 통해 상당한 성능 이점을 얻을 수 있습니다.

**향상된 읽기 확장성**
+ 여러 복제본 노드에 읽기 작업 분산
+ 프라이머리 노드에서 읽기 트래픽 오프로드
+ 지리적으로 더 가까운 복제본의 요청을 처리하여 읽기 지연 시간 단축

**프라이머리 노드 성능 최적화**
+ 프라이머리 노드 리소스를 전용하여 작업을 작성
+ 프라이머리 노드의 연결 오버헤드 감소
+ 최대 트래픽 기간 동안 쓰기 성능을 개선하고 더 나은 응답 시간 유지

## ElastiCache Serverless의 복제본에서 읽기 사용
<a name="ReadReplicas.serverless"></a>

ElastiCache Serverless는 서로 다른 일관성 요구 사항에 맞는 두 가지 엔드포인트를 제공합니다. 두 엔드포인트는 동일한 DNS 이름을 사용하지만 포트는 다릅니다. read-from-replica 포트를 사용하려면 [VPC의 보안 그룹 및 네트워크 액세스 제어 목록을 구성](set-up.md#elasticache-install-grant-access-VPN)하여 클라이언트 애플리케이션의 두 포트에 대한 액세스를 승인해야 합니다.

**기본 엔드포인트(포트 6379)**
+ 즉각적인 일관성이 필요한 작업에 사용
+ 최신 데이터 읽기 보장
+ 중요한 트랜잭션 및 쓰기 작업에 가장 적합
+ 쓰기 작업에 필요
+ 예시: `test-12345.serverless.use1.cache.amazonaws.com:6379`

**지연 시간 최적화 엔드포인트(포트 6380)**
+ 최종 일관성을 허용할 수 있는 읽기 작업에 최적화됨
+ 가능하면 ElastiCache Serverless는 클라이언트의 로컬 가용 영역에 있는 복제본 노드로 읽기 요청을 자동으로 라우팅합니다. 이 최적화는 다른 가용 영역의 노드에서 데이터를 검색할 때 발생하는 추가 네트워크 지연 시간을 방지하여 지연 시간을 줄입니다.
+ ElastiCache Serverless는 로컬 노드를 사용할 수 없는 경우 다른 영역에서 사용 가능한 노드를 자동으로 선택합니다.
+ 예시: `test-12345.serverless.use1.cache.amazonaws.com:6380`
+ 복제본 구성에서 읽기를 제공하는 경우 Glide 및 Lettuce와 같은 클라이언트는 읽기를 자동으로 감지하여 지연 시간 최적화 엔드포인트로 라우팅합니다. 클라이언트가 라우팅 구성(예: valkey-java 및 이전 jedis 버전)을 지원하지 않는 경우 복제본에서 읽을 올바른 포트 및 클라이언트 구성을 정의해야 합니다.

## ElastiCache Serverless의 읽기 전용 복제본에 연결 - Valkey 및 Glide
<a name="ReadReplicas.connecting-primary"></a>

다음 코드 조각은 Valkey 글라이드 라이브러리에서 ElastiCache Serverless의 복제본에서 읽기를 구성하는 방법을 보여줍니다. 복제본에서 읽기 위한 포트를 지정할 필요는 없지만 라우팅 구성 `ReadFrom.PREFER_REPLICA`를 구성해야 합니다.

```
package glide.examples;

import glide.api.GlideClusterClient;
import glide.api.logging.Logger;
import glide.api.models.configuration.GlideClusterClientConfiguration;
import glide.api.models.configuration.NodeAddress;
import glide.api.models.exceptions.ClosingException;
import glide.api.models.exceptions.ConnectionException;
import glide.api.models.exceptions.TimeoutException;
import glide.api.models.configuration.ReadFrom;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class ClusterExample {

    public static void main(String[] args) {
        // Set logger configuration
        Logger.setLoggerConfig(Logger.Level.INFO);

        GlideClusterClient client = null;

        try {
            System.out.println("Connecting to Valkey Glide...");

            // Configure the Glide Client
            GlideClusterClientConfiguration config = GlideClusterClientConfiguration.builder()
                .address(NodeAddress.builder()
                    .host("your-endpoint")
                    .port(6379)
                    .build())
                .useTLS(true)
                .readFrom(ReadFrom.PREFER_REPLICA)
                .build();

            // Create the GlideClusterClient
            client = GlideClusterClient.createClient(config).get();
            System.out.println("Connected successfully.");

            // Perform SET operation
            CompletableFuture<String> setResponse = client.set("key", "value");
            System.out.println("Set key 'key' to 'value': " + setResponse.get());

            // Perform GET operation
            CompletableFuture<String> getResponse = client.get("key");
            System.out.println("Get response for 'key': " + getResponse.get());

            // Perform PING operation
            CompletableFuture<String> pingResponse = client.ping();
            System.out.println("PING response: " + pingResponse.get());

        } catch (ClosingException | ConnectionException | TimeoutException | ExecutionException e) {
            System.err.println("An exception occurred: ");
            e.printStackTrace();
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        } finally {
            // Close the client connection
            if (client != null) {
                try {
                    client.close();
                    System.out.println("Client connection closed.");
                } catch (ClosingException | ExecutionException e) {
                    System.err.println("Error closing client: " + e.getMessage());
                }
            }
        }
    }
}
```