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端的消费速率等。