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