学习kafka的第三天

305 阅读3分钟

这是我参与11月更文挑战的第25天,活动详情查看:2021最后一次更文挑战 让我们创建一个使用 Java 客户端发布和使用消息的应用程序。Kafka 生产者客户端由以下 API 组成。

Kafka生产者API

让我们了解本节中最重要的一组 Kafka 生产者 API。KafkaProducer API 的核心部分是"KafkaProducer"类。KafkaProducer 类提供了一个选项,可以使用以下方法在其构造函数中连接 Kafka 代理。

  • KafkaProducer 类提供了 send 方法来向主题异步发送消息。send()的签名如下
producer.send(new ProducerRecord<byte[],byte[]>(topic, 
partition, key1, value1) , callback);
  • ProducerRecord - 生产者管理等待发送的记录缓冲区。
  • 回调- 当服务器确认记录时执行的用户提供的回调(null 表示没有回调)。
  • KafkaProducer 类提供了一个flush 方法来确保之前发送的所有消息实际上已经完成。刷新方法的语法如下 -
public void flush()
  • KafkaProducer 类提供了 partitionFor 方法,该方法有助于获取给定主题的分区元数据。这可用于自定义分区。此方法的签名如下 -
public Map metrics()

它返回由生产者维护的内部指标的映射。

  • public void close() - KafkaProducer 类提供关闭方法块,直到所有先前发送的请求完成。

生产者 API

Producer API 的核心部分是"Producer"类。Producer 类提供了通过以下方法在其构造函数中连接 Kafka broker 的选项。

生产者类

生产者类提供了使用以下签名消息发送到单个或多个主题的send 方法。


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);

有两种类型的生产者——同步异步

相同的 API 配置也适用于"同步"生产者。它们之间的区别是同步生产者直接发送消息,但在后台发送消息。当您想要更高的吞吐量时,首选异步生产者。在 0.8 等以前的版本中,异步生产者没有 send() 回调来注册错误处理程序。这仅在 0.9 的当前版本中可用。

公共无效关闭()

Producer 类提供close方法来关闭与所有 Kafka 代理的生产者池连接。

SimpleProducer 应用程序

在创建应用程序之前,首先启动 ZooKeeper 和 Kafka broker,然后使用 create topic 命令在 Kafka broker 中创建您自己的主题。然后创建一个名为"Sim-pleProducer.java"的 java 类并输入以下代码。

//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();
   }
}

编译- 可以使用以下命令编译应用程序。

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

执行- 可以使用以下命令执行应用程序。

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

输出

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