Kafka入门(四)

在这里插入图片描述

下面尝试一下Kafka 的生产者客户端和消费者客户端的实现。

1、客户端简介

生产者就是负责向Kafka发送消息的应用程序,消费者就是拉取Kafka消息的应用程序。
在Kafka的历史版本中,主要的客户端如下:

  • 基于Scala语言编写的客户端,称为旧客户端,已废弃;
  • 基于Java语言编写的客户端(从Kafka0.9.x开始),称为新客户端,它弥补了就客户端中存在的诸多设计缺陷;
    pom依赖
		<!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka -->
        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka_2.13</artifactId>
            <version>2.6.1</version>
        </dependency>

2、Java生产者客户端

public class KafkaProducerTest {

    public static final String bootStrap = "localhost:9092";
    public static final String topic = "topic_1";

    public static void main(String[] args) {
        // 1、配置客户端参数
        Properties properties = new Properties();
        // 指定生产者客户端连接Kafka集群所需的broker地址列表,具体的内容格式为host1:port1,host2:port2
        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootStrap);
        // key序列化,转换成字节数组以满足broker端接收的消息形式
        properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        // value序列化,转换成字节数组以满足broker端接收的消息形式
        properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        // 配置重试次数,10次之后抛异常,可以在回调中处理
        properties.put(ProducerConfig.RETRIES_CONFIG, 10);
        // 配置客户端id
        properties.put(ProducerConfig.CLIENT_ID_CONFIG, "producer.client.id.1");

        // 2、构造KafkaProducer客户端实例
        KafkaProducer kafkaProducer = new KafkaProducer(properties);
        // 3、构建待发送消息
        ProducerRecord<String, String> record = new ProducerRecord(topic, "hello world");
        // 4、发送消息,分为3种模式,发后即忘、同步(sync)、异步(async)
        // 发后即忘,只管往Kafka中发送消息而并不关心消息是否正确到达
//        kafkaProducer.send(record);
        // 同步,堵塞等待Kafka的响应,直到消息发送成功
        try {
            kafkaProducer.send(record).get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
//        // 异步
//        kafkaProducer.send(record, new CallBackTest(record.topic(), record.key(), record.value()));
    }

    public static class CallBackTest implements Callback {
        private String topic;
        private String key;
        private String value;

        public CallBackTest(String topic, String key, String value) {
            this.topic = topic;
            this.key = key;
            this.value = value;
        }

        @Override
        public void onCompletion(RecordMetadata metadata, Exception exception) {
            if (exception != null) {
                exception.printStackTrace();
            } else {
                System.out.println("send message to topic success, topic:" + metadata.topic() + ",partition:" + metadata.partition() + ",offset:" + metadata.offset());
            }
        }
    }
}

生产者客户端实现需要以下几步:

  1. 配置生产者客户端参数;
  2. 构造KafkaProducer客户端实例;
  3. 构建待发送消息;
  4. 发送消息,分为3种方式:发后即忘,同步,异步;

3、Java消费者客户端

public class KafkaConsumerTest {

    public static final String bootStrap = "localhost:9092";
    public static final String topic = "topic_1";
    public static final String groupId = "group.123";

    public static void main(String[] args) {
        // 1、配置客户端参数
        Properties properties = new Properties();
        // 指定消费者客户端连接Kafka集群所需的broker地址列表,具体的内容格式为host1:port1,host2:port2
        properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootStrap);
        // key序列化,转换成字节数组以满足broker端接收的消息形式
        properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
        // value序列化,转换成字节数组以满足broker端接收的消息形式
        properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
        // 配置消费组id
        properties.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
        // 配置客户端id
        properties.put(ConsumerConfig.CLIENT_ID_CONFIG, "consumer.client.id.1");

        // 2、构造KafkaConsumer客户端实例
        KafkaConsumer kafkaConsumer = new KafkaConsumer(properties);
        // 3、订阅主题
        kafkaConsumer.subscribe(Pattern.compile("topic_1"));
        // 4、消费消息
        try {
            while (true) {
                ConsumerRecords<String, String> records = kafkaConsumer.poll(100);
                for (ConsumerRecord<String, String> item : records) {
                    System.out.printf("offset = %d, key = %s, value = %s%n", item.offset(), item.key(), item.value());
                }
            }
        } finally {
            kafkaConsumer.close();
        }
    }

}

消费者客户端实现需要以下几步:

  1. 配置消费者客户端参数;
  2. 构造KafkaConsumer客户端实例;
  3. 订阅相应主题;
  4. 拉取消息然后消费,最好提交消费位移数据;

4、测试

先启动消费者,再启动生产者,结果如下
在这里插入图片描述
若有错误之后,欢迎留言指正,感谢~

1/kafka是一个分布式的消息缓存系统 2/kafka集群中的服务器都叫做broker 3/kafka有两类客户端,一类叫producer(消息生产者),一类叫做consumer(消息消费者),客户端和broker服务器之间采用tcp协议连接 4/kafka中不同业务系统的消息可以通过topic进行区分,而且每一个消息topic都会被分区,以分担消息读写的负载 5/每一个分区都可以有多个副本,以防止数据的丢失 6/某一个分区中的数据如果需要更新,都必须通过该分区所有副本中的leader来更新 7/消费者可以分组,比如有两个消费者组A和B,共同消费一个topic:order_info,A和B所消费的消息不会重复 比如 order_info 中有100个消息,每个消息有一个id,编号从0-99,那么,如果A组消费0-49号,B组就消费50-99号 8/消费者在具体消费某个topic中的消息时,可以指定起始偏移量 每个partition只能同一个group中的同一个consumer消费,但多个Consumer Group可同时消费同一个partition。 n个topic可以被n个Consumer Group消费,每个Consumer Group有多个Consumer消费同一个topic Topic在逻辑上可以被认为是一个queue,每条消费都必须指定它的Topic,可以简单理解为必须指明把这条消息放进哪个queue里。为了使得Kafka的吞吐率可以线性提高,物理上把Topic分成一个或多个Partition,每个Partition在物理上对应一个文件夹,该文件夹下存储这个Partition的所有消息和索引文件。若创建topic1和topic2两个topic,且分别有13个和19个分区 Kafka的设计理念之一就是同时提供离线处理和实时处理。根据这一特性,可以使用Storm这种实时流处理系统对消息进行实时在线处理,同时使用Hadoop这种批处理系统进行离线处理,还可以同时将数据实时备份到另一个数据中心,只需要保证这三个操作所使用的Consumer属于不同的Consumer Group即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值