This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 1540" role="img" aria-labelledby="title desc">
|
||||
<title id="title">Границы delivery, effect ledger и manual route</title>
|
||||
<desc id="desc">Вертикальная схема показывает, что delivery относится к запуску consumer, effect ledger относится к доменному результату, а manual route останавливает автоматический путь; duplicate не создаёт второй эффект.</desc>
|
||||
<defs>
|
||||
<marker id="arrow" viewBox="0 0 12 12" refX="10" refY="6" markerWidth="10" markerHeight="10" orient="auto-start-reverse">
|
||||
<path d="M 1 1 L 11 6 L 1 11 z" fill="#b3c4e4"/>
|
||||
</marker>
|
||||
<style>
|
||||
.bg { fill: #101525; }
|
||||
.card { fill: #1b2740; stroke: #4c6792; stroke-width: 3; }
|
||||
.effect { fill: #263b2d; stroke: #70d09d; stroke-width: 3; }
|
||||
.duplicate { fill: #382a4d; stroke: #caa4ff; stroke-width: 3; }
|
||||
.manual { fill: #49302d; stroke: #ffab84; stroke-width: 3; }
|
||||
.line { stroke: #b3c4e4; stroke-width: 5; fill: none; marker-end: url(#arrow); }
|
||||
.branch { stroke: #caa4ff; stroke-width: 5; fill: none; marker-end: url(#arrow); }
|
||||
.warnline { stroke: #ffb070; stroke-width: 5; fill: none; marker-end: url(#arrow); }
|
||||
.title { fill: #ffffff; font: 700 34px Arial, sans-serif; }
|
||||
.tag { fill: #a1d4ff; font: 700 21px Arial, sans-serif; letter-spacing: 1px; }
|
||||
.label { fill: #f0f5ff; font: 600 27px Arial, sans-serif; }
|
||||
.body { fill: #d3def2; font: 24px Arial, sans-serif; }
|
||||
.small { fill: #b8c7e0; font: 22px Arial, sans-serif; }
|
||||
</style>
|
||||
</defs>
|
||||
<rect width="720" height="1540" rx="32" class="bg"/>
|
||||
<text x="360" y="62" text-anchor="middle" class="title">Границы delivery-контракта</text>
|
||||
<text x="360" y="96" text-anchor="middle" class="small">одно слово — одна ответственность</text>
|
||||
|
||||
<rect x="80" y="140" width="560" height="174" rx="22" class="card"/>
|
||||
<text x="115" y="183" class="tag">A · DELIVERY</text>
|
||||
<text x="115" y="225" class="label">Consumer получил message id</text>
|
||||
<text x="115" y="260" class="body">это запуск обработки, не доменный эффект</text>
|
||||
<text x="115" y="291" class="small">возможно повторное появление того же id</text>
|
||||
<path d="M360 314 L360 370" class="line"/>
|
||||
|
||||
<rect x="80" y="390" width="560" height="178" rx="22" class="effect"/>
|
||||
<text x="115" y="433" class="tag">B · EFFECT KEY</text>
|
||||
<text x="115" y="475" class="label">Ledger ищет effectKey</text>
|
||||
<text x="115" y="510" class="body">нет ключа → записать один эффект</text>
|
||||
<text x="115" y="541" class="small">есть ключ → принять duplicate без нового эффекта</text>
|
||||
|
||||
<path d="M235 568 L235 630" class="line"/>
|
||||
<path d="M485 568 L485 630" class="branch"/>
|
||||
<text x="137" y="611" class="small">новый эффект</text>
|
||||
<text x="455" y="611" class="small">duplicate</text>
|
||||
|
||||
<rect x="54" y="650" width="350" height="170" rx="22" class="effect"/>
|
||||
<text x="84" y="692" class="tag">C · RESULT</text>
|
||||
<text x="84" y="734" class="label">Effect записан</text>
|
||||
<text x="84" y="769" class="body">одна доменная запись</text>
|
||||
<text x="84" y="800" class="small">ключ хранит связь с intent</text>
|
||||
|
||||
<rect x="424" y="650" width="242" height="170" rx="22" class="duplicate"/>
|
||||
<text x="454" y="692" class="tag">C · SAME KEY</text>
|
||||
<text x="454" y="734" class="label">Suppress</text>
|
||||
<text x="454" y="769" class="body">без нового</text>
|
||||
<text x="454" y="800" class="body">effect</text>
|
||||
|
||||
<path d="M235 820 L235 875" class="line"/>
|
||||
<path d="M485 820 L485 875" class="branch"/>
|
||||
<rect x="80" y="895" width="560" height="164" rx="22" class="card"/>
|
||||
<text x="115" y="938" class="tag">D · DECISION</text>
|
||||
<text x="115" y="980" class="label">Решить текущую delivery</text>
|
||||
<text x="115" y="1015" class="body">ack только после ответа ledger</text>
|
||||
<text x="115" y="1046" class="small">это не claim о протоколе или transport</text>
|
||||
<path d="M360 1059 L360 1115" class="line"/>
|
||||
|
||||
<rect x="80" y="1135" width="560" height="145" rx="22" class="manual"/>
|
||||
<text x="115" y="1178" class="tag">E · TERMINAL PATH</text>
|
||||
<text x="115" y="1220" class="label">Unknown / terminal → manual review</text>
|
||||
<text x="115" y="1255" class="body">reason · attempts · required check</text>
|
||||
<path d="M360 1280 L360 1334" class="warnline"/>
|
||||
|
||||
<rect x="80" y="1354" width="560" height="126" rx="22" class="card"/>
|
||||
<text x="115" y="1396" class="tag">ГРАНИЦА УВЕРЕННОСТИ</text>
|
||||
<text x="115" y="1435" class="label">Fixture проверяет договор, не брокер</text>
|
||||
<text x="115" y="1465" class="small">сеть, storage и внешний эффект проверяются отдельно</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.0 KiB |
@@ -0,0 +1,84 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 1600" role="img" aria-labelledby="title desc">
|
||||
<title id="title">Жизненный цикл учебного сообщения очереди</title>
|
||||
<desc id="desc">Вертикальная схема: producer создаёт конверт, consumer валидирует вход, временная причина получает ограниченный retry, effect ledger подавляет duplicate, а терминальная причина идёт в ручной маршрут.</desc>
|
||||
<defs>
|
||||
<marker id="arrow" viewBox="0 0 12 12" refX="10" refY="6" markerWidth="10" markerHeight="10" orient="auto-start-reverse">
|
||||
<path d="M 1 1 L 11 6 L 1 11 z" fill="#9fb7d7"/>
|
||||
</marker>
|
||||
<style>
|
||||
.bg { fill: #0b1324; }
|
||||
.card { fill: #14213a; stroke: #42658f; stroke-width: 3; }
|
||||
.accent { fill: #173e45; stroke: #48c5be; stroke-width: 3; }
|
||||
.warn { fill: #422a30; stroke: #ff9a80; stroke-width: 3; }
|
||||
.ok { fill: #1a4136; stroke: #67d5a6; stroke-width: 3; }
|
||||
.line { stroke: #9fb7d7; stroke-width: 5; fill: none; marker-end: url(#arrow); }
|
||||
.branch { stroke: #ffb270; stroke-width: 5; fill: none; marker-end: url(#arrow); }
|
||||
.label { fill: #eaf2ff; font: 600 27px Arial, sans-serif; }
|
||||
.body { fill: #d2def2; font: 24px Arial, sans-serif; }
|
||||
.small { fill: #b6c7e3; font: 22px Arial, sans-serif; }
|
||||
.title { fill: #ffffff; font: 700 34px Arial, sans-serif; }
|
||||
.tag { fill: #87e5db; font: 700 21px Arial, sans-serif; letter-spacing: 1px; }
|
||||
</style>
|
||||
</defs>
|
||||
<rect class="bg" width="720" height="1600" rx="32"/>
|
||||
<text x="360" y="62" text-anchor="middle" class="title">Жизненный цикл задачи</text>
|
||||
<text x="360" y="96" text-anchor="middle" class="small">учебный контракт, не схема конкретного broker</text>
|
||||
|
||||
<rect x="80" y="140" width="560" height="155" rx="22" class="card"/>
|
||||
<text x="115" y="182" class="tag">1 · СОЗДАТЬ</text>
|
||||
<text x="115" y="224" class="label">Конверт сообщения</text>
|
||||
<text x="115" y="259" class="body">id · effectKey · sequenceKey · schema</text>
|
||||
<path d="M360 295 L360 342" class="line"/>
|
||||
|
||||
<rect x="80" y="360" width="560" height="160" rx="22" class="accent"/>
|
||||
<text x="115" y="403" class="tag">2 · ПРОВЕРИТЬ</text>
|
||||
<text x="115" y="445" class="label">Consumer читает контракт</text>
|
||||
<text x="115" y="480" class="body">вход понятен и допустим?</text>
|
||||
<path d="M360 520 L360 567" class="line"/>
|
||||
|
||||
<rect x="80" y="585" width="560" height="154" rx="22" class="card"/>
|
||||
<text x="115" y="628" class="tag">3 · КЛАССИФИЦИРОВАТЬ</text>
|
||||
<text x="115" y="670" class="label">Выбрать один исход</text>
|
||||
<text x="115" y="705" class="body">ready · temporary · terminal / unknown</text>
|
||||
|
||||
<path d="M222 739 L222 795" class="line"/>
|
||||
<path d="M498 739 L498 795" class="branch"/>
|
||||
<text x="156" y="778" class="small">ready</text>
|
||||
<text x="450" y="778" class="small">terminal</text>
|
||||
|
||||
<rect x="56" y="815" width="332" height="176" rx="22" class="ok"/>
|
||||
<text x="86" y="855" class="tag">4 · EFFECT LEDGER</text>
|
||||
<text x="86" y="896" class="label">Проверить effectKey</text>
|
||||
<text x="86" y="930" class="body">новый → записать эффект</text>
|
||||
<text x="86" y="962" class="body">duplicate → не повторять</text>
|
||||
|
||||
<rect x="424" y="815" width="240" height="176" rx="22" class="warn"/>
|
||||
<text x="454" y="855" class="tag">4 · STOP</text>
|
||||
<text x="454" y="896" class="label">Manual</text>
|
||||
<text x="454" y="930" class="body">reason</text>
|
||||
<text x="454" y="962" class="body">attempts</text>
|
||||
|
||||
<path d="M222 991 L222 1048" class="line"/>
|
||||
<path d="M498 991 L498 1048" class="branch"/>
|
||||
|
||||
<rect x="56" y="1068" width="332" height="188" rx="22" class="card"/>
|
||||
<text x="86" y="1109" class="tag">5 · DELIVERY DECISION</text>
|
||||
<text x="86" y="1152" class="label">Подтвердить запуск</text>
|
||||
<text x="86" y="1187" class="body">после проверки ledger</text>
|
||||
<text x="86" y="1220" class="small">не второй effect</text>
|
||||
|
||||
<rect x="424" y="1068" width="240" height="188" rx="22" class="warn"/>
|
||||
<text x="454" y="1109" class="tag">5 · OPERATOR</text>
|
||||
<text x="454" y="1152" class="label">Проверить</text>
|
||||
<text x="454" y="1187" class="body">исправить вход,</text>
|
||||
<text x="454" y="1220" class="body">отменить, replay</text>
|
||||
|
||||
<path d="M222 1256 L222 1312" class="line"/>
|
||||
<path d="M498 1256 L498 1312" class="branch"/>
|
||||
|
||||
<rect x="80" y="1334" width="560" height="174" rx="22" class="accent"/>
|
||||
<text x="115" y="1377" class="tag">ОГРАНИЧЕНИЕ</text>
|
||||
<text x="115" y="1418" class="label">Retry: известная временная причина</text>
|
||||
<text x="115" y="1453" class="body">лимит и backoff заранее заданы</text>
|
||||
<text x="115" y="1486" class="small">иначе — manual route</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.0 KiB |
@@ -0,0 +1,81 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 1600" role="img" aria-labelledby="title desc">
|
||||
<title id="title">Диагностика poison message и ручной маршрут</title>
|
||||
<desc id="desc">Вертикальное дерево решений: сначала проверяется effect ledger, затем классифицируется причина; только известная временная причина получает ограниченный retry, а terminal и unknown случаи сохраняются для manual review.</desc>
|
||||
<defs>
|
||||
<marker id="arrow" viewBox="0 0 12 12" refX="10" refY="6" markerWidth="10" markerHeight="10" orient="auto-start-reverse">
|
||||
<path d="M 1 1 L 11 6 L 1 11 z" fill="#b9c8e4"/>
|
||||
</marker>
|
||||
<style>
|
||||
.bg { fill: #141321; }
|
||||
.card { fill: #23233c; stroke: #5c6294; stroke-width: 3; }
|
||||
.check { fill: #173943; stroke: #55c9ca; stroke-width: 3; }
|
||||
.retry { fill: #3d3524; stroke: #e8c16d; stroke-width: 3; }
|
||||
.manual { fill: #482f38; stroke: #ff9ca5; stroke-width: 3; }
|
||||
.ok { fill: #254234; stroke: #77d5a2; stroke-width: 3; }
|
||||
.line { stroke: #b9c8e4; stroke-width: 5; fill: none; marker-end: url(#arrow); }
|
||||
.retryline { stroke: #e8c16d; stroke-width: 5; fill: none; marker-end: url(#arrow); }
|
||||
.manualline { stroke: #ff9ca5; stroke-width: 5; fill: none; marker-end: url(#arrow); }
|
||||
.title { fill: #ffffff; font: 700 34px Arial, sans-serif; }
|
||||
.tag { fill: #a8def8; font: 700 21px Arial, sans-serif; letter-spacing: 1px; }
|
||||
.label { fill: #f5f6ff; font: 600 27px Arial, sans-serif; }
|
||||
.body { fill: #d9dff3; font: 24px Arial, sans-serif; }
|
||||
.small { fill: #bbc6df; font: 22px Arial, sans-serif; }
|
||||
</style>
|
||||
</defs>
|
||||
<rect width="720" height="1600" rx="32" class="bg"/>
|
||||
<text x="360" y="62" text-anchor="middle" class="title">Poison message: путь решения</text>
|
||||
<text x="360" y="96" text-anchor="middle" class="small">остановить цикл, сохранить контекст</text>
|
||||
|
||||
<rect x="80" y="140" width="560" height="150" rx="22" class="card"/>
|
||||
<text x="115" y="183" class="tag">1 · FAILURE</text>
|
||||
<text x="115" y="225" class="label">Consumer не завершил задачу</text>
|
||||
<text x="115" y="260" class="body">сохранить id, effectKey, attempt, reason</text>
|
||||
<path d="M360 290 L360 345" class="line"/>
|
||||
|
||||
<rect x="80" y="365" width="560" height="164" rx="22" class="check"/>
|
||||
<text x="115" y="408" class="tag">2 · EFFECT LEDGER</text>
|
||||
<text x="115" y="450" class="label">Эффект уже записан?</text>
|
||||
<text x="115" y="485" class="body">да → не повторять effect; решить delivery</text>
|
||||
<text x="115" y="516" class="small">нет → перейти к классификации причины</text>
|
||||
|
||||
<path d="M218 529 L218 591" class="line"/>
|
||||
<path d="M502 529 L502 591" class="line"/>
|
||||
<text x="144" y="570" class="small">duplicate</text>
|
||||
<text x="456" y="570" class="small">новый effect</text>
|
||||
|
||||
<rect x="54" y="611" width="324" height="146" rx="22" class="ok"/>
|
||||
<text x="84" y="652" class="tag">3 · ACK</text>
|
||||
<text x="84" y="694" class="label">Suppress duplicate</text>
|
||||
<text x="84" y="727" class="body">нового эффекта нет</text>
|
||||
|
||||
<rect x="410" y="611" width="256" height="146" rx="22" class="card"/>
|
||||
<text x="440" y="652" class="tag">3 · CLASSIFY</text>
|
||||
<text x="440" y="694" class="label">Причина?</text>
|
||||
<text x="440" y="727" class="body">known / terminal</text>
|
||||
|
||||
<path d="M538 757 L538 813" class="line"/>
|
||||
<rect x="410" y="833" width="256" height="152" rx="22" class="retry"/>
|
||||
<text x="440" y="874" class="tag">4 · TEMPORARY</text>
|
||||
<text x="440" y="916" class="label">Controlled retry</text>
|
||||
<text x="440" y="949" class="body">limit + backoff</text>
|
||||
<path d="M538 985 L538 1040" class="retryline"/>
|
||||
|
||||
<rect x="410" y="1060" width="256" height="151" rx="22" class="manual"/>
|
||||
<text x="440" y="1101" class="tag">5 · EXHAUSTED</text>
|
||||
<text x="440" y="1143" class="label">Manual review</text>
|
||||
<text x="440" y="1176" class="body">no more retry</text>
|
||||
|
||||
<path d="M360 757 L360 1084 L392 1084" class="manualline"/>
|
||||
<text x="95" y="1015" class="small">terminal or unknown:</text>
|
||||
<text x="95" y="1047" class="small">не угадывать retry</text>
|
||||
|
||||
<path d="M538 1211 L538 1266" class="manualline"/>
|
||||
<rect x="80" y="1286" width="560" height="170" rx="22" class="manual"/>
|
||||
<text x="115" y="1329" class="tag">6 · OPERATOR DECISION</text>
|
||||
<text x="115" y="1371" class="label">Исправить вход / отменить / replay</text>
|
||||
<text x="115" y="1406" class="body">проверить effectKey перед повтором</text>
|
||||
<text x="115" y="1437" class="small">record хранит reason, attempts и effectKey</text>
|
||||
|
||||
<rect x="80" y="1480" width="560" height="76" rx="20" class="card"/>
|
||||
<text x="360" y="1528" text-anchor="middle" class="small">Диагностика, не конфигурация DLQ.</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.0 KiB |
Reference in New Issue
Block a user