<?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>Communication-Patterns on IT Comparison</title><link>https://comparison.metacog.co.kr/tags/communication-patterns/</link><description>Recent content in Communication-Patterns on IT Comparison</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Tue, 04 Aug 2026 05:12:35 +0900</lastBuildDate><atom:link href="https://comparison.metacog.co.kr/tags/communication-patterns/index.xml" rel="self" type="application/rss+xml"/><item><title>Synchronous vs Asynchronous Communication: Blocking Calls vs Non-Blocking Messaging</title><link>https://comparison.metacog.co.kr/posts/2026-08-04-synchronous-vs-asynchronous-communication-blocking-calls-vs/</link><pubDate>Tue, 04 Aug 2026 05:12:35 +0900</pubDate><guid>https://comparison.metacog.co.kr/posts/2026-08-04-synchronous-vs-asynchronous-communication-blocking-calls-vs/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Synchronous communication is a model where the caller sends a request and then &lt;strong class="kw"&gt;blocks&lt;/strong&gt;, halting its own execution until a response arrives. Asynchronous communication lets the caller fire off a message and continue working immediately, handling the eventual reply through a &lt;strong class="kw"&gt;callback or queue&lt;/strong&gt; whenever it arrives. The choice shapes latency tolerance, resource usage, failure handling, and how tightly services are coupled in time.&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" font-family="sans-serif"&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="35" text-anchor="middle" style="fill:var(--primary)" font-size="18" font-weight="bold"&gt;Synchronous&lt;/text&gt;
&lt;text x="480" y="35" text-anchor="middle" style="fill:var(--primary)" font-size="18" font-weight="bold"&gt;Asynchronous&lt;/text&gt;
&lt;line x1="90" y1="55" x2="90" y2="325" style="stroke:var(--border)" stroke-width="1.5" stroke-dasharray="3 3"/&gt;
&lt;line x1="240" y1="55" x2="240" y2="325" style="stroke:var(--border)" stroke-width="1.5" stroke-dasharray="3 3"/&gt;
&lt;text x="90" y="52" text-anchor="middle" style="fill:var(--content)" font-size="12"&gt;Caller&lt;/text&gt;
&lt;text x="240" y="52" text-anchor="middle" style="fill:var(--content)" font-size="12"&gt;Service&lt;/text&gt;
&lt;line x1="90" y1="90" x2="240" y2="110" style="stroke:var(--compare-a)" stroke-width="2"/&gt;
&lt;polygon points="240,110 230,105 230,115" style="fill:var(--compare-a)"/&gt;
&lt;text x="150" y="88" text-anchor="middle" style="fill:var(--content)" font-size="11"&gt;request&lt;/text&gt;
&lt;rect x="83" y="110" width="14" height="120" rx="2" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;
&lt;text x="65" y="175" text-anchor="middle" style="fill:var(--secondary)" font-size="11" transform="rotate(-90 65 175)"&gt;blocked&lt;/text&gt;
&lt;rect x="233" y="110" width="14" height="100" rx="2" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;
&lt;text x="260" y="160" text-anchor="middle" style="fill:var(--secondary)" font-size="11"&gt;processing&lt;/text&gt;
&lt;line x1="240" y1="210" x2="90" y2="230" style="stroke:var(--compare-a)" stroke-width="2"/&gt;
&lt;polygon points="90,230 100,225 100,235" style="fill:var(--compare-a)"/&gt;
&lt;text x="165" y="215" text-anchor="middle" style="fill:var(--content)" font-size="11"&gt;response&lt;/text&gt;
&lt;text x="90" y="255" text-anchor="middle" style="fill:var(--content)" font-size="11"&gt;resumes&lt;/text&gt;
&lt;line x1="410" y1="55" x2="410" y2="325" style="stroke:var(--border)" stroke-width="1.5" stroke-dasharray="3 3"/&gt;
&lt;line x1="560" y1="55" x2="560" y2="325" style="stroke:var(--border)" stroke-width="1.5" stroke-dasharray="3 3"/&gt;
&lt;text x="410" y="52" text-anchor="middle" style="fill:var(--content)" font-size="12"&gt;Caller&lt;/text&gt;
&lt;text x="560" y="52" text-anchor="middle" style="fill:var(--content)" font-size="12"&gt;Service&lt;/text&gt;
&lt;line x1="410" y1="90" x2="560" y2="105" style="stroke:var(--compare-b)" stroke-width="2"/&gt;
&lt;polygon points="560,105 550,100 550,110" style="fill:var(--compare-b)"/&gt;
&lt;text x="480" y="88" text-anchor="middle" style="fill:var(--content)" font-size="11"&gt;send&lt;/text&gt;
&lt;rect x="385" y="115" width="50" height="30" rx="3" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;
&lt;text x="410" y="134" text-anchor="middle" style="fill:var(--content)" font-size="10"&gt;other work&lt;/text&gt;
&lt;rect x="553" y="105" width="14" height="120" rx="2" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;
&lt;text x="590" y="165" text-anchor="middle" style="fill:var(--secondary)" font-size="11"&gt;processing&lt;/text&gt;
&lt;line x1="560" y1="225" x2="410" y2="255" style="stroke:var(--compare-b)" stroke-width="2" stroke-dasharray="5 3"/&gt;
&lt;polygon points="410,255 420,250 420,260" style="fill:var(--compare-b)"/&gt;
&lt;text x="500" y="235" text-anchor="middle" style="fill:var(--content)" font-size="11"&gt;callback / event&lt;/text&gt;
&lt;rect x="385" y="265" width="50" height="30" rx="3" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;
&lt;text x="410" y="284" text-anchor="middle" style="fill:var(--content)" font-size="10"&gt;handle reply&lt;/text&gt;
&lt;line x1="20" y1="60" x2="20" y2="320" style="stroke:var(--secondary)" stroke-width="1"/&gt;
&lt;polygon points="20,320 16,310 24,310" style="fill:var(--secondary)"/&gt;
&lt;text x="20" y="335" text-anchor="middle" style="fill:var(--secondary)" font-size="10"&gt;time&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;Synchronous&lt;/th&gt;
&lt;th&gt;Asynchronous&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Call initiation&lt;/td&gt;
&lt;td&gt;Caller sends request and immediately waits for it to complete&lt;/td&gt;
&lt;td&gt;Caller sends a message and continues its own execution right away&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Execution model&lt;/td&gt;
&lt;td&gt;Caller thread blocks until the response returns inline&lt;/td&gt;
&lt;td&gt;Caller thread is free; response is handled via callback, event, or poll later&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coupling in time&lt;/td&gt;
&lt;td&gt;Both sender and receiver must be available and reachable at the same moment&lt;/td&gt;
&lt;td&gt;Sender and receiver need not be online simultaneously; a broker bridges the gap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Response delivery&lt;/td&gt;
&lt;td&gt;Direct return value over the same connection used for the request&lt;/td&gt;
&lt;td&gt;Message queue, event bus, webhook, or polling delivers the result separately&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failure handling&lt;/td&gt;
&lt;td&gt;Failure surfaces immediately to the caller as an exception or timeout&lt;/td&gt;
&lt;td&gt;Failure is detected later via retries, dead-letter queues, or timeout callbacks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ordering &amp;amp; concurrency&lt;/td&gt;
&lt;td&gt;One call in flight per thread, so ordering is implicit and easy to reason about&lt;/td&gt;
&lt;td&gt;Many calls can be in flight concurrently, so ordering must be handled explicitly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource usage&lt;/td&gt;
&lt;td&gt;Thread and connection are held open for the full duration of the call&lt;/td&gt;
&lt;td&gt;Thread is released immediately; resources are consumed only during actual processing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical transport&lt;/td&gt;
&lt;td&gt;REST/HTTP request-response, gRPC unary calls, direct RPC&lt;/td&gt;
&lt;td&gt;Message queues (Kafka, RabbitMQ, SQS), event streams, webhooks&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;Synchronous callers &lt;strong class="kw"&gt;block&lt;/strong&gt; until a response returns; asynchronous callers proceed without waiting.&lt;/li&gt;
&lt;li&gt;Synchronous ties sender and receiver together in time; asynchronous decouples them through a &lt;strong class="kw"&gt;broker&lt;/strong&gt; or queue.&lt;/li&gt;
&lt;li&gt;Synchronous failures surface immediately as timeouts or exceptions; asynchronous failures often need &lt;strong class="kw"&gt;dead-letter&lt;/strong&gt; handling or retries.&lt;/li&gt;
&lt;li&gt;Synchronous holds a thread or connection open for the call&amp;rsquo;s duration; asynchronous frees the caller, trading immediacy for &lt;strong class="kw"&gt;throughput&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;Synchronous&lt;/strong&gt;&lt;/p&gt;</description></item></channel></rss>