kafka

72 阅读2分钟

kafka

为什么使用消息队列?

  • 解耦
  • 异步处理请求、记录日志
  • 流量削峰

什么是消息队列?

顾名思义,一个用于保存消息队列,但这个队列需要支持高可用、高吞吐、高并发。

核心概念

Kafka包括Producer、Broker、Topic、Partition和Consumer等。Producer负责向Kafka中生产消息,Broker是Kafka的中间节点,Topic是消息的逻辑分类,Partition是Topic的分区,Consumer负责从Kafka中消费消息,每个Consumer属于⼀个特定的Consumer Group,⼀条消息可以被多个不同的Consumer Group消费,但是⼀个Consumer Group中只能有⼀个Consumer能够消费该消息,Replication副本是对分区的备份。在集群中,不同的副本会被部署在不同的broker上。

应用场景

Kafka被广泛应用于日志收集、消息传递、实时数据处理等领域。其中,日志收集是Kafka的一大应用场景,通过将日志写入Kafka中,可以实现日志的实时收集和分析。消息传递是Kafka的另一个应用场景,通过Kafka可以实现异步消息传递,提高系统的可靠性和吞吐量。实时数据处理是Kafka的另一大应用场景,通过使用Kafka和流处理框架如Spark Streaming、Flink等,可以实现实时数据处理。

5.使用

5.1下载zookeeper和kafka

kafka下载:kafka.apache.org/downloads

5.2 启动

zkSever.cmd
.\bin\windows\kafka-server-start.bat .\config\server.properties

5.3 sdk

public class MyProducer {

    private final static String TOPIC_NAME = "hello";

    public static void main(String[] args) {
        //配置
        Properties properties = new Properties();
        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"localhost:9092");
        //把发送的key从字符串序列化为字节数组
        properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        //把发送消息value从字符串序列化为字节数组
        properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());

        Producer<String, String> producer = new KafkaProducer<String,String>(properties);

        producer.send(new ProducerRecord<>(TOPIC_NAME, "key", "helloworld"));

    }

}

public class MyConsumer {
    private final static String TOPIC_NAME = "hello";
    public static void main(String[] args) throws ClassNotFoundException {
        // 消费者示例
        Properties properties = new Properties();
        properties.put("bootstrap.servers", "localhost:9092");
        //把发送的key从字符串序列化为字节数组
        properties.put("key.deserializer", StringDeserializer.class.getName());
        //把发送消息value从字符串序列化为字节数组
        properties.put("value.deserializer", StringDeserializer.class.getName());
        properties.put("group.id", "my-group");
        Consumer<String, String> consumer = new KafkaConsumer<>(properties);
        consumer.subscribe(Collections.singletonList(TOPIC_NAME));
        while (true) {
            ConsumerRecords<String, String> records = consumer.poll(1000);
            records.forEach(record -> System.out.println(record.key() + ":" + record.value()));
        }
    }
}

6.Kafka的优化和性能调优

Kafka的性能受到多个因素的影响,如Producer端的发送速率、Broker端的磁盘IO、Consumer端的消费速率等。为了提高Kafka的性能,可以进行一些优化和性能调优,如优化Producer端的批量发送、优化Broker端的磁盘配置、优化Consumer端的消费速率等。