उन्नत Spring Boot 4: घटना-प्रेरित संरचना (काफ्का) · पाठ

लेन-देनात्मक उत्पादक लागू करना

Spring Boot में लेन-देनात्मक उत्पादकों को कॉन्फ़िगर और उपयोग कीजिए, ताकि संदेशों का पूरा बैच या तो सफलतापूर्वक भेजा जाए या बिल्कुल न भेजा जाए।

पाठ 2, कुल 4 में से11 चरण

लेन-देनात्मक उत्पादक लागू करना, CoddyKit पर उन्नत Spring Boot 4: घटना-प्रेरित संरचना (काफ्का) का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह उन्नत Spring Boot 4: घटना-प्रेरित संरचना (काफ्का) सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। उन्नत Spring Boot 4: घटना-प्रेरित संरचना (काफ्का) पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

Kafka के साथ परमाण्विक क्रियाएँ

वितरित प्रणालियों में यह सुनिश्चित करना अत्यंत महत्वपूर्ण है कि क्रियाओं की कोई श्रृंखला या तो पूरी तरह सफल हो या पूरी तरह विफल (परमाण्विकता) हो। यहीं Kafka में लेन-देन संबंधी उत्पादक उपयोगी होते हैं।

वे आपको अलग-अलग टॉपिक और पार्टिशन में कई संदेश एकल परमाण्विक इकाई के रूप में भेजने देते हैं। यदि लेन-देन का कोई भी भाग विफल हो जाता है, तो उस लेन-देन के भीतर भेजे गए सभी संदेशों को रोलबैक कर दिया जाता है।

अपने लेन-देन की पहचान करना

लेन-देन संबंधी उत्पादकों का उपयोग करने के लिए आपको अपने उत्पादक के लिए एक अद्वितीय transactional.id कॉन्फ़िगर करना होगा। Kafka के लिए exactly-once अर्थविज्ञान की गारंटी देने और उत्पादक के दोबारा शुरू होने पर लेन-देन पुनर्प्राप्त करने हेतु यह ID आवश्यक है।

इसे अपने उत्पादक के लेन-देन संबंधी सत्र के एक अद्वितीय नाम के रूप में समझें। Kafka इसका उपयोग उत्पादक और उसके चल रहे लेन-देन की पहचान करने के लिए करता है।

Spring Boot कॉन्फ़िगरेशन

पहले सुनिश्चित करें कि आपके पास spring-kafka निर्भरता है। फिर अपने Kafka ब्रोकर का पता और transactional-id-prefix को application.yml में कॉन्फ़िगर करें। इस उपसर्ग का उपयोग प्रत्येक उत्पादक इंस्टेंस के लिए अद्वितीय ID बनाने में किया जाएगा।

# application.yml
spring:
  kafka:
    bootstrap-servers: localhost:9092
    producer:
      # A unique ID prefix for the transactional producer
      transactional-id-prefix: my-app-tx-

लेन-देन संबंधी उत्पादक कॉन्फ़िगर करना

Spring Kafka लेन-देन संबंधी उत्पादक की स्थापना को सरल बनाता है। आपको अपने ProducerFactory को लेन-देन संबंधी बनाने और फिर उसका उपयोग करके एक KafkaTemplate बनाने की आवश्यकता है।

ध्यान दें कि लेन-देन के लिए acks: all अत्यंत महत्वपूर्ण है। यह सुनिश्चित करता है कि किसी संदेश को कमिट किया हुआ मानने से पहले सभी इन-सिंक प्रतिकृतियाँ उसकी स्वीकृति दें।

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.core.DefaultKafkaProducerFactory;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.core.ProducerFactory;
import java.util.HashMap;
import java.util.Map;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.springframework.beans.factory.annotation.Value;

@Configuration
public class KafkaProducerConfig {

    @Value("${spring.kafka.bootstrap-servers}")
    private String bootstrapServers;

    @Value("${spring.kafka.producer.transactional-id-prefix}")
    private String transactionalIdPrefix;

    @Bean
    public ProducerFactory<String, String> producerFactory() {
        Map<String, Object> configProps = new HashMap<>();
        configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
        configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, org.apache.kafka.common.serialization.StringSerializer.class);
        configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, org.apache.kafka.common.serialization.StringSerializer.class);
        configProps.put(ProducerConfig.ACKS_CONFIG, "all"); // Essential for transactions
        configProps.put(ProducerConfig.RETRIES_CONFIG, 0); // Kafka handles retries internally for transactions

        DefaultKafkaProducerFactory<String, String> factory = new DefaultKafkaProducerFactory<>(configProps);
        factory.setTransactionIdPrefix(transactionalIdPrefix); // Set the transactional ID prefix
        return factory;
    }

    @Bean
    public KafkaTemplate<String, String> kafkaTemplate() {
        return new KafkaTemplate<>(producerFactory());
    }
}

Spring लेन-देन के साथ एकीकरण

Kafka लेन-देन को Spring के घोषणात्मक लेन-देन प्रबंधन (@Transactional) के साथ एकीकृत करने के लिए आपको एक KafkaTransactionManager बीन परिभाषित करनी होगी।

यह प्रबंधक Kafka उत्पादक के लेन-देन को Spring द्वारा प्रबंधित अन्य लेन-देन (जैसे डेटाबेस क्रियाओं) के साथ समन्वित करता है, जिससे आप विभिन्न संसाधन प्रकारों में परमाण्विकता प्राप्त कर सकते हैं।

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.transaction.KafkaTransactionManager;
import org.springframework.kafka.core.ProducerFactory;

@Configuration
public class KafkaTransactionManagerConfig {

    @Bean
    public KafkaTransactionManager kafkaTransactionManager(ProducerFactory<String, String> producerFactory) {
        return new KafkaTransactionManager(producerFactory);
    }
}

एकल लेन-देन संबंधी संदेश भेजना

अब आप किसी सेवा विधि पर @Transactional का उपयोग कर सकते हैं। कॉन्फ़िगर किए गए KafkaTemplate का उपयोग करके इस विधि के भीतर भेजे गए सभी Kafka संदेश एक ही लेन-देन का हिस्सा होंगे।

यदि विधि सफलतापूर्वक पूरी हो जाती है, तो लेन-देन कमिट हो जाता है। यदि कोई अपवाद आता है, तो इसे रोलबैक कर दिया जाता है और कोई संदेश नहीं भेजा जाता।

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@Service
public class TransactionalProducerService {

    private final KafkaTemplate<String, String> kafkaTemplate;

    @Autowired
    public TransactionalProducerService(KafkaTemplate<String, String> kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }

    @Transactional
    public void sendGreeting(String user) {
        String message = "Hello, " + user + "!";
        kafkaTemplate.send("greetings-topic", user, message);
        System.out.println("Attempted to send: " + message);
    }

    // Main method for a runnable Spring Boot application
    @SpringBootApplication
    public static class DemoApplication {
        public static void main(String[] args) {
            // This would typically be run as a Spring Boot application
            // and the service called via a controller or runner.
            // For demonstration, we just show the structure.
            System.out.println("Run this as a Spring Boot app to use the service.");
            // SpringApplication.run(DemoApplication.class, args);
        }
    }
}

कई संदेश, एक लेन-देन

लेन-देन संबंधी उत्पादकों की वास्तविक शक्ति कई संदेश भेजते समय दिखाई देती है। @Transactional विधि के भीतर के सभी संदेशों को एक समूह में रखा जाता है।

यदि भेजने की कोई एक क्रिया विफल हो जाती है, तो उस लेन-देन के भीतर पहले भेजे गए सभी संदेश निरस्त कर दिए जाते हैं। इससे अलग-अलग टॉपिक या पार्टिशन में डेटा की संगति सुनिश्चित होती है।

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class OrderProcessingService {

    private final KafkaTemplate<String, String> kafkaTemplate;

    @Autowired
    public OrderProcessingService(KafkaTemplate<String, String> kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }

    @Transactional
    public void processOrder(String orderId, String item) {
        // Send order creation event
        kafkaTemplate.send("order-created-topic", orderId, "Order " + orderId + " created for " + item);
        System.out.println("Sent order creation for: " + orderId);

        // Simulate a failure for demonstration
        if (orderId.equals("FAIL_ORDER")) {
            throw new RuntimeException("Simulated order processing failure!");
        }

        // Send inventory update event
        kafkaTemplate.send("inventory-update-topic", item, "Item " + item + " quantity reduced for order " + orderId);
        System.out.println("Sent inventory update for: " + item);

        System.out.println("Order " + orderId + " processed transactionally.");
    }

    // Main method for a runnable Spring Boot application
    public static void main(String[] args) {
        // This would typically be run as a Spring Boot application
        // and the service called via a controller or runner.
        System.out.println("Run this as a Spring Boot app to use the service.");
    }
}

लेन-देन रोलबैक का व्यवहार

यदि किसी @Transactional विधि के भीतर कोई अपवाद उत्पन्न होता है, तो KafkaTransactionManager लेन-देन का रोलबैक शुरू कर देगा।

इसका अर्थ है कि उस लेन-देन के भीतर Kafka को भेजे गए कोई भी संदेश उपभोक्ताओं को दिखाई नहीं देंगे। Kafka की लेन-देन संबंधी क्षमताएँ सुनिश्चित करती हैं कि आंशिक डेटा कभी कमिट न हो और डेटा की अखंडता बनी रहे।

परमाण्विकता क्यों महत्वपूर्ण है

जटिल इवेंट-आधारित कार्यप्रवाहों में डेटा की अखंडता बनाए रखने के लिए लेन-देन संबंधी उत्पादक अत्यंत महत्वपूर्ण हैं। वे ऐसी स्थितियों को रोकते हैं जिनमें, उदाहरण के लिए, ऑर्डर बनाने का इवेंट भेज दिया जाए लेकिन उससे संबंधित इन्वेंटरी अपडेट विफल हो जाए।

इससे यह सुनिश्चित होता है कि अस्थायी त्रुटियों या संसाधन के दौरान अनुप्रयोग के क्रैश होने पर भी आपकी प्रणाली की स्थिति संगत बनी रहे।

लेन-देन संबंधी उत्पादक जाँच

एक Spring Boot अनुप्रयोग पर विचार करें, जो @Transactional विधि के भीतर KafkaTemplate का उपयोग करके Kafka को संदेश भेज रहा है।

यदि दो संदेशों में से पहला भेजने के बाद कोई अनचेक किया गया अपवाद उत्पन्न हो जाए, तो क्या होगा?

पुनरावलोकन: परमाण्विक संदेश-प्रेषण

हमने Spring Boot Kafka में लेन-देन वाले उत्पादकों को लागू करना सीखा है। इसमें transactional.id को कॉन्फ़िगर करना, ProducerFactory में लेन-देन सक्षम करना, KafkaTransactionManager का उपयोग करना और सेवा विधियों पर @Transactional लगाना शामिल है।

लेन-देन वाले उत्पादक परमाणुता सुनिश्चित करते हैं। इसका अर्थ है कि संदेशों का एक समूह या तो पूरी तरह कमिट होता है या पूरी तरह वापस ले लिया जाता है। यह डेटा की संगति के लिए अत्यंत महत्वपूर्ण है। अब हम लेन-देन वाले उत्पादकों को दोहराव-रोधी उपभोक्ताओं के साथ मिलाकर ठीक-एक-बार प्रसंस्करण की शब्दार्थ-व्यवस्था प्राप्त करना सीखेंगे।

शुरुआत निःशुल्क

एआई शिक्षक के साथ उन्नत Spring Boot 4: घटना-प्रेरित संरचना (काफ्का) सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
12
पाठ
48

अक्सर पूछे जाने वाले प्रश्न

क्या “लेन-देनात्मक उत्पादक लागू करना” पाठ निःशुल्क है?

हाँ — उन्नत Spring Boot 4: घटना-प्रेरित संरचना (काफ्का) अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “लेन-देनात्मक उत्पादक लागू करना” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। उन्नत Spring Boot 4: घटना-प्रेरित संरचना (काफ्का) पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“लेन-देनात्मक उत्पादक लागू करना” में मैं क्या सीखूँगा?

Spring Boot में लेन-देनात्मक उत्पादकों को कॉन्फ़िगर और उपयोग कीजिए, ताकि संदेशों का पूरा बैच या तो सफलतापूर्वक भेजा जाए या बिल्कुल न भेजा जाए। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ उन्नत Spring Boot 4: घटना-प्रेरित संरचना (काफ्का) का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या उन्नत Spring Boot 4: घटना-प्रेरित संरचना (काफ्का) शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर उन्नत Spring Boot 4: घटना-प्रेरित संरचना (काफ्का) शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।

“लेन-देनात्मक उत्पादक लागू करना” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस उन्नत Spring Boot 4: घटना-प्रेरित संरचना (काफ्का) पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर उन्नत Spring Boot 4: घटना-प्रेरित संरचना (काफ्का) पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. Kafka लेन-देन को समझना
  2. लेन-देनात्मक उत्पादक लागू करना
  3. ठीक-एक-बार प्रसंस्करण अर्थविज्ञान
  4. ट्रांज़ैक्शनल आउटबॉक्स पैटर्न
← उन्नत Spring Boot 4: घटना-प्रेरित संरचना (काफ्का) पर वापस जाएँ