# 탐침이 자기를 소개하는 문단 /** * Asks the server what it is, once, at startup. * *

Configuration says what the deployment intends; only the server says what is true. The version * a managed Redis advertises does not imply the modules are present, and a replicated deployment's * write durability is a server setting no client can compensate for. Both are cheap to ask and * expensive to discover later — a missing capability found at the first request is an outage, found * here it is a failed deploy. # 그것이 확인하는 넷 RedisCapabilities capabilities = probe.probe( serverFacts.version(), settings.getMode(), settings.getDatabase(), commandPresence(serverFacts.commands()), requiredCapabilities); probe.requireWriteDurability( settings.getMode(), serverFacts.minReplicasToWrite(), serverFacts.minReplicasMaxLagSeconds(), settings.isAcknowledgedWriteLossAccepted()); return capabilities; } # 넷째의 javadoc — 실측과 결론 * Refuses to start against a replicated deployment that cannot keep the writes it acknowledges. * *

This is the one server-side setting the SDK cannot compensate for. When a primary is * superseded by a promotion it does not find out immediately, and until it does it keeps * answering {@code +OK} to writes that are discarded when it resyncs from the new primary. The * Sentinel lane measured eleven seconds and 2,086 acknowledged-then-discarded writes, with * exactly one command failing. No client can see it: the server answered, so the driver, this * SDK, and the caller all record a success. There is no metric to add, no failure to retry, and * no certainty value that describes it. * *

{@code min-replicas-to-write} with a bounded {@code min-replicas-max-lag} is what turns that * into a {@code NOREPLICAS} refusal the caller can act on — the same promotion then lost one * write instead of 2,086. So a replicated deployment without it is a startup failure rather than * a warning, on the same principle as every other guardrail here: a setting that makes a * guarantee meaningless stops the context instead of degrading quietly. # 그리고 검사가 두 겹인 이유 *

Both halves of the guarantee are checked. A replica count on its own decides only how many * replicas must be connected; how far behind they may be is {@code * min-replicas-max-lag}, and Redis treats {@code 0} there as "no lag requirement". A deployment * with {@code min-replicas-to-write 2} and {@code min-replicas-max-lag 0} therefore accepts a * write once two arbitrarily stale replicas are attached, which is the same lost-write exposure * the count was supposed to remove. Checking the count alone let that configuration pass while * the failure message told the operator to set the lag bound. # 그 실패는 일어나지 않는다 두 탐침 밖에서 그것들을 언급하는 main 코드: 1 RedisSdkSettings.java:888: * signal exists for it; see {@link RedisCapabilityProbe#requireWriteDurability}. confirm( 을 부르는 main 코드: 0 # 자동설정이 만드는 빈 85 public RedisSdkSettings redisSdkSettings() { 102 public RedisSdkSettingsValidation redisSdkSettingsValidation( 157 public RedisResolvedCredentials redisResolvedCredentials( 227 public RedisRuntimeClient redisRuntimeClient( 274 public RedisRuntimeOwner redisRuntimeOwner(RedisRuntimeClient client, RedisSdkSettings settings) { 298 public HealthIndicator redisOptional(RedisRuntimeOwner owner, RedisSdkSettings settings) { 326 public HealthIndicator redisRequired(RedisRuntimeOwner owner, RedisSdkSettings settings) { 그중 탐침: 0 # 로직을 고정하는 테스트 케이스 수 RedisCapabilityProbeTest: 11 RedisStartupProbeTest: 7