Sobes.tech
Middle+
38

Дерекқорға жазу мен Kafka-ға оқиғаны жіберуді атомарлы ету үшін қалай кепілдік беруге болады (Transaction Outbox үлгісі)?

Сұралған компаниялар
луция

AI-дан жауап

sobes.tech AI

Transactional Outbox паттерні Kafka-қа оқиғаларды кепілдендірілген жеткізуді және деректерді атомарлы жазуды шешеді. Негізгі идея — оқиғаны тікелей Kafka-ға транзакция аясында жібермей, оны сол транзакцияда бизнес деректерімен бірге жазу.

Қалай жұмыс істейді:

  1. Бір транзакцияда бизнес деректерін жазамыз және оқиға бар Outbox кестесіне жазамыз.
  2. Транзакция сәтті аяқталғаннан кейін, бөлек процесс (мысалы, жеке сервис немесе фондық жұмыс) Outbox-тан жаңа жазбаларды оқиды және оларды Kafka-ға жібереді.
  3. Жіберу сәтті болғаннан кейін, оқиға жіберілді деп белгіленеді немесе Outbox-тан жойылады.

Осылайша, атомарлық қамтамасыз етіледі: деректер мен оқиға бірге жазылады немесе ештеңе жазылмайды. Kafka-ға жіберу асинхронды түрде жүзеге асады, бірақ оқиғаның жоғалмауы кепілденеді.

Java-да Spring және JPA қолдану мысалы:

@Entity
public class OutboxEvent {
    @Id
    private UUID id;
    private String aggregateType;
    private String aggregateId;
    private String type;
    private String payload;
    private boolean sent;
    // геттерлер мен сеттерлер
}

@Transactional
public void saveBusinessDataAndEvent(BusinessEntity entity, OutboxEvent event) {
    businessRepository.save(entity);
    outboxRepository.save(event);
}

// Жіберу үшін бөлек сервис
public void publishOutboxEvents() {
    List<OutboxEvent> events = outboxRepository.findUnsentEvents();
    for (OutboxEvent event : events) {
        kafkaTemplate.send(event.getType(), event.getPayload());
        event.setSent(true);
        outboxRepository.save(event);
    }
}

Осылайша, біз дерекқор мен Kafka арасында бөлінген транзакциялар мәселелерін болдырмаймыз, оқиғалардың сенімді жеткізілуін қамтамасыз етеміз.