Advanced Spring Boot 4: Event-Driven Architecture (Kafka) · درس

نمط صندوق الصادر للمعاملات

تعلّم كيف يربط نمط صندوق الصادر للمعاملات بين معاملة قاعدة البيانات والنشر إلى Kafka بموثوقية، متجنبًا تناقضات الكتابة المزدوجة في Spring Boot.

الدرس 4 من 413 خطوة

نمط صندوق الصادر للمعاملات درس مجاني في Advanced Spring Boot 4: Event-Driven Architecture (Kafka) على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Advanced Spring Boot 4: Event-Driven Architecture (Kafka)، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Advanced Spring Boot 4: Event-Driven Architecture (Kafka) 4 دروس في المجموع.

بعض أجزاء هذا الدرس لم تُترجم بعد وتظهر باللغة الإنجليزية.

The Dual-Write Problem

A common bug: a service updates its database and publishes a Kafka event in two separate operations. If one succeeds and the other fails, the system becomes inconsistent.

The transactional outbox pattern eliminates this risk.

Core Idea

Instead of publishing directly, write the event into an outbox table within the same database transaction as your business change.

A separate process then reads the outbox and publishes to Kafka.

The Outbox Table

The outbox table stores serialized events plus metadata.

CREATE TABLE outbox (
  id UUID PRIMARY KEY,
  aggregate_type VARCHAR(255),
  aggregate_id VARCHAR(255),
  event_type VARCHAR(255),
  payload JSONB,
  created_at TIMESTAMP DEFAULT now(),
  published BOOLEAN DEFAULT false
);

Writing in One Transaction

Both the domain entity and the outbox row are saved inside one @Transactional method, so they commit or roll back together.

@Transactional
public void placeOrder(Order order) {
    orderRepository.save(order);
    outboxRepository.save(OutboxEvent.from(order));
}

Atomicity Guarantee

Because both writes share the database transaction, there is no window where the order exists without its event recorded. This is the key correctness property.

The Relay Process

A background relay polls unpublished outbox rows and sends them to Kafka, marking them published on success.

@Scheduled(fixedDelay = 500)
public void relay() {
    for (OutboxEvent e : outboxRepository.findUnpublished()) {
        kafkaTemplate.send(e.getTopic(), e.getPayload());
        e.markPublished();
    }
}

At-Least-Once Publishing

If the relay crashes after sending but before marking published, the event is sent again. Consumers must therefore be idempotent, often using the event id as a dedup key.

Change Data Capture Alternative

Instead of polling, tools like Debezium tail the database transaction log and stream outbox inserts to Kafka automatically — lower latency and no polling load.

Cleaning Up the Outbox

Periodically delete or archive published rows to keep the table small and queries fast.

DELETE FROM outbox WHERE published = true AND created_at < now() - INTERVAL '7 days';

When to Use It

Use the outbox when you must keep a database state change and an event publication consistent. It is simpler and more portable than spanning a Kafka transaction across an external database.

Putting It Together

The outbox pattern turns two unreliable writes into one atomic database commit plus a reliable relay. Combine it with idempotent consumers for end-to-end consistency.

Quick Check

Test your understanding of the outbox pattern.

Recap

You learned the transactional outbox pattern.

  • Avoids dual-write inconsistency by using one DB transaction.
  • An outbox table stores pending events.
  • A relay (polling or CDC) publishes to Kafka.
  • Consumers must be idempotent due to at-least-once delivery.
البدء مجانًا

تعلم Advanced Spring Boot 4: Event-Driven Architecture (Kafka) مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
12
الدروس
48

الأسئلة الشائعة

هل درس «نمط صندوق الصادر للمعاملات» مجاني؟

نعم — نص درس «نمط صندوق الصادر للمعاملات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Advanced Spring Boot 4: Event-Driven Architecture (Kafka)، انتقل إلى CoddyKit PRO. تتضمن دورة Advanced Spring Boot 4: Event-Driven Architecture (Kafka) 4 دروس في المجموع.

ماذا ستتعلم في «نمط صندوق الصادر للمعاملات»؟

تعلّم كيف يربط نمط صندوق الصادر للمعاملات بين معاملة قاعدة البيانات والنشر إلى Kafka بموثوقية، متجنبًا تناقضات الكتابة المزدوجة في Spring Boot. تتمرن على Advanced Spring Boot 4: Event-Driven Architecture (Kafka) مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Advanced Spring Boot 4: Event-Driven Architecture (Kafka)؟

لا تُشترط خبرة سابقة. Advanced Spring Boot 4: Event-Driven Architecture (Kafka) على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «نمط صندوق الصادر للمعاملات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Advanced Spring Boot 4: Event-Driven Architecture (Kafka) هذا؟

نعم. كل درس في Advanced Spring Boot 4: Event-Driven Architecture (Kafka) يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. فهم معاملات Kafka
  2. تنفيذ المنتجات المعتمدة على المعاملات
  3. دلالات المعالجة مرة واحدة بالضبط
  4. نمط صندوق الصادر للمعاملات
← العودة إلى Advanced Spring Boot 4: Event-Driven Architecture (Kafka)