<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Reliability on IT Comparison</title><link>https://comparison.metacog.co.kr/tags/reliability/</link><description>Recent content in Reliability on IT Comparison</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 06 Sep 2026 10:14:11 +0900</lastBuildDate><atom:link href="https://comparison.metacog.co.kr/tags/reliability/index.xml" rel="self" type="application/rss+xml"/><item><title>Load Shedding vs Request Completion: Rejecting Early vs Finishing In-Flight Work</title><link>https://comparison.metacog.co.kr/posts/2026-09-06-load-shedding-vs-request-completion-rejecting-early-vs-finis/</link><pubDate>Sun, 06 Sep 2026 10:14:11 +0900</pubDate><guid>https://comparison.metacog.co.kr/posts/2026-09-06-load-shedding-vs-request-completion-rejecting-early-vs-finis/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;When a service is overloaded, it must choose between two competing policies: &lt;strong class="kw"&gt;load shedding&lt;/strong&gt;, which rejects excess requests at the door before they consume resources, and &lt;strong class="kw"&gt;request completion&lt;/strong&gt;, which guarantees every admitted request runs to its natural end. The choice determines whether overload shows up as explicit client-visible rejections or as growing queues and degraded latency for everyone still being served.&lt;/p&gt;
&lt;h2 id="comparison-diagram"&gt;Comparison Diagram&lt;/h2&gt;
&lt;div class="compare-diagram"&gt;
&lt;svg viewBox="0 0 640 360" xmlns="http://www.w3.org/2000/svg"&gt;&lt;line x1="320" y1="50" x2="320" y2="320" style="stroke:var(--border)" stroke-width="1" stroke-dasharray="4,4"/&gt;&lt;text x="160" y="30" text-anchor="middle" style="fill:var(--primary)" font-size="18" font-weight="bold"&gt;Load Shedding&lt;/text&gt;&lt;text x="480" y="30" text-anchor="middle" style="fill:var(--primary)" font-size="18" font-weight="bold"&gt;Request Completion&lt;/text&gt;&lt;line x1="20" y1="80" x2="95" y2="80" style="stroke:var(--content)" stroke-width="1.5"/&gt;&lt;line x1="20" y1="130" x2="95" y2="130" style="stroke:var(--content)" stroke-width="1.5"/&gt;&lt;line x1="20" y1="180" x2="95" y2="180" style="stroke:var(--content)" stroke-width="1.5"/&gt;&lt;line x1="20" y1="230" x2="95" y2="230" style="stroke:var(--content)" stroke-width="1.5"/&gt;&lt;rect x="105" y="60" width="30" height="200" style="fill:none;stroke:var(--content)" stroke-width="1.5" stroke-dasharray="3,3"/&gt;&lt;text x="120" y="52" text-anchor="middle" style="fill:var(--content)" font-size="10"&gt;gate&lt;/text&gt;&lt;line x1="135" y1="80" x2="200" y2="80" style="stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;line x1="135" y1="130" x2="200" y2="130" style="stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;rect x="200" y="65" width="90" height="90" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="245" y="115" text-anchor="middle" style="fill:var(--content)" font-size="12"&gt;Accepted&lt;/text&gt;&lt;line x1="112" y1="173" x2="128" y2="187" style="stroke:var(--secondary)" stroke-width="2"/&gt;&lt;line x1="112" y1="187" x2="128" y2="173" style="stroke:var(--secondary)" stroke-width="2"/&gt;&lt;line x1="112" y1="223" x2="128" y2="237" style="stroke:var(--secondary)" stroke-width="2"/&gt;&lt;line x1="112" y1="237" x2="128" y2="223" style="stroke:var(--secondary)" stroke-width="2"/&gt;&lt;text x="150" y="210" style="fill:var(--secondary)" font-size="11"&gt;shed (503)&lt;/text&gt;&lt;text x="160" y="300" text-anchor="middle" style="fill:var(--secondary)" font-size="11"&gt;Rejects excess before admission&lt;/text&gt;&lt;line x1="325" y1="100" x2="345" y2="100" style="stroke:var(--content)" stroke-width="1.5"/&gt;&lt;line x1="325" y1="160" x2="345" y2="160" style="stroke:var(--content)" stroke-width="1.5"/&gt;&lt;line x1="325" y1="220" x2="345" y2="220" style="stroke:var(--content)" stroke-width="1.5"/&gt;&lt;rect x="345" y="70" width="70" height="180" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="380" y="62" text-anchor="middle" style="fill:var(--content)" font-size="10"&gt;admitted&lt;/text&gt;&lt;line x1="415" y1="160" x2="440" y2="160" style="stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;rect x="440" y="100" width="80" height="120" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="480" y="92" text-anchor="middle" style="fill:var(--content)" font-size="10"&gt;in-flight&lt;/text&gt;&lt;line x1="520" y1="160" x2="540" y2="160" style="stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;circle cx="575" cy="160" r="28" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;polyline points="562,160 572,170 590,145" style="fill:none;stroke:var(--compare-b)" stroke-width="2.5"/&gt;&lt;text x="575" y="122" text-anchor="middle" style="fill:var(--primary)" font-size="11"&gt;complete&lt;/text&gt;&lt;text x="480" y="300" text-anchor="middle" style="fill:var(--secondary)" font-size="11"&gt;Every admitted request runs to completion&lt;/text&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;h2 id="comparison-table"&gt;Comparison Table&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Load Shedding&lt;/th&gt;
&lt;th&gt;Request Completion&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lifecycle stage&lt;/td&gt;
&lt;td&gt;Applied at admission, before a request enters processing&lt;/td&gt;
&lt;td&gt;Applied after admission, to work already in flight&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trigger&lt;/td&gt;
&lt;td&gt;Fires when queue depth, CPU, or latency crosses an overload threshold&lt;/td&gt;
&lt;td&gt;Is the default behavior for any request that was accepted, regardless of load&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource cost of the decision&lt;/td&gt;
&lt;td&gt;Cheap — rejects with a fast, minimal-work response&lt;/td&gt;
&lt;td&gt;Expensive — the request&amp;rsquo;s resources are already committed and must be paid out&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client-facing outcome&lt;/td&gt;
&lt;td&gt;Explicit rejection (e.g. HTTP 503), client must retry later&lt;/td&gt;
&lt;td&gt;Eventual success or failure on the request&amp;rsquo;s own merits, no artificial cutoff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Effect on accepted traffic&lt;/td&gt;
&lt;td&gt;Protects tail latency for accepted requests by removing excess load&lt;/td&gt;
&lt;td&gt;Risks rising tail latency and queueing as accepted work competes for the same resources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prioritization&lt;/td&gt;
&lt;td&gt;Can selectively drop low-priority or cheap-to-reject traffic first&lt;/td&gt;
&lt;td&gt;Typically processes admitted work FIFO, with no mid-flight reordering&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failure mode if misapplied&lt;/td&gt;
&lt;td&gt;Too aggressive shedding rejects healthy capacity and wastes headroom&lt;/td&gt;
&lt;td&gt;No shedding at all leads to resource exhaustion and cascading failure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Implementation layer&lt;/td&gt;
&lt;td&gt;Load balancer, API gateway, or admission-control middleware&lt;/td&gt;
&lt;td&gt;Service handler or business logic that owns the request once accepted&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="key-differences"&gt;Key Differences&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Load shedding acts at the front door, before &lt;strong class="kw"&gt;admission&lt;/strong&gt;; completion policy governs work already in-flight.&lt;/li&gt;
&lt;li&gt;Shedding trades a guaranteed rejection for protecting &lt;strong class="kw"&gt;tail latency&lt;/strong&gt; of everything else being served.&lt;/li&gt;
&lt;li&gt;Completing every accepted request avoids wasting &lt;strong class="kw"&gt;sunk cost&lt;/strong&gt; already spent, but risks resource exhaustion under sustained overload.&lt;/li&gt;
&lt;li&gt;Shedding can prioritize which traffic to drop, while completion is typically &lt;strong class="kw"&gt;FIFO&lt;/strong&gt; once work is admitted.&lt;/li&gt;
&lt;li&gt;Over-aggressive shedding causes false rejections; refusing to shed at all invites &lt;strong class="kw"&gt;cascading failure&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="when-to-use-each"&gt;When to Use Each&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Load Shedding&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Idempotency vs Simplicity: Safe Retries vs Minimal Design</title><link>https://comparison.metacog.co.kr/posts/2026-09-06-idempotency-vs-simplicity-safe-retries-vs-minimal-design/</link><pubDate>Sun, 06 Sep 2026 10:10:19 +0900</pubDate><guid>https://comparison.metacog.co.kr/posts/2026-09-06-idempotency-vs-simplicity-safe-retries-vs-minimal-design/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;This compares two competing goals when designing an operation or API: making it safe to repeat (&lt;strong class="kw"&gt;idempotency&lt;/strong&gt;) versus keeping it easy to build and reason about (&lt;strong class="kw"&gt;simplicity&lt;/strong&gt;). The tension matters because guarding against duplicate execution almost always adds state and logic that a minimal implementation would otherwise skip.&lt;/p&gt;
&lt;h2 id="comparison-diagram"&gt;Comparison Diagram&lt;/h2&gt;
&lt;div class="compare-diagram"&gt;
&lt;svg viewBox="0 0 640 360" xmlns="http://www.w3.org/2000/svg"&gt;&lt;defs&gt;&lt;marker id="arrowA" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse"&gt;&lt;path d="M0,0L10,5L0,10z" style="fill:var(--compare-a)"/&gt;&lt;/marker&gt;&lt;marker id="arrowB" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse"&gt;&lt;path d="M0,0L10,5L0,10z" style="fill:var(--compare-b)"/&gt;&lt;/marker&gt;&lt;/defs&gt;&lt;line x1="320" y1="10" x2="320" y2="350" stroke-dasharray="4,4" style="stroke:var(--border)" stroke-width="1"/&gt;&lt;text x="160" y="26" text-anchor="middle" font-size="18" font-weight="bold" style="fill:var(--primary)"&gt;Idempotency&lt;/text&gt;&lt;text x="480" y="26" text-anchor="middle" font-size="18" font-weight="bold" style="fill:var(--primary)"&gt;Simplicity&lt;/text&gt;&lt;rect x="110" y="45" width="100" height="32" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="160" y="65" text-anchor="middle" font-size="12" style="fill:var(--content)"&gt;Client&lt;/text&gt;&lt;line x1="140" y1="77" x2="140" y2="135" style="stroke:var(--compare-a)" stroke-width="1.5" marker-end="url(#arrowA)"/&gt;&lt;line x1="180" y1="77" x2="180" y2="135" style="stroke:var(--compare-a)" stroke-width="1.5" marker-end="url(#arrowA)"/&gt;&lt;text x="108" y="106" font-size="9" style="fill:var(--secondary)"&gt;req #1&lt;/text&gt;&lt;text x="183" y="106" font-size="9" style="fill:var(--secondary)"&gt;retry&lt;/text&gt;&lt;rect x="100" y="138" width="120" height="32" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="160" y="158" text-anchor="middle" font-size="12" style="fill:var(--content)"&gt;Server&lt;/text&gt;&lt;line x1="160" y1="170" x2="160" y2="195" style="stroke:var(--compare-a)" stroke-width="1.5" marker-end="url(#arrowA)"/&gt;&lt;rect x="85" y="195" width="150" height="34" rx="4" style="fill:none;stroke:var(--compare-a)" stroke-dasharray="3,3" stroke-width="1.5"/&gt;&lt;text x="160" y="216" text-anchor="middle" font-size="10" style="fill:var(--content)"&gt;key store: A seen&lt;/text&gt;&lt;line x1="160" y1="229" x2="160" y2="268" style="stroke:var(--compare-a)" stroke-width="1.5" marker-end="url(#arrowA)"/&gt;&lt;rect x="105" y="270" width="110" height="32" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="160" y="290" text-anchor="middle" font-size="11" style="fill:var(--content)"&gt;executed once&lt;/text&gt;&lt;text x="160" y="320" text-anchor="middle" font-size="10" style="fill:var(--secondary)"&gt;retries collapse to one result&lt;/text&gt;&lt;rect x="430" y="45" width="100" height="32" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="480" y="65" text-anchor="middle" font-size="12" style="fill:var(--content)"&gt;Client&lt;/text&gt;&lt;line x1="460" y1="77" x2="460" y2="135" style="stroke:var(--compare-b)" stroke-width="1.5" marker-end="url(#arrowB)"/&gt;&lt;line x1="500" y1="77" x2="500" y2="135" style="stroke:var(--compare-b)" stroke-width="1.5" marker-end="url(#arrowB)"/&gt;&lt;text x="428" y="106" font-size="9" style="fill:var(--secondary)"&gt;req #1&lt;/text&gt;&lt;text x="503" y="106" font-size="9" style="fill:var(--secondary)"&gt;retry&lt;/text&gt;&lt;rect x="420" y="138" width="120" height="32" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="480" y="158" text-anchor="middle" font-size="12" style="fill:var(--content)"&gt;Server&lt;/text&gt;&lt;line x1="460" y1="170" x2="430" y2="220" style="stroke:var(--compare-b)" stroke-width="1.5" marker-end="url(#arrowB)"/&gt;&lt;line x1="500" y1="170" x2="530" y2="220" style="stroke:var(--compare-b)" stroke-width="1.5" marker-end="url(#arrowB)"/&gt;&lt;rect x="380" y="222" width="100" height="32" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="430" y="242" text-anchor="middle" font-size="10" style="fill:var(--content)"&gt;executed&lt;/text&gt;&lt;rect x="480" y="222" width="100" height="32" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="530" y="242" text-anchor="middle" font-size="10" style="fill:var(--content)"&gt;executed again&lt;/text&gt;&lt;text x="480" y="290" text-anchor="middle" font-size="10" style="fill:var(--secondary)"&gt;retries run twice, no dedup&lt;/text&gt;&lt;text x="480" y="320" text-anchor="middle" font-size="10" style="fill:var(--secondary)"&gt;no key store, fewer moving parts&lt;/text&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;h2 id="comparison-table"&gt;Comparison Table&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Idempotency&lt;/th&gt;
&lt;th&gt;Simplicity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Design intent&lt;/td&gt;
&lt;td&gt;Guarantee repeated execution has the same effect as one execution&lt;/td&gt;
&lt;td&gt;Minimize the number of moving parts and decisions in the implementation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Handling duplicate requests&lt;/td&gt;
&lt;td&gt;Detects and ignores repeats using an idempotency key or natural key&lt;/td&gt;
&lt;td&gt;Processes each incoming request as new, with no duplicate detection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State required&lt;/td&gt;
&lt;td&gt;Needs a dedup store (key, result, TTL) to remember prior executions&lt;/td&gt;
&lt;td&gt;Stateless with respect to prior calls, nothing extra to persist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Behavior on client retry&lt;/td&gt;
&lt;td&gt;Safe to retry any number of times; result is unchanged&lt;/td&gt;
&lt;td&gt;Retry re-runs the operation, risking duplicate side effects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failure recovery&lt;/td&gt;
&lt;td&gt;Callers can blindly retry after timeouts without side-effect risk&lt;/td&gt;
&lt;td&gt;Callers must add their own checks before retrying after a failure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Implementation cost&lt;/td&gt;
&lt;td&gt;Extra code for key generation, storage, locking, and expiry&lt;/td&gt;
&lt;td&gt;Fewer edge cases, less code, faster to build and review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testing burden&lt;/td&gt;
&lt;td&gt;Must cover concurrent duplicates, race conditions, and key expiry&lt;/td&gt;
&lt;td&gt;Test surface limited to the core logic path, no dedup scenarios&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best-fit workloads&lt;/td&gt;
&lt;td&gt;Payments, distributed queues, webhooks, multi-step workflows&lt;/td&gt;
&lt;td&gt;Internal read-only endpoints, prototypes, low-stakes single-writer ops&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="key-differences"&gt;Key Differences&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong class="kw"&gt;Idempotency&lt;/strong&gt; trades extra state for safety, &lt;strong class="kw"&gt;simplicity&lt;/strong&gt; trades safety for fewer parts&lt;/li&gt;
&lt;li&gt;Idempotent operations rely on a &lt;strong class="kw"&gt;dedup key&lt;/strong&gt; that a simple implementation has no reason to store&lt;/li&gt;
&lt;li&gt;Simplicity pushes retry-safety responsibility onto the &lt;strong class="kw"&gt;caller&lt;/strong&gt; instead of the server&lt;/li&gt;
&lt;li&gt;Idempotency adds &lt;strong class="kw"&gt;testing surface&lt;/strong&gt; for concurrency and expiry that simple code avoids entirely&lt;/li&gt;
&lt;li&gt;The right choice depends on whether duplicate &lt;strong class="kw"&gt;side effects&lt;/strong&gt; are tolerable for the operation&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="when-to-use-each"&gt;When to Use Each&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Idempotency&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Retries vs Load Amplification: Resilience Tactic vs Its Failure Mode</title><link>https://comparison.metacog.co.kr/posts/2026-09-06-retries-vs-load-amplification-resilience-tactic-vs-its-failu/</link><pubDate>Sun, 06 Sep 2026 10:09:08 +0900</pubDate><guid>https://comparison.metacog.co.kr/posts/2026-09-06-retries-vs-load-amplification-resilience-tactic-vs-its-failu/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;&lt;strong class="kw"&gt;Retries&lt;/strong&gt; mask transient failures by having a client re-attempt a request that timed out or errored, trading latency for reliability. &lt;strong class="kw"&gt;Load amplification&lt;/strong&gt; is what happens when those same retries compound: a struggling downstream service receives multiplied traffic from many clients retrying at once, turning a partial slowdown into a full outage. The design challenge is keeping the first from causing the second.&lt;/p&gt;
&lt;h2 id="comparison-diagram"&gt;Comparison Diagram&lt;/h2&gt;
&lt;div class="compare-diagram"&gt;
&lt;svg viewBox="0 0 640 360" xmlns="http://www.w3.org/2000/svg"&gt;&lt;defs&gt;&lt;marker id="arrowA" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse"&gt;&lt;path d="M0,0 L10,5 L0,10 z" style="fill:var(--compare-a)"/&gt;&lt;/marker&gt;&lt;marker id="arrowB" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse"&gt;&lt;path d="M0,0 L10,5 L0,10 z" style="fill:var(--compare-b)"/&gt;&lt;/marker&gt;&lt;/defs&gt;&lt;line x1="320" y1="20" x2="320" y2="340" style="stroke:var(--border)" stroke-width="1.5" stroke-dasharray="4,4"/&gt;&lt;text x="160" y="30" text-anchor="middle" style="fill:var(--primary)" font-size="18" font-weight="bold"&gt;Retries&lt;/text&gt;&lt;text x="480" y="30" text-anchor="middle" style="fill:var(--primary)" font-size="18" font-weight="bold"&gt;Load Amplification&lt;/text&gt;&lt;circle cx="100" cy="80" r="26" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="100" y="85" text-anchor="middle" style="fill:var(--content)" font-size="12"&gt;Client&lt;/text&gt;&lt;rect x="60" y="280" width="80" height="42" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="100" y="305" text-anchor="middle" style="fill:var(--content)" font-size="12"&gt;Service&lt;/text&gt;&lt;line x1="90" y1="104" x2="70" y2="280" style="stroke:var(--compare-a)" stroke-width="1.5" marker-end="url(#arrowA)"/&gt;&lt;text x="20" y="175" style="fill:var(--secondary)" font-size="10"&gt;req 1 (timeout)&lt;/text&gt;&lt;line x1="110" y1="104" x2="130" y2="280" style="stroke:var(--compare-a)" stroke-width="1.5" stroke-dasharray="5,3" marker-end="url(#arrowA)"/&gt;&lt;text x="128" y="195" style="fill:var(--secondary)" font-size="10"&gt;retry (backoff+jitter)&lt;/text&gt;&lt;text x="100" y="345" text-anchor="middle" style="fill:var(--secondary)" font-size="11"&gt;1 extra request, delayed&lt;/text&gt;&lt;circle cx="400" cy="70" r="20" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="400" y="74" text-anchor="middle" style="fill:var(--content)" font-size="10"&gt;C1&lt;/text&gt;&lt;circle cx="480" cy="58" r="20" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="480" y="62" text-anchor="middle" style="fill:var(--content)" font-size="10"&gt;C2&lt;/text&gt;&lt;circle cx="560" cy="70" r="20" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="560" y="74" text-anchor="middle" style="fill:var(--content)" font-size="10"&gt;C3&lt;/text&gt;&lt;rect x="440" y="258" width="90" height="14" style="fill:none;stroke:var(--border)" stroke-width="1"/&gt;&lt;rect x="432" y="270" width="106" height="14" style="fill:none;stroke:var(--border)" stroke-width="1"/&gt;&lt;rect x="424" y="282" width="122" height="14" style="fill:none;stroke:var(--border)" stroke-width="1"/&gt;&lt;rect x="440" y="298" width="90" height="36" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="2.5"/&gt;&lt;text x="485" y="320" text-anchor="middle" style="fill:var(--content)" font-size="11"&gt;Service&lt;/text&gt;&lt;line x1="393" y1="90" x2="460" y2="298" style="stroke:var(--compare-b)" stroke-width="1.2" marker-end="url(#arrowB)"/&gt;&lt;line x1="405" y1="90" x2="470" y2="298" style="stroke:var(--compare-b)" stroke-width="1.2" stroke-dasharray="4,3" marker-end="url(#arrowB)"/&gt;&lt;line x1="477" y1="78" x2="483" y2="298" style="stroke:var(--compare-b)" stroke-width="1.2" marker-end="url(#arrowB)"/&gt;&lt;line x1="485" y1="78" x2="495" y2="298" style="stroke:var(--compare-b)" stroke-width="1.2" stroke-dasharray="4,3" marker-end="url(#arrowB)"/&gt;&lt;line x1="555" y1="90" x2="505" y2="298" style="stroke:var(--compare-b)" stroke-width="1.2" marker-end="url(#arrowB)"/&gt;&lt;line x1="565" y1="90" x2="515" y2="298" style="stroke:var(--compare-b)" stroke-width="1.2" stroke-dasharray="4,3" marker-end="url(#arrowB)"/&gt;&lt;text x="485" y="345" text-anchor="middle" style="fill:var(--secondary)" font-size="11"&gt;6x request volume, queue growing&lt;/text&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;h2 id="comparison-table"&gt;Comparison Table&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Retries&lt;/th&gt;
&lt;th&gt;Load Amplification&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Trigger&lt;/td&gt;
&lt;td&gt;A single failed or timed-out request at the client&lt;/td&gt;
&lt;td&gt;Many clients (or one client&amp;rsquo;s retries) hitting an already degraded service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nature&lt;/td&gt;
&lt;td&gt;Deliberate resilience mechanism&lt;/td&gt;
&lt;td&gt;Emergent side effect of that mechanism under stress&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scope&lt;/td&gt;
&lt;td&gt;Per-request, client-local decision&lt;/td&gt;
&lt;td&gt;Fleet-wide, system-level consequence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Timing pattern&lt;/td&gt;
&lt;td&gt;Delayed re-attempt, ideally with exponential backoff and jitter&lt;/td&gt;
&lt;td&gt;Requests pile up faster than the service can drain them&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Effect on downstream load&lt;/td&gt;
&lt;td&gt;Small, bounded increase of one extra attempt&lt;/td&gt;
&lt;td&gt;Multiplicative increase, often several times baseline traffic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Worst-case outcome&lt;/td&gt;
&lt;td&gt;Slightly higher latency for the caller&lt;/td&gt;
&lt;td&gt;Cascading failure or full outage from a retry storm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mitigation&lt;/td&gt;
&lt;td&gt;Retry budgets, idempotency keys, capped attempt counts&lt;/td&gt;
&lt;td&gt;Circuit breakers, load shedding, backpressure, rate limiting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Observability signal&lt;/td&gt;
&lt;td&gt;Retry count and retry rate per endpoint&lt;/td&gt;
&lt;td&gt;Request rate vs baseline, queue depth, error rate spike&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="key-differences"&gt;Key Differences&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong class="kw"&gt;Retries&lt;/strong&gt; are a client-side decision; load amplification is a system-wide consequence that emerges when many retries overlap&lt;/li&gt;
&lt;li&gt;A single retry adds one extra attempt, but a &lt;strong class="kw"&gt;retry storm&lt;/strong&gt; can multiply traffic several times over in seconds&lt;/li&gt;
&lt;li&gt;&lt;strong class="kw"&gt;Exponential backoff&lt;/strong&gt; with jitter reduces retry-driven amplification by spreading re-attempts over time instead of synchronizing them&lt;/li&gt;
&lt;li&gt;Amplification is contained with &lt;strong class="kw"&gt;circuit breakers&lt;/strong&gt; and load shedding at the service, not by removing retries entirely&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="when-to-use-each"&gt;When to Use Each&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Retries&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Short vs Long Timeouts: Failing Fast vs Tolerating Slowness</title><link>https://comparison.metacog.co.kr/posts/2026-09-06-short-vs-long-timeouts-failing-fast-vs-tolerating-slowness/</link><pubDate>Sun, 06 Sep 2026 10:07:39 +0900</pubDate><guid>https://comparison.metacog.co.kr/posts/2026-09-06-short-vs-long-timeouts-failing-fast-vs-tolerating-slowness/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Timeouts define how long a caller waits for a response before giving up, and the duration you pick trades off resource protection against tolerance for slow-but-valid work. &lt;strong class="kw"&gt;Short timeouts&lt;/strong&gt; fail fast and protect callers from cascading slowness, while &lt;strong class="kw"&gt;long timeouts&lt;/strong&gt; give operations more room to complete under load or over slow links at the cost of holding resources longer.&lt;/p&gt;
&lt;h2 id="comparison-diagram"&gt;Comparison Diagram&lt;/h2&gt;
&lt;div class="compare-diagram"&gt;
&lt;svg viewBox="0 0 640 360" xmlns="http://www.w3.org/2000/svg"&gt;&lt;text x="160" y="40" text-anchor="middle" font-size="20" style="fill:var(--primary)"&gt;Short Timeout&lt;/text&gt;&lt;text x="480" y="40" text-anchor="middle" font-size="20" style="fill:var(--primary)"&gt;Long Timeout&lt;/text&gt;&lt;line x1="320" y1="20" x2="320" y2="340" style="stroke:var(--border)" stroke-width="1" stroke-dasharray="4,4"/&gt;&lt;circle cx="60" cy="100" r="14" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="60" y="104" text-anchor="middle" font-size="11" style="fill:var(--content)"&gt;Call&lt;/text&gt;&lt;line x1="74" y1="100" x2="200" y2="100" style="stroke:var(--compare-a)" stroke-width="2" marker-end="url(#arrowA)"/&gt;&lt;rect x="200" y="85" width="60" height="30" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="230" y="104" text-anchor="middle" font-size="11" style="fill:var(--content)"&gt;Server&lt;/text&gt;&lt;line x1="70" y1="140" x2="200" y2="140" style="stroke:var(--compare-a)" stroke-width="3"/&gt;&lt;text x="135" y="160" text-anchor="middle" font-size="12" style="fill:var(--secondary)"&gt;wait window: 200ms&lt;/text&gt;&lt;path d="M200 140 L188 134 L188 146 Z" style="fill:var(--compare-a)"/&gt;&lt;rect x="210" y="180" width="90" height="36" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="255" y="202" text-anchor="middle" font-size="11" style="fill:var(--content)"&gt;Timeout error&lt;/text&gt;&lt;text x="255" y="235" text-anchor="middle" font-size="11" style="fill:var(--secondary)"&gt;fails fast, retries quickly&lt;/text&gt;&lt;circle cx="380" cy="100" r="14" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="380" y="104" text-anchor="middle" font-size="11" style="fill:var(--content)"&gt;Call&lt;/text&gt;&lt;line x1="394" y1="100" x2="520" y2="100" style="stroke:var(--compare-b)" stroke-width="2" marker-end="url(#arrowB)"/&gt;&lt;rect x="520" y="85" width="60" height="30" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="550" y="104" text-anchor="middle" font-size="11" style="fill:var(--content)"&gt;Server&lt;/text&gt;&lt;line x1="390" y1="140" x2="560" y2="140" style="stroke:var(--compare-b)" stroke-width="3"/&gt;&lt;text x="475" y="160" text-anchor="middle" font-size="12" style="fill:var(--secondary)"&gt;wait window: 30s&lt;/text&gt;&lt;rect x="495" y="180" width="90" height="36" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="540" y="202" text-anchor="middle" font-size="11" style="fill:var(--content)"&gt;Response arrives&lt;/text&gt;&lt;text x="540" y="235" text-anchor="middle" font-size="11" style="fill:var(--secondary)"&gt;tolerates slow work&lt;/text&gt;&lt;line x1="40" y1="270" x2="280" y2="270" style="stroke:var(--border)" stroke-width="1"/&gt;&lt;text x="160" y="290" text-anchor="middle" font-size="11" style="fill:var(--content)"&gt;frees threads/connections sooner&lt;/text&gt;&lt;text x="160" y="308" text-anchor="middle" font-size="11" style="fill:var(--content)"&gt;risk: false failures under load&lt;/text&gt;&lt;line x1="360" y1="270" x2="600" y2="270" style="stroke:var(--border)" stroke-width="1"/&gt;&lt;text x="480" y="290" text-anchor="middle" font-size="11" style="fill:var(--content)"&gt;holds resources longer per call&lt;/text&gt;&lt;text x="480" y="308" text-anchor="middle" font-size="11" style="fill:var(--content)"&gt;risk: cascading pileup/exhaustion&lt;/text&gt;&lt;defs&gt;&lt;marker id="arrowA" markerWidth="8" markerHeight="8" refX="6" refY="4" orient="auto"&gt;&lt;path d="M0,0 L8,4 L0,8 Z" style="fill:var(--compare-a)"/&gt;&lt;/marker&gt;&lt;marker id="arrowB" markerWidth="8" markerHeight="8" refX="6" refY="4" orient="auto"&gt;&lt;path d="M0,0 L8,4 L0,8 Z" style="fill:var(--compare-b)"/&gt;&lt;/marker&gt;&lt;/defs&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;h2 id="comparison-table"&gt;Comparison Table&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Short Timeout&lt;/th&gt;
&lt;th&gt;Long Timeout&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Request initiation&lt;/td&gt;
&lt;td&gt;Caller sets an aggressive deadline immediately on send&lt;/td&gt;
&lt;td&gt;Caller allows a generous window before send returns control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Behavior under normal latency&lt;/td&gt;
&lt;td&gt;Succeeds well within budget, negligible overhead&lt;/td&gt;
&lt;td&gt;Succeeds with unused slack, no functional difference&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Behavior under slow dependency&lt;/td&gt;
&lt;td&gt;Aborts before slow-but-valid work finishes, causing false failures&lt;/td&gt;
&lt;td&gt;Waits out transient slowness, letting valid work complete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource holding&lt;/td&gt;
&lt;td&gt;Frees threads, sockets, and connection pool slots quickly&lt;/td&gt;
&lt;td&gt;Ties up threads, sockets, and pool slots for the full wait&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failure propagation&lt;/td&gt;
&lt;td&gt;Fails fast, enabling quick retry or fallback logic&lt;/td&gt;
&lt;td&gt;Delays failure detection, slowing retries and fallback triggers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;System behavior under overload&lt;/td&gt;
&lt;td&gt;Sheds load quickly, protecting upstream and downstream services&lt;/td&gt;
&lt;td&gt;Risks thread/connection exhaustion and cascading backpressure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retry and circuit breaker interaction&lt;/td&gt;
&lt;td&gt;Pairs well with fast retries and quick breaker tripping&lt;/td&gt;
&lt;td&gt;Delays breaker tripping, masking degradation until timeout expires&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tuning basis&lt;/td&gt;
&lt;td&gt;Set near p99 latency of a healthy, fast dependency&lt;/td&gt;
&lt;td&gt;Set to cover legitimate worst-case work like batch jobs or large payloads&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="key-differences"&gt;Key Differences&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;strong class="kw"&gt;short timeout&lt;/strong&gt; favors quick failure detection over completing genuinely slow requests&lt;/li&gt;
&lt;li&gt;A &lt;strong class="kw"&gt;long timeout&lt;/strong&gt; risks &lt;strong class="kw"&gt;resource exhaustion&lt;/strong&gt; when many calls stall simultaneously&lt;/li&gt;
&lt;li&gt;Short timeouts pair naturally with &lt;strong class="kw"&gt;fast retries&lt;/strong&gt;, while long timeouts delay circuit breaker activation&lt;/li&gt;
&lt;li&gt;Choosing either wrong direction turns normal &lt;strong class="kw"&gt;latency variance&lt;/strong&gt; into either false failures or cascading pileups&lt;/li&gt;
&lt;li&gt;The right value depends on the dependency&amp;rsquo;s actual &lt;strong class="kw"&gt;p99 latency&lt;/strong&gt;, not a guessed constant&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="when-to-use-each"&gt;When to Use Each&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Short Timeout&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Liveness Probe vs Readiness Probe: Kubernetes Health Checks Compared</title><link>https://comparison.metacog.co.kr/posts/2026-08-03-liveness-probe-vs-readiness-probe-kubernetes-health-checks-c/</link><pubDate>Mon, 03 Aug 2026 05:22:16 +0900</pubDate><guid>https://comparison.metacog.co.kr/posts/2026-08-03-liveness-probe-vs-readiness-probe-kubernetes-health-checks-c/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Kubernetes uses liveness and readiness probes to answer two different questions about a running container: is it alive, and is it ready to serve requests. A failed liveness probe triggers a container &lt;strong class="kw"&gt;restart&lt;/strong&gt;, while a failed readiness probe only affects &lt;strong class="kw"&gt;traffic routing&lt;/strong&gt; by pulling the pod out of Service endpoints without killing it.&lt;/p&gt;
&lt;h2 id="comparison-diagram"&gt;Comparison Diagram&lt;/h2&gt;
&lt;div class="compare-diagram"&gt;
&lt;svg viewBox="0 0 640 360" xmlns="http://www.w3.org/2000/svg"&gt;&lt;line x1="320" y1="10" x2="320" y2="350" style="stroke:var(--border)" stroke-width="1" stroke-dasharray="4 4"/&gt;&lt;text x="160" y="26" text-anchor="middle" style="fill:var(--primary)" font-size="15" font-weight="bold"&gt;Liveness Probe&lt;/text&gt;&lt;text x="480" y="26" text-anchor="middle" style="fill:var(--primary)" font-size="15" font-weight="bold"&gt;Readiness Probe&lt;/text&gt;&lt;rect x="90" y="42" width="140" height="34" rx="4" style="fill:none;stroke:var(--content)"/&gt;&lt;text x="160" y="63" text-anchor="middle" style="fill:var(--content)" font-size="12"&gt;Container&lt;/text&gt;&lt;line x1="160" y1="76" x2="160" y2="96" style="stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;rect x="60" y="96" width="200" height="38" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="160" y="119" text-anchor="middle" style="fill:var(--content)" font-size="11"&gt;kubelet: is it alive?&lt;/text&gt;&lt;line x1="160" y1="134" x2="160" y2="152" style="stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;polygon points="160,152 198,180 160,208 122,180" style="fill:none;stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="160" y="184" text-anchor="middle" style="fill:var(--content)" font-size="10"&gt;Fails?&lt;/text&gt;&lt;line x1="160" y1="208" x2="160" y2="240" style="stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="172" y="226" style="fill:var(--secondary)" font-size="10"&gt;yes&lt;/text&gt;&lt;rect x="60" y="240" width="200" height="38" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="160" y="263" text-anchor="middle" style="fill:var(--content)" font-size="11"&gt;Kill &amp;amp; Restart Container&lt;/text&gt;&lt;path d="M60,259 C15,259 15,59 88,59" style="fill:none;stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;polygon points="88,59 78,54 78,64" style="fill:var(--compare-a)"/&gt;&lt;line x1="122" y1="180" x2="90" y2="180" style="stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="105" y="192" text-anchor="end" style="fill:var(--secondary)" font-size="10"&gt;no&lt;/text&gt;&lt;text x="30" y="184" text-anchor="middle" style="fill:var(--secondary)" font-size="10"&gt;stays&lt;/text&gt;&lt;text x="30" y="196" text-anchor="middle" style="fill:var(--secondary)" font-size="10"&gt;running&lt;/text&gt;&lt;text x="160" y="305" text-anchor="middle" style="fill:var(--secondary)" font-size="11"&gt;No effect on Service traffic&lt;/text&gt;&lt;rect x="410" y="42" width="140" height="34" rx="4" style="fill:none;stroke:var(--content)"/&gt;&lt;text x="480" y="63" text-anchor="middle" style="fill:var(--content)" font-size="12"&gt;Container&lt;/text&gt;&lt;line x1="480" y1="76" x2="480" y2="96" style="stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;rect x="380" y="96" width="200" height="38" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="480" y="119" text-anchor="middle" style="fill:var(--content)" font-size="11"&gt;kubelet: is it ready?&lt;/text&gt;&lt;line x1="480" y1="134" x2="480" y2="152" style="stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;polygon points="480,152 518,180 480,208 442,180" style="fill:none;stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="480" y="184" text-anchor="middle" style="fill:var(--content)" font-size="10"&gt;Ready?&lt;/text&gt;&lt;line x1="480" y1="208" x2="480" y2="240" style="stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="492" y="226" style="fill:var(--secondary)" font-size="10"&gt;yes&lt;/text&gt;&lt;rect x="380" y="240" width="200" height="38" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="480" y="263" text-anchor="middle" style="fill:var(--content)" font-size="11"&gt;Added to Service Endpoints&lt;/text&gt;&lt;line x1="518" y1="180" x2="530" y2="180" style="stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="535" y="175" style="fill:var(--secondary)" font-size="10"&gt;no&lt;/text&gt;&lt;rect x="530" y="186" width="80" height="46" rx="4" style="fill:none;stroke:var(--border)" stroke-width="1.5" stroke-dasharray="3 3"/&gt;&lt;text x="570" y="204" text-anchor="middle" style="fill:var(--content)" font-size="9"&gt;Removed&lt;/text&gt;&lt;text x="570" y="216" text-anchor="middle" style="fill:var(--content)" font-size="9"&gt;(not killed)&lt;/text&gt;&lt;line x1="480" y1="278" x2="480" y2="300" style="stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;rect x="390" y="300" width="180" height="34" rx="4" style="fill:none;stroke:var(--border)" stroke-width="1.5"/&gt;&lt;text x="480" y="321" text-anchor="middle" style="fill:var(--content)" font-size="11"&gt;Service / Load Balancer&lt;/text&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;h2 id="comparison-table"&gt;Comparison Table&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Liveness Probe&lt;/th&gt;
&lt;th&gt;Readiness Probe&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Core question&lt;/td&gt;
&lt;td&gt;Is the process still functioning?&lt;/td&gt;
&lt;td&gt;Is the process ready to accept traffic?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Action on failure&lt;/td&gt;
&lt;td&gt;kubelet kills and restarts the container&lt;/td&gt;
&lt;td&gt;Container is left running, no restart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Effect on Service endpoints&lt;/td&gt;
&lt;td&gt;None directly; pod may keep receiving traffic until restart completes&lt;/td&gt;
&lt;td&gt;Pod is removed from Service endpoints, stops receiving traffic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Effect on rolling deployments&lt;/td&gt;
&lt;td&gt;Not consulted for rollout progress&lt;/td&gt;
&lt;td&gt;Must pass before the pod counts as available and rollout proceeds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Restart count impact&lt;/td&gt;
&lt;td&gt;Increments the container restart count on each failure&lt;/td&gt;
&lt;td&gt;Never causes a restart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical checks used&lt;/td&gt;
&lt;td&gt;Lightweight self-check for hangs or deadlocks&lt;/td&gt;
&lt;td&gt;Checks dependency health: DB connections, cache warm-up, config load&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Misconfiguration risk&lt;/td&gt;
&lt;td&gt;Too-aggressive thresholds cause restart loops (CrashLoopBackOff)&lt;/td&gt;
&lt;td&gt;Too-aggressive thresholds pull healthy pods out of rotation, cutting capacity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="key-differences"&gt;Key Differences&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Liveness failure causes a container &lt;strong class="kw"&gt;restart&lt;/strong&gt;; readiness failure only removes the pod from &lt;strong class="kw"&gt;Service endpoints&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Liveness answers &amp;ldquo;is it alive,&amp;rdquo; readiness answers &amp;ldquo;is it &lt;strong class="kw"&gt;ready for traffic&lt;/strong&gt;.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Readiness gates &lt;strong class="kw"&gt;rolling deployments&lt;/strong&gt;; liveness has no say in rollout progress.&lt;/li&gt;
&lt;li&gt;Using a dependency check as a liveness probe risks a &lt;strong class="kw"&gt;restart loop&lt;/strong&gt; when the real problem is an external service, not the process.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="when-to-use-each"&gt;When to Use Each&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Liveness Probe&lt;/strong&gt;&lt;/p&gt;</description></item></channel></rss>