The keycloak project ended with four open questions that design could not
settle. A two-VM lab was built to answer them by measurement, and this is
that material: 26 experiments, 125 raw command outputs, 22 browser captures.
Follows the import procedure in README.md.
source/ the originating repository verbatim — 78 documents, 28 SVGs,
8 manifests, plus .source-revision recording the commit
final/ the SSOT
document.md 729 lines written from the 29 experiment documents, not
concatenated: what was predicted, what was measured, and
where the measurement itself was wrong
evidence/raw 125 outputs, flattened to <experiment>__<file> because
the originals collided (01-baseline.txt appeared three
times) and the audit only globs the top level
evidence/meta one per raw file; command and exitCode are null and the
README says why rather than inventing them
evidence/browser 22 captures
assets/ three diagrams through techviz
.techviz/ their VizSpecs
A separate project rather than an addition to keycloak: the B-layer answers
that project's four questions, but the A, C and D layers are about cluster
failure, SSO and operations, and one document.md should hold one subject.
The four question records there can point here through 관계.
Recorded rather than papered over: only three of the 28 diagrams were
remade. The repository forbids hand-drawn SVG and forbids titles inside the
canvas; all 28 originals carry both, so converting them is redrawing, not
reformatting. They stay in source/ and the gap is written into the document.
verify-pipeline.py passes. audit-records.py reports no issues.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
76 lines
5.8 KiB
Plaintext
76 lines
5.8 KiB
Plaintext
# 이 leaf 가 담은 파일과 줄 수
|
|
main CloudEventExtensions.java 24 줄
|
|
main CloudEventMapper.java 33 줄
|
|
main DefaultCloudEventMapper.java 171 줄
|
|
test CloudEventMappingTest.java 162 줄
|
|
|
|
# 출하 산출물에 들어간다는 것을 무엇이 말하는가
|
|
modules.json runtime_memberships=['app-bootstrap']
|
|
messaging-spring-boot-starter/build.gradle:24 // Wired by the auto-configurations and never named in an adopter's source.
|
|
messaging-spring-boot-starter/build.gradle:25 implementation project(':messaging:messaging-schema-json')
|
|
messaging-spring-boot-starter/build.gradle:26 implementation project(':messaging:messaging-cloudevents')
|
|
app-bootstrap/build/architecture/runtime-project-closure.txt:18:messaging-cloudevents
|
|
app-bootstrap/gradle.lockfile:101:io.cloudevents:cloudevents-api:4.0.1=productionRuntimeClasspath,runtimeClasspath,sampleOffTestRuntimeClasspath,testRuntimeClasspath
|
|
app-bootstrap/gradle.lockfile:102:io.cloudevents:cloudevents-core:4.0.1=productionRuntimeClasspath,runtimeClasspath,sampleOffTestRuntimeClasspath,testRuntimeClasspath
|
|
|
|
# DefaultCloudEventMapper 를 만드는 자리, 그리고 계약 타입을 참조하는 main 파일
|
|
test · CloudEventMappingTest.java:30 private final DefaultCloudEventMapper mapper = new DefaultCloudEventMapper();
|
|
messaging/messaging-cloudevents/src/main/java/dev/caskeleton/messaging/cloudevents/CloudEventExtensions.java
|
|
messaging/messaging-cloudevents/src/main/java/dev/caskeleton/messaging/cloudevents/CloudEventMapper.java
|
|
messaging/messaging-cloudevents/src/main/java/dev/caskeleton/messaging/cloudevents/DefaultCloudEventMapper.java
|
|
|
|
# CloudEvent 라는 이름을 main 자바 소스 전체에서 찾으면
|
|
messaging/messaging-cloudevents/src/main/java/dev/caskeleton/messaging/cloudevents/CloudEventExtensions.java
|
|
messaging/messaging-cloudevents/src/main/java/dev/caskeleton/messaging/cloudevents/CloudEventMapper.java
|
|
messaging/messaging-cloudevents/src/main/java/dev/caskeleton/messaging/cloudevents/DefaultCloudEventMapper.java
|
|
설정 클래스 계수 :
|
|
이름이 *AutoConfiguration.java 인 main 클래스 : 36
|
|
@Configuration 을 단 main 클래스 : 176
|
|
AutoConfiguration.imports 등재 클래스 : 14
|
|
그 어느 집합에서도 CloudEvent 를 언급하는 것 : 0 (위 main 전수 목록이 leaf 세 파일뿐이므로)
|
|
META-INF/services 파일 수 : 0
|
|
|
|
# 원문이 28 로 적은 수의 출처
|
|
starter autoconfigure 패키지 파일 수 : 28
|
|
그중 이름이 *AutoConfiguration 인 것 : 6
|
|
|
|
# 매핑의 반대편 — CanonicalEnvelopeHeaders 를 쓰는 main 코드와 그 성격
|
|
main · KafkaHeaderMapper.java:90 if (CanonicalEnvelopeHeaders.restatesEnvelopeField(name.value())) {
|
|
main · KafkaHeaderMapper.java:141 if (CanonicalEnvelopeHeaders.restatesEnvelopeField(header.key())) {
|
|
main · RabbitHeaderMapper.java:102 if (CanonicalEnvelopeHeaders.restatesEnvelopeField(name.value())) {
|
|
main · RabbitHeaderMapper.java:158 if (value != null && !CanonicalEnvelopeHeaders.restatesEnvelopeField(name)) {
|
|
그 넷은 값을 싣는 곳이 아니라 거절·건너뛰기 판정이다 :
|
|
KafkaHeaderMapper.java:88 .forEach(
|
|
KafkaHeaderMapper.java:89 (name, value) -> {
|
|
KafkaHeaderMapper.java:90 if (CanonicalEnvelopeHeaders.restatesEnvelopeField(name.value())) {
|
|
KafkaHeaderMapper.java:91 throw new dev.caskeleton.messaging.api.error.MessagingConfigurationException(
|
|
KafkaHeaderMapper.java:92 "RESERVED_HEADER_FORGED",
|
|
실제로 헤더를 싣는 줄은 따로 있다 :
|
|
KafkaHeaderMapper.java:36 put(headers, ReservedHeaders.MESSAGE_ID, envelope.messageId().value().toString());
|
|
KafkaHeaderMapper.java:37 put(headers, ReservedHeaders.MESSAGE_TYPE, envelope.messageType().value());
|
|
KafkaHeaderMapper.java:42 put(headers, ReservedHeaders.PRODUCER, envelope.producer().value());
|
|
KafkaHeaderMapper.java:43 put(headers, ReservedHeaders.PRODUCED_AT, envelope.producedAt().toString());
|
|
KafkaHeaderMapper.java:44 put(headers, ReservedHeaders.CONTENT_TYPE, envelope.contentType().value());
|
|
|
|
# 그 네 호출 중 조립되는 경로에 있는 것
|
|
main · KafkaDeliveryMapper.java:42 this(new KafkaHeaderMapper());
|
|
main · KafkaPublishMapper.java:34 this(new KafkaHeaderMapper());
|
|
test · KafkaEnvelopeRoundTripTest.java:39 private final KafkaHeaderMapper headerMapper = new KafkaHeaderMapper();
|
|
test · KafkaHeaderMapperTest.java:27 private final KafkaHeaderMapper mapper = new KafkaHeaderMapper();
|
|
test · ReservedHeaderForgeryTest.java:36 private final KafkaHeaderMapper mapper = new KafkaHeaderMapper();
|
|
main · RabbitDeliveryMapper.java:41 this(new RabbitHeaderMapper());
|
|
main · RabbitPublishMapper.java:22 this(new RabbitHeaderMapper());
|
|
test · RabbitEnvelopeRoundTripTest.java:43 private final RabbitHeaderMapper headerMapper = new RabbitHeaderMapper();
|
|
test · RabbitRuntimeTest.java:126 RabbitHeaderMapper headers = new RabbitHeaderMapper();
|
|
test · RabbitRuntimeTest.java:140 RabbitHeaderMapper headers = new RabbitHeaderMapper();
|
|
test · RabbitRuntimeTest.java:231 new RabbitHeaderMapper().toProperties(envelope(new byte[] {1})));
|
|
그 위의 transport 를 만드는 main 코드 :
|
|
main · KafkaMessagingAutoConfiguration.java:168 return new dev.caskeleton.messaging.kafka.KafkaMessagingTransport("kafka", 1L, producer);
|
|
RabbitMessagingTransport : main 생성 0 건
|
|
|
|
# 상호운용을 약속한 문서와, 약속이 없는 문서
|
|
35:| CloudEvents | Domain·Integration Event에 선택 가능한 1.0.2 compatible profile을 제공한다. |
|
|
756:## 15. CloudEvents Profile
|
|
docs/messaging/support-matrix.md CloudEvents 언급 0 건
|
|
docs/messaging/configuration-reference.md CloudEvents 언급 0 건
|