# 결과 재생 저장소 — 항목 하나의 크기만 제한한다 private final ConcurrentMap storedOutcomes = new ConcurrentHashMap<>(); private final int maxInlineBytes; if (serializedResponse.length > maxInlineBytes) { throw new IllegalArgumentException( "response of " + serializedResponse.length + " bytes exceeds the inline outcome limit of " + maxInlineBytes + "; store it behind an object reference instead"); } storedOutcomes.put(outcomeReference, serializedResponse.clone()); # remove / clear / evict / expire 매치: 0 # 개수를 볼 수 있는 유일한 창구 public int size() { return storedOutcomes.size(); } # 그 값을 읽는 main 코드: 0 # 이 클래스를 잡는 main 코드: 0 # javadoc 이 이 저장소를 부르는 이름 * against whatever the deployment chose — a small inline store, an object store, or a re-read of * the committed resource. # 형제 모듈의 중복 제거기 — 같은 형태를 자기 javadoc 이 비판한다 *

Checkpoint-based rather than a set of seen keys. A set grows without bound for the life of a * session and answers "have I seen this" — which is not quite the question. The question is "has * this been applied", and a monotonic applied-sequence answers it in constant space and survives * the process restart that a set does not. * *

Replayed outcomes are kept for the small window after the checkpoint, so a duplicate that * arrives before the checkpoint advances gets the original answer rather than being reapplied. # 비판을 지키는 쪽: 세션당 항목 하나 private final ConcurrentMap checkpoints = new ConcurrentHashMap<>(); private final ConcurrentMap replayableOutcomes = new ConcurrentHashMap<>(); # 지키지 않는 쪽: 적용된 메시지마다 한 항목 if (outcomeReference != null && !outcomeReference.isBlank()) { replayableOutcomes.put(message.dedupKey(), outcomeReference); } } # 재생 판정이 실제로 보는 것 54: if (checkpoint.alreadyApplied(message.sequence())) { # 이 파일의 remove / clear / removeIf 매치: 2 # 그 둘이 있는 자리 /** Forgets a finished session. */ public void endSession(GrpcClientStreamSessionId sessionId) { checkpoints.remove(sessionId.value()); replayableOutcomes.keySet().removeIf(key -> key.startsWith(sessionId.value() + "|")); } # 그 접두사가 실제로 무엇인가 public String dedupKey(long sequence) { return value + "|" + generation + "|" + sequence; # 두 모듈의 런타임 소속: grpc-policy=[] grpc-advanced-streaming=[]