Kafka架构的详细阐述

一、Kafka概述

Kafka是一个分布式、可横向扩展的消息队列,是一种高吞吐量的分布式发布订阅消息系统。Kafka的设计目标是:将发布者与订阅者解耦,同时提高消息处理速度。Kafka是用Scala编写的,但是它支持多种编程语言。

二、Kafka架构

Kafka的架构中有四个角色:生产者,消费者,Kafka Broker和ZooKeeper。

1. 生产者

Kafka生产者将消息发布到Kafka Broker。生产者将消息发送到指定的Topic。Topic是写入消息的主题,“生产者”发布的每条消息都属于某个主题。生产者必须知道应该将消息发送到哪个Topic中。


import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;

public class KafkaProducerExample {
    public static void main(String[] args) throws Exception{
        String topicName = "my-topic";
        String key = "my-key";
        String value = "my-value";

        Properties props = new Properties();
        props.put("bootstrap.servers", "localhost:9092");
        props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

        Producer producer = new KafkaProducer(props);

        ProducerRecord record = new ProducerRecord(topicName, key, value);
        producer.send(record);

        producer.close();
    }
}

2. 消费者

消费者可以订阅一个或多个Topic,并消费其中的消息。Kafka消费者将分区中的消息读取出来,按照顺序消费。Kafka消费者在处理消息时是有状态的,需要记录已消费消息的偏移量。消费者可以设置偏移量的提交方式,是同步式还是异步式。


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

public class KafkaConsumerExample {
    public static void main(String[] args) throws Exception{

        String topicName = "my-topic";
        Properties props = new Properties();
        props.put("bootstrap.servers", "localhost:9092");
        props.put("group.id", "test");
        props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

        KafkaConsumer consumer = new KafkaConsumer(props);
        consumer.subscribe(Collections.singletonList(topicName));

        while (true) {
            ConsumerRecords records = consumer.poll(100);
            for (ConsumerRecord record : records) {
                System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
            }
        }
    }
}

3. Kafka Broker

Kafka Broker是Kafka集群中的一个,是一个Kafka Server实例。Broker接收生产者发布的消息,并将消息写入磁盘上的一个或多个分区中。Broker还提供了消费者可以从其订阅的Partition中读取消息的服务。

4. ZooKeeper

Kafka依赖ZooKeeper来完成元数据管理、Leader选举、分区管理等任务。ZooKeeper还支持监视Kafka Broker和Consumer的状态。

三、Kafka分区和副本

Kafka中的Topic分为多个Partition,每个Partition可以分配多个Replica(副本)。Partition和Replica的数量可以在创建Topic时进行配置。消息Producer将消息通过轮询算法发送到一个Partition中的某个Replica。

1. Partition

Partition用于较大的Topic。Kafka中所有消息都必须属于某个Topic,但是如果一个Topic的消息量很大,需要很高的处理能力来处理每个Message,那么就可以采用Partition的方式来划分Message。Partition将一个Topic中的所有消息分为若干个区,每一个区中的消息互不干扰。可以将每个Partition存储在一个文件中。

2. Replica

副本可以提高读写的性能,副本的作用就是让数据更可靠。Kafka中的Replica(副本)是指能够复制Partition内容的节点,同一个Topic中,不同Partition的Replica可以配置成不同的个数(即Replication Factor)。一个Partition的所有副本被称为一个副本集。如果在一个Broker中存储了多个Partition的多个副本,同一个Broker中相同Partition的副本不能保存在同一个磁盘路径下。

四、Kafka的可靠性

Kafka的可靠性分为两个方面:Producer的可靠性和Consumer的可靠性。

1. Producer的可靠性

Kafka保证消息不会丢失是通过副本策略实现的。Producer向Broker中发送消息,Broker接收到消息后将消息写入磁盘,并同时往一个或多个其它Broker的Replica中也写入消息。只有将消息发送给所有的Replica后才返回ACK,表示消息已经保存成功,这时Producer才能确定消息已经被保存下来。

2. Consumer的可靠性

Kafka提供了两种Commit的方式:自动Commit和手动Commit。

  • 自动Commit:Consumer在poll方法的过程中可以选择自动提交偏移量,但是这种方式可能会出现宕机丢失数据的情况。
  • 手动Commit:Consumer在处理消息后,可以手动提交偏移量。如果偏移量提交失败的话,Consumer将会等待一段时间后再次提交,直到提交成功。

原创文章,作者:HCMBX,如若转载,请注明出处:https://www.506064.com/n/331938.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
HCMBX的头像HCMBX
上一篇 2025-01-20 14:10
下一篇 2025-01-20 14:10

相关推荐

  • pythoncs架构网盘client用法介绍

    PythonCS是一种使用Python编写的分布式计算中间件。它具有分布式存储、负载均衡、任务分发等功能。pythoncs架构网盘client是PythonCS框架下的一个程序,主…

    编程 2025-04-28
  • Python消费Kafka数据指南

    本文将为您详细介绍如何使用Python消费Kafka数据,旨在帮助读者快速掌握这一重要技能。 一、Kafka简介 Kafka是一种高性能和可伸缩的分布式消息队列,由Apache软件…

    编程 2025-04-28
  • index.html怎么打开 – 详细解析

    一、index.html怎么打开看 1、如果你已经拥有了index.html文件,那么你可以直接使用任何一个现代浏览器打开index.html文件,比如Google Chrome、…

    编程 2025-04-25
  • Resetful API的详细阐述

    一、Resetful API简介 Resetful(REpresentational State Transfer)是一种基于HTTP协议的Web API设计风格,它是一种轻量级的…

    编程 2025-04-25
  • AXI DMA的详细阐述

    一、AXI DMA概述 AXI DMA是指Advanced eXtensible Interface Direct Memory Access,是Xilinx公司提供的基于AMBA…

    编程 2025-04-25
  • 关键路径的详细阐述

    关键路径是项目管理中非常重要的一个概念,它通常指的是项目中最长的一条路径,它决定了整个项目的完成时间。在这篇文章中,我们将从多个方面对关键路径做详细的阐述。 一、概念 关键路径是指…

    编程 2025-04-25
  • neo4j菜鸟教程详细阐述

    一、neo4j介绍 neo4j是一种图形数据库,以实现高效的图操作为设计目标。neo4j使用图形模型来存储数据,数据的表述方式类似于实际世界中的网络。neo4j具有高效的读和写操作…

    编程 2025-04-25
  • c++ explicit的详细阐述

    一、explicit的作用 在C++中,explicit关键字可以在构造函数声明前加上,防止编译器进行自动类型转换,强制要求调用者必须强制类型转换才能调用该函数,避免了将一个参数类…

    编程 2025-04-25
  • HTMLButton属性及其详细阐述

    一、button属性介绍 button属性是HTML5新增的属性,表示指定文本框拥有可供点击的按钮。该属性包括以下几个取值: 按钮文本 提交 重置 其中,type属性表示按钮类型,…

    编程 2025-04-25
  • Vim使用教程详细指南

    一、Vim使用教程 Vim是一个高度可定制的文本编辑器,可以在Linux,Mac和Windows等不同的平台上运行。它具有快速移动,复制,粘贴,查找和替换等强大功能,尤其在面对大型…

    编程 2025-04-25

发表回复

登录后才能评论