<?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>Event-Driven-Architecture on IT Comparison</title><link>https://comparison.metacog.co.kr/tags/event-driven-architecture/</link><description>Recent content in Event-Driven-Architecture on IT Comparison</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Tue, 04 Aug 2026 05:22:46 +0900</lastBuildDate><atom:link href="https://comparison.metacog.co.kr/tags/event-driven-architecture/index.xml" rel="self" type="application/rss+xml"/><item><title>Broker Topology vs Mediator Topology: Decentralized vs Centralized Event Flow</title><link>https://comparison.metacog.co.kr/posts/2026-08-04-broker-topology-vs-mediator-topology-decentralized-vs-centra/</link><pubDate>Tue, 04 Aug 2026 05:22:46 +0900</pubDate><guid>https://comparison.metacog.co.kr/posts/2026-08-04-broker-topology-vs-mediator-topology-decentralized-vs-centra/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Broker and mediator topology are the two core styles for structuring event-driven architectures, differing in who controls the flow of events between components. In a &lt;strong class="kw"&gt;broker topology&lt;/strong&gt;, events flow directly between producers and consumers through a distributed broker with no central authority, while a &lt;strong class="kw"&gt;mediator topology&lt;/strong&gt; routes every event through a central orchestrator that dictates the sequence of steps. The choice determines how easily the system scales versus how easily complex, stateful workflows can be managed and debugged.&lt;/p&gt;</description></item><item><title>Orchestration vs Choreography: Coordinating Distributed Workflows</title><link>https://comparison.metacog.co.kr/posts/2026-08-04-orchestration-vs-choreography-coordinating-distributed-workf/</link><pubDate>Tue, 04 Aug 2026 05:11:21 +0900</pubDate><guid>https://comparison.metacog.co.kr/posts/2026-08-04-orchestration-vs-choreography-coordinating-distributed-workf/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Orchestration and choreography are two ways to coordinate multiple services in a distributed system or workflow. Orchestration relies on a &lt;strong class="kw"&gt;central controller&lt;/strong&gt; that explicitly directs each step, while choreography lets services independently respond to &lt;strong class="kw"&gt;event reactions&lt;/strong&gt; with no single component in charge. The choice shapes coupling, visibility, and how easily the workflow evolves over 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"&gt;&lt;defs&gt;&lt;marker id="arrowA" viewBox="0 0 10 10" refX="9" 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="9" 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="10" x2="320" y2="350" style="stroke:var(--border)" stroke-width="1.5" stroke-dasharray="4,4"/&gt;&lt;text x="160" y="28" text-anchor="middle" style="fill:var(--primary)" font-size="16" font-weight="bold"&gt;Orchestration&lt;/text&gt;&lt;text x="480" y="28" text-anchor="middle" style="fill:var(--primary)" font-size="16" font-weight="bold"&gt;Choreography&lt;/text&gt;&lt;rect x="110" y="150" width="100" height="50" rx="6" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="160" y="180" text-anchor="middle" style="fill:var(--content)" font-size="12"&gt;Orchestrator&lt;/text&gt;&lt;rect x="20" y="55" width="80" height="40" rx="6" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="60" y="80" text-anchor="middle" style="fill:var(--content)" font-size="11"&gt;Service A&lt;/text&gt;&lt;rect x="220" y="55" width="80" height="40" rx="6" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="260" y="80" text-anchor="middle" style="fill:var(--content)" font-size="11"&gt;Service B&lt;/text&gt;&lt;rect x="120" y="265" width="80" height="40" rx="6" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="160" y="290" text-anchor="middle" style="fill:var(--content)" font-size="11"&gt;Service C&lt;/text&gt;&lt;line x1="130" y1="150" x2="75" y2="97" style="stroke:var(--compare-a)" stroke-width="1.5" marker-end="url(#arrowA)"/&gt;&lt;line x1="190" y1="150" x2="245" y2="97" style="stroke:var(--compare-a)" stroke-width="1.5" marker-end="url(#arrowA)"/&gt;&lt;line x1="160" y1="200" x2="160" y2="263" style="stroke:var(--compare-a)" stroke-width="1.5" marker-end="url(#arrowA)"/&gt;&lt;text x="160" y="330" text-anchor="middle" style="fill:var(--secondary)" font-size="10"&gt;Central controller directs each step&lt;/text&gt;&lt;rect x="440" y="55" width="90" height="40" rx="6" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="485" y="80" text-anchor="middle" style="fill:var(--content)" font-size="11"&gt;Service X&lt;/text&gt;&lt;rect x="350" y="220" width="90" height="40" rx="6" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="395" y="245" text-anchor="middle" style="fill:var(--content)" font-size="11"&gt;Service Y&lt;/text&gt;&lt;rect x="520" y="220" width="90" height="40" rx="6" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="565" y="245" text-anchor="middle" style="fill:var(--content)" font-size="11"&gt;Service Z&lt;/text&gt;&lt;line x1="510" y1="92" x2="555" y2="222" style="stroke:var(--compare-b)" stroke-width="1.5" marker-end="url(#arrowB)"/&gt;&lt;line x1="520" y1="240" x2="440" y2="240" style="stroke:var(--compare-b)" stroke-width="1.5" marker-end="url(#arrowB)"/&gt;&lt;line x1="410" y1="222" x2="465" y2="92" style="stroke:var(--compare-b)" stroke-width="1.5" marker-end="url(#arrowB)"/&gt;&lt;text x="545" y="155" text-anchor="middle" style="fill:var(--secondary)" font-size="9"&gt;event&lt;/text&gt;&lt;text x="480" y="255" text-anchor="middle" style="fill:var(--secondary)" font-size="9"&gt;event&lt;/text&gt;&lt;text x="420" y="155" text-anchor="middle" style="fill:var(--secondary)" font-size="9"&gt;event&lt;/text&gt;&lt;text x="480" y="330" text-anchor="middle" style="fill:var(--secondary)" font-size="10"&gt;Services react to each other's events&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;Orchestration&lt;/th&gt;
&lt;th&gt;Choreography&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Control flow&lt;/td&gt;
&lt;td&gt;A central orchestrator explicitly invokes and sequences each step&lt;/td&gt;
&lt;td&gt;Each service reacts to events independently; no component sequences the whole flow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coupling&lt;/td&gt;
&lt;td&gt;Services couple to the orchestrator&amp;rsquo;s contract, not to each other&lt;/td&gt;
&lt;td&gt;Services couple to shared event schemas rather than a controller&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workflow knowledge&lt;/td&gt;
&lt;td&gt;Orchestrator holds the full picture; services only know their own task&lt;/td&gt;
&lt;td&gt;No single component knows the entire workflow, only its trigger and reaction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failure handling&lt;/td&gt;
&lt;td&gt;Retries and compensation logic live centrally in the orchestrator&lt;/td&gt;
&lt;td&gt;Compensation is distributed, with services reacting to failure events themselves&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adding new steps&lt;/td&gt;
&lt;td&gt;Requires modifying the orchestrator to include the new call&lt;/td&gt;
&lt;td&gt;A new service just subscribes to existing events with no central change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Observability&lt;/td&gt;
&lt;td&gt;Single place to trace and inspect current workflow state&lt;/td&gt;
&lt;td&gt;Requires aggregating distributed logs and traces across services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failure/scaling risk&lt;/td&gt;
&lt;td&gt;Orchestrator can become a bottleneck or single point of failure&lt;/td&gt;
&lt;td&gt;Overall flow becomes hard to see, risking uncoordinated &amp;rsquo;event sprawl'&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical tooling&lt;/td&gt;
&lt;td&gt;BPMN engines, AWS Step Functions, Temporal, Camunda&lt;/td&gt;
&lt;td&gt;Message brokers and event buses like Kafka, SNS/SQS, domain events&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;Orchestration uses a &lt;strong class="kw"&gt;central controller&lt;/strong&gt;; choreography relies on services reacting to &lt;strong class="kw"&gt;events&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Orchestration couples services to the controller; choreography couples them to &lt;strong class="kw"&gt;event contracts&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Extending orchestration means &lt;strong class="kw"&gt;updating the orchestrator&lt;/strong&gt;; extending choreography just means subscribing to events&lt;/li&gt;
&lt;li&gt;Orchestration gives &lt;strong class="kw"&gt;centralized visibility&lt;/strong&gt;; choreography requires &lt;strong class="kw"&gt;distributed tracing&lt;/strong&gt; to see the full flow&lt;/li&gt;
&lt;li&gt;Orchestration risks a bottleneck at the controller; choreography risks &lt;strong class="kw"&gt;workflow sprawl&lt;/strong&gt; across services&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;Orchestration&lt;/strong&gt;&lt;/p&gt;</description></item></channel></rss>