Middle+
38
Дерекқорға жазу мен Kafka-ға оқиғаны жіберуді атомарлы ету үшін қалай кепілдік беруге болады (Transaction Outbox үлгісі)?
Сұралған компаниялар
луция
AI-дан жауап
sobes.tech AI
Transactional Outbox паттерні Kafka-қа оқиғаларды кепілдендірілген жеткізуді және деректерді атомарлы жазуды шешеді. Негізгі идея — оқиғаны тікелей Kafka-ға транзакция аясында жібермей, оны сол транзакцияда бизнес деректерімен бірге жазу.
Қалай жұмыс істейді:
- Бір транзакцияда бизнес деректерін жазамыз және оқиға бар Outbox кестесіне жазамыз.
- Транзакция сәтті аяқталғаннан кейін, бөлек процесс (мысалы, жеке сервис немесе фондық жұмыс) Outbox-тан жаңа жазбаларды оқиды және оларды Kafka-ға жібереді.
- Жіберу сәтті болғаннан кейін, оқиға жіберілді деп белгіленеді немесе 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 арасында бөлінген транзакциялар мәселелерін болдырмаймыз, оқиғалардың сенімді жеткізілуін қамтамасыз етеміз.