An audit against the standard the series set — concepts, procedure, commands, architecture diagram, evidence table, terminal output — found the three new experiments met it while twelve of the original ones had no diagram at all: A-0, A-1, A-3, A-4, A-5, A-6, A-8, B-0, B-2, B-7, C-2, D-2. Each now has one drawn from what that experiment actually found, not filler: A-0 shows sharing going through PostgreSQL rather than between the caches; A-3 the gap between the 200 and the WAL flush, with both failed injections; A-5 the three silent injection failures; A-6 the two places latency is multiplied; B-0 the repository keyed by principal with no session id; B-2 the primary key that causes the overwrite; D-2 why the rolling update stopped the accident halfway. Also corrected the index's stale claim of 11 experiments without a screenshot — it is 14, and the reason is recorded: those experiments were measured from terminals, the database and logs, and the observability stack does not scrape Redis, the BFF or PostgreSQL, so there is no console to photograph. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
56 lines
3.7 KiB
XML
56 lines
3.7 KiB
XML
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 860 440" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,sans-serif">
|
|
<style>
|
|
.box{fill:#fff;stroke:#8c959f;stroke-width:1.4;rx:6}
|
|
.dead{fill:#fff5f5;stroke:#cf222e;stroke-width:1.6;stroke-dasharray:5 3;rx:6}
|
|
.ok{fill:#f6fdf6;stroke:#1a7f37;stroke-width:1.6;rx:6}
|
|
.warn{fill:#fff8f0;stroke:#bf8700;stroke-width:1.5;rx:6}
|
|
.t{font-size:12px;fill:#1f2328}
|
|
.tb{font-size:12.5px;fill:#1f2328;font-weight:600}
|
|
.s{font-size:10.5px;fill:#656d76}
|
|
.ttl{font-size:14px;fill:#1f2328;font-weight:600}
|
|
.r{stroke:#cf222e;stroke-width:1.6;fill:none}
|
|
.g{stroke:#1a7f37;stroke-width:1.6;fill:none}
|
|
.k{stroke:#8c959f;stroke-width:1.3;fill:none}
|
|
</style>
|
|
<defs>
|
|
<marker id="a" markerWidth="8" markerHeight="8" refX="7" refY="3" orient="auto"><path d="M0,0 L7,3 L0,6 z" fill="#8c959f"/></marker>
|
|
<marker id="ar" markerWidth="8" markerHeight="8" refX="7" refY="3" orient="auto"><path d="M0,0 L7,3 L0,6 z" fill="#cf222e"/></marker>
|
|
<marker id="ag" markerWidth="8" markerHeight="8" refX="7" refY="3" orient="auto"><path d="M0,0 L7,3 L0,6 z" fill="#1a7f37"/></marker>
|
|
</defs>
|
|
<text x="20" y="26" class="ttl">B-2 — 저장소를 나눠 문제를 풀자 다른 두 문제가 남았다</text>
|
|
<text x="20" y="44" class="s">Q1 의 네 항목 중 둘이 통과, 둘이 실패</text>
|
|
<rect x="30" y="72" width="240" height="90" class="box"/>
|
|
<text x="46" y="94" class="tb">bff 인스턴스 2개</text>
|
|
<text x="46" y="116" class="s">어느 쪽으로 요청이 가도 된다</text>
|
|
<text x="46" y="136" class="s">enableServiceLinks: false</text>
|
|
<text x="46" y="154" class="s">(REDIS_PORT 충돌 회피)</text>
|
|
<rect x="330" y="72" width="230" height="90" class="ok"/>
|
|
<text x="346" y="94" class="tb">Redis</text>
|
|
<text x="346" y="116" class="s">Application Session</text>
|
|
<text x="346" y="136" class="s">세션 id 로 조회</text>
|
|
<text x="346" y="154" class="s">로그아웃 시 정리됨</text>
|
|
<rect x="600" y="72" width="230" height="90" class="warn"/>
|
|
<text x="616" y="94" class="tb">PostgreSQL</text>
|
|
<text x="616" y="116" class="s">OAuth2AuthorizedClient</text>
|
|
<text x="616" y="136" class="s">principal 이름으로 조회</text>
|
|
<text x="616" y="154" class="s">로그아웃해도 남는다</text>
|
|
<path d="M272 108 L326 108" class="g" marker-end="url(#ag)"/>
|
|
<path d="M562 108 L596 108" class="g" marker-end="url(#ag)"/>
|
|
<rect x="30" y="188" width="390" height="100" class="ok"/>
|
|
<text x="46" y="210" class="tb">통과</text>
|
|
<text x="46" y="234" class="t">① 다른 인스턴스로 요청해도 된다</text>
|
|
<text x="46" y="256" class="t">② 재시작 후에도 로그인 유지</text>
|
|
<text x="46" y="278" class="s">저장소를 밖으로 뺐으니 당연한 결과다</text>
|
|
<rect x="440" y="188" width="390" height="100" class="dead"/>
|
|
<text x="456" y="210" class="tb">실패</text>
|
|
<text x="456" y="234" class="t" fill="#cf222e">③ 같은 사용자의 다른 브라우저가 덮어쓴다</text>
|
|
<text x="456" y="256" class="t" fill="#cf222e">④ 로그아웃해도 한쪽만 정리된다</text>
|
|
<text x="456" y="278" class="s">둘 다 저장소 선택의 문제가 아니라 스키마의 문제다</text>
|
|
<rect x="30" y="308" width="800" height="70" class="warn"/>
|
|
<text x="46" y="330" class="tb">★ 뿌리는 DDL 한 줄이다</text>
|
|
<text x="46" y="352" class="t">PRIMARY KEY (client_registration_id, principal_name)</text>
|
|
<text x="46" y="370" class="s">세션 id 가 키에 없다 → 같은 사용자의 두 세션이 같은 행을 쓴다 → 나중 로그인이 앞의 토큰을 덮어쓴다</text>
|
|
<rect x="30" y="392" width="800" height="40" class="dead"/>
|
|
<text x="46" y="416" class="s">로그아웃 후: Redis 세션 0 키 (정리됨) · PostgreSQL 토큰 1 행 — 평문 refresh token 이 그대로 남는다</text>
|
|
</svg>
|