Apache Kafka - Basit Üretici Örneği

Java istemcisi kullanarak mesajları yayınlamak ve tüketmek için bir uygulama oluşturalım. Kafka üretici istemcisi aşağıdaki API'lerden oluşur.

KafkaProducer API

Bu bölümdeki en önemli Kafka üretici API kümesini anlayalım. KafkaProducer API'nin merkezi kısmı, KafkaProducer sınıfıdır. KafkaProducer sınıfı, yapıcısındaki bir Kafka aracısını aşağıdaki yöntemlerle bağlama seçeneği sağlar.

  • KafkaProducer sınıfı, iletileri bir konuya eşzamansız olarak göndermek için gönderme yöntemi sağlar. Send () imzası aşağıdaki gibidir

producer.send(new ProducerRecord<byte[],byte[]>(topic, 
partition, key1, value1) , callback);
  • ProducerRecord - Üretici, gönderilmeyi bekleyen bir kayıt tamponunu yönetir.

  • Callback - Kayıt sunucu tarafından onaylandığında yürütülecek kullanıcı tarafından sağlanan bir geri arama (boş, geri arama olmadığını gösterir).

  • KafkaProducer sınıfı, önceden gönderilen tüm iletilerin gerçekten tamamlandığından emin olmak için bir temizleme yöntemi sağlar. Flush yönteminin sözdizimi aşağıdaki gibidir -

public void flush()
  • KafkaProducer sınıfı, belirli bir konu için bölüm meta verilerini elde etmeye yardımcı olan partitionFor yöntemini sağlar. Bu, özel bölümleme için kullanılabilir. Bu yöntemin imzası aşağıdaki gibidir -

public Map metrics()

Üretici tarafından tutulan dahili ölçümlerin haritasını döndürür.

  • public void close () - KafkaProducer sınıfı, önceden gönderilen tüm istekler tamamlanıncaya kadar yakın yöntem blokları sağlar.

Üretici API'si

Producer API'nin merkezi kısmı, Üretici sınıfıdır. Üretici sınıfı, aşağıdaki yöntemlerle yapıcısındaki Kafka aracısını bağlama seçeneği sunar.

Üretici Sınıfı

Üretici sınıfı, send Aşağıdaki imzaları kullanarak tek veya birden çok konuya mesaj gönderin.

public void send(KeyedMessaget<k,v> message) 
- sends the data to a single topic,par-titioned by key using either sync or async producer.
public void send(List<KeyedMessage<k,v>>messages)
- sends data to multiple topics.
Properties prop = new Properties();
prop.put(producer.type,”async”)
ProducerConfig config = new ProducerConfig(prop);

İki tür üretici vardır - Sync ve Async.

Aynı API yapılandırması, Sync üreticisi için de geçerlidir . Aralarındaki fark, bir senkronizasyon üreticisinin mesajları doğrudan göndermesi, ancak mesajları arka planda göndermesidir. Daha yüksek bir iş hacmi istediğinizde zaman uyumsuz üretici tercih edilir. 0.8 gibi önceki sürümlerde, zaman uyumsuz bir üreticinin hata işleyicileri kaydetmek için send () için bir geri araması yoktur. Bu, yalnızca mevcut 0.9 sürümünde mevcuttur.

public void close ()

Üretici sınıfı sağlar close Üretici havuzu bağlantılarını tüm Kafka brokerlerine kapatma yöntemi.

Yapılandırma ayarları

Daha iyi anlaşılması için Producer API'nin ana yapılandırma ayarları aşağıdaki tabloda listelenmiştir -

S.No Yapılandırma Ayarları ve Açıklama
1

client.id

üretici uygulamasını tanımlar

2

producer.type

eşzamanlı veya eşzamansız

3

acks

Acks yapılandırması, üretici talepleri altındaki kriterlerin eksiksiz olarak kabul edilir.

4

retries

Üretici talebi başarısız olursa, otomatik olarak belirli bir değerle yeniden deneyin.

5

bootstrap.servers

aracıların önyükleme listesi.

6

linger.ms

istek sayısını azaltmak istiyorsanız, linger.ms'yi belirli bir değerden daha büyük bir değere ayarlayabilirsiniz.

7

key.serializer

Serileştirici arabirimi anahtarı.

8

value.serializer

serileştirici arabirimi için değer.

9

batch.size

Tampon boyutu.

10

buffer.memory

üreticinin arabellekleme için kullanabileceği toplam bellek miktarını kontrol eder.

ProducerRecord API

ProducerRecord, aşağıdaki imzayı kullanarak bölüm, anahtar ve değer çiftleri ile bir kayıt oluşturmak için Kafka cluster.ProducerRecord sınıf yapıcısına gönderilen bir anahtar / değer çiftidir.

public ProducerRecord (string topic, int partition, k key, v value)
  • Topic - kayda eklenecek kullanıcı tanımlı konu adı.

  • Partition - bölüm sayısı

  • Key - Kayda dahil edilecek anahtar.

  • Value - İçeriği kaydedin
public ProducerRecord (string topic, k key, v value)

ProducerRecord sınıf yapıcısı, anahtarlı, değer çiftli ve bölümsüz bir kayıt oluşturmak için kullanılır.

  • Topic - Kayıt atamak için bir konu oluşturun.

  • Key - kaydın anahtarı.

  • Value - içeriği kaydedin.

public ProducerRecord (string topic, v value)

ProducerRecord sınıfı, bölüm ve anahtarsız bir kayıt oluşturur.

  • Topic - bir konu oluşturun.

  • Value - içeriği kaydedin.

ProducerRecord sınıfı yöntemleri aşağıdaki tabloda listelenmiştir -

S.No Sınıf Yöntemleri ve Açıklama
1

public string topic()

Konu kayda eklenecek.

2

public K key()

Kayda dahil edilecek anahtar. Böyle bir anahtar yoksa, null burada yeniden döndürülecektir.

3

public V value()

İçeriği kaydedin.

4

partition()

Kayıt için bölüm sayısı

SimpleProducer uygulaması

Uygulamayı oluşturmadan önce, önce ZooKeeper ve Kafka broker'ı başlatın, ardından create topic komutunu kullanarak Kafka broker'da kendi konunuzu oluşturun. Bundan sonra Sim-pleProducer.java adında bir java sınıfı oluşturun ve aşağıdaki kodlamayı yazın.

//import util.properties packages
import java.util.Properties;

//import simple producer packages
import org.apache.kafka.clients.producer.Producer;

//import KafkaProducer packages
import org.apache.kafka.clients.producer.KafkaProducer;

//import ProducerRecord packages
import org.apache.kafka.clients.producer.ProducerRecord;

//Create java class named “SimpleProducer”
public class SimpleProducer {
   
   public static void main(String[] args) throws Exception{
      
      // Check arguments length value
      if(args.length == 0){
         System.out.println("Enter topic name”);
         return;
      }
      
      //Assign topicName to string variable
      String topicName = args[0].toString();
      
      // create instance for properties to access producer configs   
      Properties props = new Properties();
      
      //Assign localhost id
      props.put("bootstrap.servers", “localhost:9092");
      
      //Set acknowledgements for producer requests.      
      props.put("acks", “all");
      
      //If the request fails, the producer can automatically retry,
      props.put("retries", 0);
      
      //Specify buffer size in config
      props.put("batch.size", 16384);
      
      //Reduce the no of requests less than 0   
      props.put("linger.ms", 1);
      
      //The buffer.memory controls the total amount of memory available to the producer for buffering.   
      props.put("buffer.memory", 33554432);
      
      props.put("key.serializer", 
         "org.apache.kafka.common.serializa-tion.StringSerializer");
         
      props.put("value.serializer", 
         "org.apache.kafka.common.serializa-tion.StringSerializer");
      
      Producer<String, String> producer = new KafkaProducer
         <String, String>(props);
            
      for(int i = 0; i < 10; i++)
         producer.send(new ProducerRecord<String, String>(topicName, 
            Integer.toString(i), Integer.toString(i)));
               System.out.println(“Message sent successfully”);
               producer.close();
   }
}

Compilation - Uygulama aşağıdaki komut kullanılarak derlenebilir.

javac -cp “/path/to/kafka/kafka_2.11-0.9.0.0/lib/*” *.java

Execution - Uygulama aşağıdaki komut kullanılarak yürütülebilir.

java -cp “/path/to/kafka/kafka_2.11-0.9.0.0/lib/*”:. SimpleProducer <topic-name>

Output

Message sent successfully
To check the above output open new terminal and type Consumer CLI command to receive messages.
>> bin/kafka-console-consumer.sh --zookeeper localhost:2181 —topic <topic-name> —from-beginning
1
2
3
4
5
6
7
8
9
10

Basit Tüketici Örneği

Şu an itibariyle Kafka kümesine mesaj gönderecek bir üretici oluşturduk. Şimdi Kafka kümesinden gelen mesajları tüketecek bir tüketici oluşturalım. KafkaConsumer API, Kafka kümesinden gelen mesajları tüketmek için kullanılır. KafkaConsumer sınıfı yapıcısı aşağıda tanımlanmıştır.

public KafkaConsumer(java.util.Map<java.lang.String,java.lang.Object> configs)

configs - Tüketici yapılandırmalarının bir haritasını döndürür.

KafkaConsumer sınıfı, aşağıdaki tabloda listelenen aşağıdaki önemli yöntemlere sahiptir.

S.No Yöntem ve Açıklama
1

public java.util.Set<TopicPar-tition> assignment()

Tüketici tarafından şu anda atanan bölüm kümesini alın.

2

public string subscription()

Dinamik olarak imzalanmış bölümler almak için verilen konu listesine abone olun.

3

public void sub-scribe(java.util.List<java.lang.String> topics, ConsumerRe-balanceListener listener)

Dinamik olarak imzalanmış bölümler almak için verilen konu listesine abone olun.

4

public void unsubscribe()

Verilen bölüm listesinden konuların aboneliğini kaldırın.

5

public void sub-scribe(java.util.List<java.lang.String> topics)

Dinamik olarak imzalanmış bölümler almak için verilen konu listesine abone olun. Verilen konu listesi boşsa, unsubscribe () ile aynı şekilde değerlendirilir.

6

public void sub-scribe(java.util.regex.Pattern pattern, ConsumerRebalanceLis-tener listener)

Argüman modeli, düzenli ifade formatındaki abone modeline atıfta bulunur ve dinleyici argümanı abone modelinden bildirimler alır.

7

public void as-sign(java.util.List<TopicParti-tion> partitions)

Müşteriye manuel olarak bölüm listesi atayın.

8

poll()

Abone olma / atama API'lerinden birini kullanarak belirtilen konular veya bölümler için verileri alın. Veriler için oylama yapılmadan önce konular abone olunmazsa bu hata verir.

9

public void commitSync()

Konuların ve bölümlerin tüm alt karalanmış listesi için son ankette () döndürülen kaydetme uzaklıkları. Aynı işlem commitAsyn () için de uygulanır.

10

public void seek(TopicPartition partition, long offset)

Tüketicinin bir sonraki anket () yönteminde kullanacağı mevcut göreli konum değerini getir.

11

public void resume()

Duraklatılan bölümleri devam ettirin.

12

public void wakeup()

Tüketiciyi uyandırın.

ConsumerRecord API

ConsumerRecord API, Kafka kümesinden kayıtları almak için kullanılır. Bu API, kaydın alındığı bir konu adı, bölüm numarası ve bir Kafka bölümündeki kayda işaret eden bir ofsetten oluşur. ConsumerRecord sınıfı, belirli konu adı, bölüm sayısı ve <anahtar, değer> çiftleriyle bir tüketici kaydı oluşturmak için kullanılır. Aşağıdaki imzaya sahiptir.

public ConsumerRecord(string topic,int partition, long offset,K key, V value)
  • Topic - Kafka kümesinden alınan tüketici kaydı için konu adı.

  • Partition - Konu için bölüm.

  • Key - Anahtar yoksa, kaydın anahtarı boş döndürülür.

  • Value - İçeriği kaydedin.

ConsumerRecords API

ConsumerRecords API, ConsumerRecord için bir kapsayıcı görevi görür. Bu API, belirli bir konu için bölüm başına Tüketici Kaydı listesini tutmak için kullanılır. Yapıcısı aşağıda tanımlanmıştır.

public ConsumerRecords(java.util.Map<TopicPartition,java.util.List
<Consumer-Record>K,V>>> records)
  • TopicPartition - Belirli bir konu için bir bölüm haritası döndürür.

  • Records - ConsumerRecord'un iade listesi.

ConsumerRecords sınıfı aşağıdaki yöntemlere sahiptir.

S.No Yöntemler ve Açıklama
1

public int count()

Tüm konular için kayıt sayısı.

2

public Set partitions()

Bu kayıt kümesindeki verilere sahip bölümler kümesi (hiçbir veri döndürülmediyse küme boştur).

3

public Iterator iterator()

Yineleyici, bir koleksiyonda dolaşmanızı, öğeleri elde etmenizi veya yeniden hareket ettirmenizi sağlar.

4

public List records()

Verilen bölüm için kayıtların listesini alın.

Yapılandırma ayarları

Tüketici istemcisi API ana yapılandırma ayarları için yapılandırma ayarları aşağıda listelenmiştir -

S.No Ayarlar ve Açıklama
1

bootstrap.servers

Aracıların önyükleme listesi.

2

group.id

Bireysel bir tüketiciyi bir gruba atar.

3

enable.auto.commit

Değer doğruysa, aksi takdirde taahhüt edilmemişse ofsetler için otomatik kesinlemeyi etkinleştirin.

4

auto.commit.interval.ms

ZooKeeper'a ne sıklıkla güncellenen tüketilen ofsetlerin yazıldığını döndürür.

5

session.timeout.ms

Mesajları bırakmadan ve tüketmeye devam etmeden önce Kafka'nın ZooKeeper'ın bir isteğe yanıt vermesini (okuma veya yazma) kaç milisaniye bekleyeceğini belirtir.

SimpleConsumer Uygulaması

Üretici başvuru adımları burada aynı kalır. İlk önce ZooKeeper ve Kafka brokerınızı başlatın. Sonra oluşturmak SimpleConsumer adlı java sınıfı ile uygulamayı SimpleCon-sumer.java ve aşağıdaki kodu yazın.

import java.util.Properties;
import java.util.Arrays;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.ConsumerRecord;

public class SimpleConsumer {
   public static void main(String[] args) throws Exception {
      if(args.length == 0){
         System.out.println("Enter topic name");
         return;
      }
      //Kafka consumer configuration settings
      String topicName = args[0].toString();
      Properties props = new Properties();
      
      props.put("bootstrap.servers", "localhost:9092");
      props.put("group.id", "test");
      props.put("enable.auto.commit", "true");
      props.put("auto.commit.interval.ms", "1000");
      props.put("session.timeout.ms", "30000");
      props.put("key.deserializer", 
         "org.apache.kafka.common.serializa-tion.StringDeserializer");
      props.put("value.deserializer", 
         "org.apache.kafka.common.serializa-tion.StringDeserializer");
      KafkaConsumer<String, String> consumer = new KafkaConsumer
         <String, String>(props);
      
      //Kafka Consumer subscribes list of topics here.
      consumer.subscribe(Arrays.asList(topicName))
      
      //print the topic name
      System.out.println("Subscribed to topic " + topicName);
      int i = 0;
      
      while (true) {
         ConsumerRecords<String, String> records = con-sumer.poll(100);
         for (ConsumerRecord<String, String> record : records)
         
         // print the offset,key and value for the consumer records.
         System.out.printf("offset = %d, key = %s, value = %s\n", 
            record.offset(), record.key(), record.value());
      }
   }
}

Compilation - Uygulama aşağıdaki komut kullanılarak derlenebilir.

javac -cp “/path/to/kafka/kafka_2.11-0.9.0.0/lib/*” *.java

Execution − Uygulama aşağıdaki komut kullanılarak yürütülebilir

java -cp “/path/to/kafka/kafka_2.11-0.9.0.0/lib/*”:. SimpleConsumer <topic-name>

Input- Üretici CLI'yi açın ve konuya bazı mesajlar gönderin. Smple girişini 'Merhaba Tüketici' olarak koyabilirsiniz.

Output - Aşağıdakiler çıktı olacaktır.

Subscribed to topic Hello-Kafka
offset = 3, key = null, value = Hello Consumer