Spring Boot 4 Lanjutan: Seni Bina Dipacu Peristiwa (Kafka) · Pelajaran

Pengeluar dan Pengguna Idempoten

Kukuhkan kepentingan mereka bentuk pengeluar dan pengguna idempoten bagi memastikan keadaan kekal konsisten walaupun mesej diproses semula.

Pelajaran 2 daripada 411 langkah

Pengeluar dan Pengguna Idempoten ialah pelajaran Spring Boot 4 Lanjutan: Seni Bina Dipacu Peristiwa (Kafka) percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Spring Boot 4 Lanjutan: Seni Bina Dipacu Peristiwa (Kafka), dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Spring Boot 4 Lanjutan: Seni Bina Dipacu Peristiwa (Kafka) merangkumi sejumlah 4 pelajaran.

Apakah Idempoten?

Bayangkan anda menekan suis lampu. Jika anda menekannya sekali, lampu menyala. Jika anda menekannya lagi, lampu kekal menyala — lampu itu tidak menjadi “lebih menyala”. Inilah sifat idempoten!

Sesuatu operasi bersifat idempoten jika melaksanakannya berkali-kali menghasilkan keputusan yang sama seperti melaksanakannya sekali. Perkara yang penting ialah keadaan akhir, bukan bilangan kali anda cuba mencapainya.

Mengapakah Idempoten dalam Pemesejan?

Dalam sistem teragih seperti sistem yang menggunakan Kafka, mesej kadangkala boleh dihantar lebih daripada sekali. Hal ini boleh berlaku disebabkan masalah rangkaian, kegagalan pengguna atau pengimbangan semula.

Jika aplikasi anda tidak direka untuk mengendalikan pendua ini, pemprosesan semula mesej yang sama beberapa kali boleh menyebabkan data tidak tepat atau kesan sampingan yang tidak diingini.

Pengeluar Kafka yang Idempoten

Berita baik! Kafka menyediakan sokongan terbina dalam untuk pengeluar yang idempoten. Ini bermakna apabila anda menghantar mesej, Kafka menjamin bahawa mesej itu akan ditulis ke log topik tepat sekali, walaupun pengeluar cuba menghantarnya semula akibat kegagalan sementara.

Hal ini menghalang mesej pendua daripada disimpan dalam Kafka itu sendiri.

Cara Idempoten Kafka Berfungsi

Kafka mencapai keidempotenan pengeluar dengan memberikan ID Pengeluar (PID) unik kepada setiap sesi pengeluar dan nombor jujukan yang meningkat secara monoton kepada setiap kelompok mesej yang dihantar oleh pengeluar tersebut.

Pial Kafka menggunakan ID dan nombor jujukan ini untuk mengesan serta membuang mana-mana kelompok mesej pendua sebelum kelompok tersebut ditulis ke log.

Mendayakan Pengeluar yang Idempoten

Dalam Spring Boot, mendayakan pengeluar Kafka yang idempoten adalah mudah. Anda hanya perlu menetapkan sifat tertentu dalam application.properties atau application.yml anda.

  • spring.kafka.producer.properties.enable.idempotence=true

Menetapkan sifat ini juga mengkonfigurasi tetapan pengeluar lain yang diperlukan secara tersirat, seperti acks=all dan retries.

Contoh Pengeluar yang Idempoten

Cuba jalankan aplikasi Spring Boot mudah ini. Aplikasi ini menghantar mesej ke topik Kafka dengan keidempotenan didayakan. Perhatikan komen konfigurasi.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import java.util.UUID;

@SpringBootApplication
public class IdempotentProducerApp {

  public static void main(String[] args) {
    SpringApplication.run(IdempotentProducerApp.class, args);
  }

  @Bean
  public CommandLineRunner runner(
    KafkaTemplate<String, String> kafkaTemplate) {
    return args -> {
      String messageKey = UUID.randomUUID().toString();
      String messageValue = "Hello from Idempotent Producer!";
      System.out.println("Sending message with key: " 
                         + messageKey);
      kafkaTemplate.send("my-idempotent-topic", 
                         messageKey, messageValue)
        .addCallback(
          result -> System.out.println(
            "Message sent successfully!"),
          ex -> System.err.println(
            "Failed to send: " + ex.getMessage())
        );
    };
  }
}
// Add to application.properties:
// spring.kafka.producer.bootstrap-servers=localhost:9092
// spring.kafka.producer.key-serializer=
//   org.apache.kafka.common.serialization.StringSerializer
// spring.kafka.producer.value-serializer=
//   org.apache.kafka.common.serialization.StringSerializer
// spring.kafka.producer.properties.enable.idempotence=true

Pengguna yang Idempoten

Walaupun Kafka membantu pengeluar mengelakkan penghantaran pendua ke log, Kafka tidak menjamin bahawa pengguna akan memproses mesej tepat sekali. Pengguna mungkin membaca mesej yang sama beberapa kali.

Oleh itu, logik pengguna yang idempoten amat penting. Ini bermakna kod aplikasi anda mesti memastikan bahawa pemprosesan mesej berkali-kali tidak menghasilkan kesan sampingan yang tidak diingini terhadap keadaan sistem anda.

Strategi untuk Pengguna yang Idempoten

Berikut ialah pendekatan lazim untuk menjadikan pengguna anda idempoten:

  • Penjejakan ID Unik: Simpan pengecam unik, seperti gabungan topik-partisyen-offset Kafka atau ID perniagaan daripada mesej, dalam stor berterusan. Semak stor ini sebelum memproses.
  • Perbandingan Keadaan: Sebelum menggunakan kemas kini, bandingkan data mesej masuk dengan keadaan semasa dalam sistem anda. Gunakannya hanya jika keadaan perlu diubah.
  • Keidempotenan Perniagaan: Reka operasi perniagaan anda supaya sememangnya idempoten. Contohnya, “tetapkan status pengguna kepada X” adalah idempoten, manakala “tingkatkan baki pengguna sebanyak Y” tidak.

Contoh Keidempotenan Pengguna

Contoh Spring Boot ini menunjukkan pengguna idempoten asas yang menggunakan set untuk menjejaki rekod yang telah diproses. Dalam aplikasi sebenar, set ini akan digantikan dengan stor berterusan seperti pangkalan data atau Redis.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import java.util.HashSet;
import java.util.Set;

@SpringBootApplication
public class IdempotentConsumerApp {

  public static void main(String[] args) {
    SpringApplication.run(IdempotentConsumerApp.class, args);
  }

  @Component
  public static class MyKafkaListener {
    // In a real app, this would be a persistent store (DB, Redis)
    private final Set<String> processedRecordIds = new HashSet<>();

    @KafkaListener(topics = "my-idempotent-topic", 
                   groupId = "idempotent-group")
    public void listen(ConsumerRecord<String, String> record) {
      // Unique ID for the record (topic-partition-offset)
      String recordId = record.topic() + "-" + record.partition()
                        + "-" + record.offset();

      if (processedRecordIds.contains(recordId)) {
        System.out.println("Duplicate record received (ID: " 
                           + recordId + "). Skipping processing.");
        return;
      }

      // Simulate processing the message
      System.out.println("Processing record ID: " + recordId 
                         + ", Key: " + record.key() 
                         + ", Value: " + record.value());
      // Add to processed set AFTER successful processing
      processedRecordIds.add(recordId);

      // In a real scenario, processing might involve DB updates
      // and 'add' would happen as part of a transaction.
    }
  }
}
// Add to application.properties:
// spring.kafka.consumer.bootstrap-servers=localhost:9092
// spring.kafka.consumer.key-deserializer=
//   org.apache.kafka.common.serialization.StringDeserializer
// spring.kafka.consumer.value-deserializer=
//   org.apache.kafka.common.serialization.StringDeserializer
// spring.kafka.consumer.group-id=idempotent-group
// spring.kafka.consumer.auto-offset-reset=earliest

Semakan Pantas: Keidempotenan

Uji pemahaman anda tentang operasi idempoten dalam pemesejan.

Ulang Kaji dan Langkah Seterusnya

Tahniah! Dalam pelajaran ini, anda telah mempelajari konsep penting keidempotenan dalam sistem dipacu peristiwa.

  • Anda memahami sebab keidempotenan penting untuk mengekalkan keadaan yang konsisten apabila mesej mungkin diproses semula.
  • Anda melihat cara pengeluar yang idempoten terbina dalam Kafka menghalang mesej pendua daripada memasuki topik.
  • Anda meneroka strategi untuk membina pengguna yang idempoten, sekali gus memastikan aplikasi anda mengendalikan mesej pendua dengan baik.

Menguasai keidempotenan ialah langkah penting ke arah membina aplikasi Kafka yang teguh dan boleh dipercayai!

Percuma untuk bermula

Pelajari Spring Boot 4 Lanjutan: Seni Bina Dipacu Peristiwa (Kafka) dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
12
Pelajaran
48

Soalan Lazim

Adakah pelajaran “Pengeluar dan Pengguna Idempoten” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Spring Boot 4 Lanjutan: Seni Bina Dipacu Peristiwa (Kafka), termasuk “Pengeluar dan Pengguna Idempoten”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Spring Boot 4 Lanjutan: Seni Bina Dipacu Peristiwa (Kafka) merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Pengeluar dan Pengguna Idempoten”?

Kukuhkan kepentingan mereka bentuk pengeluar dan pengguna idempoten bagi memastikan keadaan kekal konsisten walaupun mesej diproses semula. Anda berlatih Spring Boot 4 Lanjutan: Seni Bina Dipacu Peristiwa (Kafka) menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Spring Boot 4 Lanjutan: Seni Bina Dipacu Peristiwa (Kafka)?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Spring Boot 4 Lanjutan: Seni Bina Dipacu Peristiwa (Kafka) di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.

Berapa lamakah pelajaran “Pengeluar dan Pengguna Idempoten” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Spring Boot 4 Lanjutan: Seni Bina Dipacu Peristiwa (Kafka) ini?

Ya. Setiap pelajaran Spring Boot 4 Lanjutan: Seni Bina Dipacu Peristiwa (Kafka) menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Petua Penalaan Prestasi untuk Kafka
  2. Pengeluar dan Pengguna Idempoten
  3. Menggunakan Aplikasi Spring Boot Kafka ke Awan
  4. Perancangan Kapasiti: Partition dan Replikasi
← Kembali ke Spring Boot 4 Lanjutan: Seni Bina Dipacu Peristiwa (Kafka)