Foundationপ্রথম নীতি থেকে
LEVEL 9 · Distributed Systems

Outbox Pattern

আউটবক্স প্যাটার্ন

DB update আর event publish দুই system-এ atomic অসম্ভব — তাই event আগে একই transaction-এ outbox table-এ, relay পরে পাঠায়।

also: transactional-outbox

Dual-write সমস্যা ও সমাধান:

ভুল: BEGIN; UPDATE orders...; COMMIT; broker.publish("OrderPaid")
     ↑ commit-এর পরে crash = event চিরতরে হারালো

ঠিক: BEGIN; UPDATE orders...;
          INSERT INTO outbox(event) VALUES('OrderPaid'); COMMIT;
     relay: outbox poll → broker → mark sent
  • Relay at-least-once পড়ে — consumer-এ idempotency key বাধ্যতামূলক, duplicate event নয়, duplicate effect আটকাতে হয়
  • CDC রূপভেদ: Debezium WAL tail করে outbox row-কে broker-এ — polling latency ছাড়া, application code আরও পাতলা
  • মূল্য নগণ্য বলে ভুলবেন না: extra table, relay infra, ordering guarantee per aggregate