深入理解 Kafka

一、引言

在当今的大数据和分布式系统时代,高效的消息传递和处理是构建可靠、可扩展应用的关键。Apache Kafka 作为一种高吞吐量的分布式发布 - 订阅消息系统,在众多领域中发挥着重要作用。本文将深入探讨 Kafka 的核心概念、架构、工作原理、应用场景以及最佳实践,通过详细的示例帮助读者更好地理解和运用 Kafka。

二、Kafka 的核心概念

(一)主题(Topic)

  1. 定义与作用
    • 主题是 Kafka 中消息的逻辑分类。生产者将消息发送到特定的主题,消费者从感兴趣的主题中订阅消息。主题可以看作是一个消息的容器,用于组织和管理具有相同类型或用途的消息。
    • 例如,在一个电商系统中,可以有订单主题、用户行为主题等,分别用于存储订单相关的消息和用户操作相关的消息。
  2. 主题的创建与管理
    • 在 Kafka 中,可以使用命令行工具或编程方式创建主题。主题的管理包括修改主题的配置参数(如分区数量、副本因子等)、删除主题等操作。
    • 例如,使用以下命令可以创建一个名为 “my_topic” 的主题:

    bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic my_topic

(二)分区(Partition)

  1. 定义与作用
    • 分区是主题的物理划分。每个主题可以被分为一个或多个分区,每个分区都是一个有序的、不可变的消息序列。分区的主要作用是实现水平扩展,提高 Kafka 的吞吐量和可扩展性。
    • 例如,一个主题可以被分为多个分区,每个分区可以存储在不同的服务器上,这样可以并行地处理消息,提高系统的吞吐量。
  2. 分区的分配与副本
    • Kafka 会自动将分区分配到不同的 broker 上,以实现负载均衡。每个分区可以有多个副本,副本的作用是提高数据的可靠性和可用性。当主分区(leader partition)出现故障时,副本分区(follower partition)可以自动切换为主分区,继续提供服务。
    • 例如,一个分区可以有一个主副本和两个从副本,主副本负责处理读写请求,从副本同步主副本的数据。当主副本出现故障时,Kafka 会自动从从副本中选举一个新的主副本。

(三)生产者(Producer)

  1. 定义与作用
    • 生产者是向 Kafka 主题发送消息的客户端。生产者可以将消息发送到一个或多个主题,并可以指定消息的键和值。生产者的主要作用是将应用程序产生的消息发送到 Kafka 中,供消费者进行消费。
    • 例如,在一个电商系统中,订单服务可以作为生产者,将订单创建的消息发送到订单主题中。
  2. 生产者的配置与优化
    • 生产者可以通过配置参数来调整发送消息的行为,如消息的压缩方式、发送消息的批次大小、发送消息的重试次数等。合理地配置生产者参数可以提高消息的发送效率和可靠性。
    • 例如,可以将生产者的消息压缩方式设置为 “gzip”,以减少网络传输的开销;可以将发送消息的批次大小设置为合适的值,以提高消息的发送效率。

(四)消费者(Consumer)

  1. 定义与作用
    • 消费者是从 Kafka 主题订阅消息的客户端。消费者可以从一个或多个主题中读取消息,并可以按照自己的需求进行处理。消费者的主要作用是从 Kafka 中读取消息,并将消息传递给应用程序进行处理。
    • 例如,在一个电商系统中,数据分析服务可以作为消费者,从用户行为主题中读取消息,进行数据分析和处理。
  2. 消费者的组(Consumer Group)
    • 消费者可以组成消费者组,共同从一个主题中读取消息。每个消费者组可以有一个或多个消费者,每个消费者可以订阅一个或多个主题。消费者组的作用是实现消息的负载均衡和容错处理。
    • 例如,一个消费者组可以有多个消费者,每个消费者可以从不同的分区中读取消息,这样可以提高消息的读取效率。当一个消费者出现故障时,其他消费者可以自动接管其分区的读取任务,保证消息的持续处理。

(五)偏移量(Offset)

  1. 定义与作用
    • 偏移量是消费者在分区中读取消息的位置。每个分区都有一个独立的偏移量,消费者可以通过偏移量来记录自己已经读取的消息位置,以便下次继续从该位置开始读取消息。
    • 例如,消费者在读取一个分区中的消息时,会不断地更新偏移量,以记录自己已经读取的消息位置。当消费者重新启动时,可以从上次保存的偏移量开始继续读取消息。
  2. 偏移量的管理
    • Kafka 提供了多种方式来管理偏移量,如自动提交偏移量、手动提交偏移量等。自动提交偏移量是指 Kafka 自动定期地将消费者的偏移量提交到 broker 上,以保证消费者在出现故障时能够从上次提交的偏移量开始继续读取消息。手动提交偏移量是指消费者自己控制偏移量的提交时机,可以更加灵活地处理消息的消费和偏移量的管理。
    • 例如,可以在消费者的配置中设置自动提交偏移量的时间间隔,也可以在代码中手动调用提交偏移量的方法,以实现更加精细的偏移量管理。

三、Kafka 的架构与工作原理

(一)Kafka 的架构组成

  1. Broker
    • Broker 是 Kafka 的服务器节点,负责存储和管理消息。每个 Broker 可以存储多个主题的分区,并且可以接收生产者发送的消息和向消费者提供消息。
    • 例如,一个 Kafka 集群可以由多个 Broker 组成,每个 Broker 可以存储不同主题的分区,以实现高可用性和可扩展性。
  2. Zookeeper
    • Zookeeper 是一个分布式协调服务,用于管理 Kafka 集群的元数据。Zookeeper 存储了 Kafka 集群的配置信息、主题的分区信息、消费者组的信息等。Kafka 依赖 Zookeeper 来实现集群的高可用性、自动故障转移等功能。
    • 例如,当一个 Broker 出现故障时,Zookeeper 会通知其他 Broker 进行故障转移,以保证 Kafka 集群的正常运行。

(二)Kafka 的工作原理

  1. 消息的生产与发送
    • 生产者将消息发送到 Kafka 集群时,首先会根据消息的主题和分区策略确定要发送到哪个分区。然后,生产者将消息序列化后发送到对应的 Broker 上。Broker 接收到消息后,将消息存储到对应的分区中,并返回一个确认消息给生产者,表示消息已经成功接收。
    • 例如,生产者可以根据消息的键值对来确定消息要发送到哪个分区,也可以使用轮询等分区策略来平均分配消息到不同的分区中。
  2. 消息的存储与管理
    • Broker 接收到消息后,将消息存储到磁盘上的日志文件中。每个分区都有一个独立的日志文件,用于存储该分区的消息。Broker 会定期地将日志文件中的消息进行清理和压缩,以减少磁盘空间的占用。
    • 例如,Broker 可以根据配置的保留时间和大小限制来清理过期的消息;可以使用压缩算法对日志文件进行压缩,以减少磁盘空间的占用。
  3. 消息的消费与读取
    • 消费者从 Kafka 集群中订阅感兴趣的主题,并从对应的分区中读取消息。消费者可以根据自己的需求选择自动提交偏移量或手动提交偏移量。消费者在读取消息时,可以从上次保存的偏移量开始读取,也可以从指定的偏移量开始读取。
    • 例如,消费者可以使用 “earliest”、“latest” 等参数来指定从哪个偏移量开始读取消息;可以在代码中手动调用提交偏移量的方法,以实现更加精细的偏移量管理。

四、Kafka 的应用场景

(一)日志收集与处理

  1. 日志收集
    • Kafka 可以作为日志收集系统的核心组件,用于收集和存储各种应用程序的日志数据。应用程序可以将日志数据发送到 Kafka 主题中,然后由专门的日志处理服务从 Kafka 中读取日志数据进行处理和分析。
    • 例如,在一个分布式系统中,各个服务可以将自己的日志数据发送到 Kafka 主题中,然后由一个集中的日志处理服务从 Kafka 中读取日志数据,进行实时监控、故障排查等操作。
  2. 日志处理与分析
    • Kafka 可以与其他大数据处理工具(如 Flink、Spark)结合使用,实现对日志数据的实时处理和分析。通过对日志数据的分析,可以提取有价值的信息,如用户行为分析、系统性能监控等。
    • 例如,可以使用 Flink 从 Kafka 中读取日志数据,进行实时的数据分析和处理,然后将结果存储到数据库或其他存储系统中,供后续的查询和分析使用。

(二)消息队列与异步通信

  1. 消息队列
    • Kafka 可以作为传统的消息队列系统,用于实现应用程序之间的异步通信。生产者将消息发送到 Kafka 主题中,消费者从主题中订阅消息并进行处理,从而实现应用程序之间的解耦和异步通信。
    • 例如,在一个电商系统中,订单服务可以将订单创建的消息发送到 Kafka 主题中,然后由库存服务、物流服务等消费者从主题中订阅消息并进行相应的处理,实现订单处理的异步化和分布式化。
  2. 异步通信与事件驱动架构
    • Kafka 可以与事件驱动架构结合使用,实现应用程序的异步通信和事件驱动处理。应用程序可以将事件发送到 Kafka 主题中,其他应用程序可以从主题中订阅事件并进行相应的处理,从而实现应用程序之间的松散耦合和高效协作。
    • 例如,在一个微服务架构中,各个微服务可以将自己的事件发送到 Kafka 主题中,其他微服务可以从主题中订阅事件并进行相应的处理,实现微服务之间的异步通信和事件驱动处理。

(三)流处理与实时数据分析

  1. 流处理
    • Kafka 可以作为流处理系统的数据源和数据存储,与流处理框架(如 Flink、Spark Streaming)结合使用,实现对实时数据流的处理和分析。通过对实时数据流的处理,可以实现实时监控、实时预警、实时推荐等功能。
    • 例如,可以使用 Flink 从 Kafka 中读取实时数据流,进行实时的数据分析和处理,然后将结果输出到其他系统或存储中,供实时决策和业务应用使用。
  2. 实时数据分析
    • Kafka 可以与实时数据分析工具(如 Kibana、Grafana)结合使用,实现对实时数据的可视化分析和监控。通过对实时数据的分析和监控,可以及时发现问题、优化业务流程、提高系统性能。
    • 例如,可以使用 Kibana 从 Kafka 中读取实时数据,进行实时的可视化分析和监控,然后将结果展示在仪表盘上,供业务人员和运维人员进行实时决策和监控使用。

五、Kafka 的配置与优化

(一)Broker 配置

  1. 内存配置
    • Broker 需要足够的内存来存储和处理消息。可以根据实际的业务需求和硬件资源来调整 Broker 的内存配置,以提高 Broker 的性能和稳定性。
    • 例如,可以调整 Broker 的堆内存大小、文件缓存大小等参数,以适应不同的负载情况。
  2. 网络配置
    • Broker 的网络配置也非常重要,需要根据实际的网络环境和业务需求来调整网络参数,以提高 Broker 的网络性能和吞吐量。
    • 例如,可以调整 Broker 的网络缓冲区大小、连接超时时间等参数,以适应不同的网络环境和负载情况。
  3. 存储配置
    • Broker 的存储配置直接影响到消息的存储和读取性能。可以根据实际的存储需求和硬件资源来调整存储参数,以提高 Broker 的存储性能和可靠性。
    • 例如,可以调整 Broker 的日志文件大小、保留时间、压缩算法等参数,以适应不同的存储需求和负载情况。

(二)生产者配置

  1. 消息压缩
    • 生产者可以对发送的消息进行压缩,以减少网络传输的开销和存储成本。可以根据实际的业务需求和网络环境来选择合适的压缩算法,如 “gzip”、“snappy”、“lz4” 等。
    • 例如,可以在生产者的配置中设置消息的压缩算法为 “gzip”,以减少网络传输的开销和存储成本。
  2. 批次大小与发送频率
    • 生产者可以将多个消息打包成一个批次进行发送,以提高消息的发送效率。可以根据实际的业务需求和网络环境来调整批次大小和发送频率,以平衡消息的发送效率和延迟。
    • 例如,可以将批次大小设置为合适的值,以提高消息的发送效率;可以调整发送频率,以避免消息的堆积和延迟。
  3. 重试次数与超时时间
    • 生产者在发送消息时可能会遇到网络故障等问题,导致消息发送失败。可以设置重试次数和超时时间,以确保消息能够成功发送。
    • 例如,可以设置重试次数为 3,超时时间为 1000 毫秒,以确保消息能够在一定的时间内成功发送。

(三)消费者配置

  1. 自动提交偏移量与手动提交偏移量
    • 消费者可以选择自动提交偏移量或手动提交偏移量。自动提交偏移量可以简化消费者的代码,但可能会导致消息的重复消费或丢失。手动提交偏移量可以更加灵活地控制消息的消费和偏移量的管理,但需要开发者自己处理偏移量的提交逻辑。
    • 例如,可以根据实际的业务需求和可靠性要求来选择自动提交偏移量或手动提交偏移量。
  2. 消费速度与拉取间隔
    • 消费者的消费速度和拉取间隔也会影响到消息的处理效率和系统的稳定性。可以根据实际的业务需求和硬件资源来调整消费速度和拉取间隔,以平衡消息的处理效率和系统的负载。
    • 例如,可以调整消费者的拉取间隔,以避免频繁地拉取消息导致系统资源的浪费;可以调整消费速度,以适应不同的业务处理需求。
  3. 消费者组的配置与管理
    • 消费者可以组成消费者组,共同从一个主题中读取消息。可以根据实际的业务需求和系统负载来调整消费者组的配置参数,如消费者数量、分区分配策略等,以提高消息的处理效率和系统的可扩展性。
    • 例如,可以根据主题的分区数量和消费者的处理能力来调整消费者的数量,以实现负载均衡;可以选择合适的分区分配策略,以确保消费者能够均匀地分配到不同的分区上进行消费。

六、Kafka 的实战示例

(一)使用 Java 编写生产者和消费者

  1. 生产者示例
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;import java.util.Properties;public class KafkaProducerExample {public static void main(String[] args) {Properties props = new Properties();props.put("bootstrap.servers", "localhost:9092");props.put("acks", "all");props.put("retries", 0);props.put("batch.size", 16384);props.put("linger.ms", 1);props.put("buffer.memory", 33554432);props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");KafkaProducer<String, String> producer = new KafkaProducer<>(props);for (int i = 0; i < 100; i++) {producer.send(new ProducerRecord<>("my_topic", Integer.toString(i), "Message " + i));}producer.close();}
}

  1. 消费者示例
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;import java.util.Arrays;
import java.util.Properties;public class KafkaConsumerExample {public static void main(String[] args) {Properties props = new Properties();props.put("bootstrap.servers", "localhost:9092");props.put("group.id", "my_group");props.put("enable.auto.commit", "true");props.put("auto.commit.interval.ms", "1000");props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);consumer.subscribe(Arrays.asList("my_topic"));while (true) {ConsumerRecords<String, String> records = consumer.poll(100);for (ConsumerRecord<String, String> record : records) {System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());}}}
}

(二)使用 Kafka 进行日志收集与处理

  1. 日志生产者示例
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;import java.util.Properties;public class LogProducer {public static void main(String[] args) {Properties props = new Properties();props.put("bootstrap.servers", "localhost:90props.put("bootstrap.servers", "localhost:9092");props.put("acks", "all");props.put("retries", 0);props.put("batch.size", 16384);props.put("linger.ms", 1);props.put("buffer.memory", 33554432);props.put("key.serializer",         "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
KafkaProducer<String, String> producer = new KafkaProducer<>(props);
// 模拟生成日志消息
for (int i = 0; i < 100; i++) {
String logMessage = "Log message" + i + "at" + System.currentTimeMillis ();
producer.send (new ProducerRecord<>("log_topic", logMessage));
}
producer.close();
}
}

 2. 日志消费者示例

```java
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;import java.util.Arrays;
import java.util.Properties;public class LogConsumer {public static void main(String[] args) {Properties props = new Properties();props.put("bootstrap.servers", "localhost:9092");props.put("group.id", "log_group");props.put("enable.auto.commit", "true");props.put("auto.commit.interval.ms", "1000");props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);consumer.subscribe(Arrays.asList("log_topic"));while (true) {ConsumerRecords<String, String> records = consumer.poll(100);for (ConsumerRecord<String, String> record : records) {System.out.println("Received log message: " + record.value());}}}
}

  1. 日志处理服务
    可以使用其他工具或框架来处理从 Kafka 中读取的日志消息,例如使用 Flink 进行实时日志分析,或者将日志存储到数据库中进行后续的查询和分析。

七、Kafka 的高级特性

(一)事务支持

  1. 生产者事务
    • Kafka 支持生产者事务,允许生产者在一个事务中发送多个消息,并且保证这些消息要么全部成功提交,要么全部回滚。生产者事务可以用于保证消息的原子性和一致性,例如在金融交易系统中,确保多个相关的消息要么全部成功发送,要么全部不发送。
    • 例如,可以使用 Kafka 的事务 API 来实现生产者事务,在发送消息之前开启事务,发送完所有消息后提交事务,如果在发送过程中出现错误,则回滚事务。
  2. 消费者事务
    • Kafka 也支持消费者事务,允许消费者在一个事务中处理多个消息,并且保证这些消息要么全部成功处理,要么全部回滚。消费者事务可以用于保证消息的处理顺序和一致性,例如在订单处理系统中,确保多个相关的消息按照正确的顺序被处理,并且在处理过程中出现错误时能够回滚。
    • 例如,可以使用 Kafka 的事务 API 来实现消费者事务,在处理消息之前开启事务,处理完所有消息后提交事务,如果在处理过程中出现错误,则回滚事务。

(二)Exactly Once 语义

  1. 定义与作用
    • Exactly Once 语义是指消息在生产者和消费者之间传递时,保证每个消息只被处理一次,不会出现重复处理或丢失的情况。Exactly Once 语义对于一些对数据准确性要求非常高的应用场景非常重要,例如金融交易系统、订单处理系统等。
    • 例如,在金融交易系统中,确保每个交易消息只被处理一次,不会出现重复交易或丢失交易的情况。
  2. 实现方式
    • Kafka 可以通过结合事务支持和幂等性生产者来实现 Exactly Once 语义。幂等性生产者是指生产者在发送消息时,如果遇到网络故障等问题导致消息重复发送,Kafka 能够自动识别并丢弃重复的消息,保证每个消息只被处理一次。
    • 例如,可以使用 Kafka 的事务 API 和幂等性生产者来实现 Exactly Once 语义,在生产者发送消息之前开启事务,发送完所有消息后提交事务,如果在发送过程中出现错误,则回滚事务。同时,将生产者设置为幂等性生产者,确保消息不会被重复处理。

(三)Kafka Streams

  1. 简介与作用
    • Kafka Streams 是 Kafka 提供的一个轻量级的流处理库,用于对 Kafka 中的消息进行实时处理和分析。Kafka Streams 可以将 Kafka 作为数据源和数据存储,实现对实时数据流的处理和分析,并且可以与其他 Kafka 组件(如生产者、消费者、主题等)无缝集成。
    • 例如,可以使用 Kafka Streams 对 Kafka 中的日志数据进行实时分析,提取有价值的信息,如用户行为分析、系统性能监控等。
  2. 示例用法
    • 以下是一个使用 Kafka Streams 进行单词计数的示例:
import org.apache.kafka.streams.KafkaStreams;
import org.apache.kafka.streams.StreamsBuilder;
import org.apache.kafka.streams.StreamsConfig;
import org.apache.kafka.streams.kstream.KStream;
import org.apache.kafka.streams.kstream.KTable;import java.util.Properties;public class WordCountExample {public static void main(String[] args) {Properties props = new Properties();props.put(StreamsConfig.APPLICATION_ID_CONFIG, "word-count-app");props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");props.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, "org.apache.kafka.common.serialization.Serdes.StringSerde");props.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, "org.apache.kafka.common.serialization.Serdes.StringSerde");StreamsBuilder builder = new StreamsBuilder();KStream<String, String> textLines = builder.stream("input-topic");KTable<String, Long> wordCounts = textLines.flatMapValues(value -> Arrays.asList(value.toLowerCase().split("\\W+"))).groupBy((key, value) -> value).count();wordCounts.toStream().to("output-topic");KafkaStreams streams = new KafkaStreams(builder.build(), props);streams.start();// Add shutdown hook to gracefully close the Kafka Streams applicationRuntime.getRuntime().addShutdownHook(new Thread(streams::close));}
}

八、总结

Apache Kafka 是一个强大的分布式消息队列系统,具有高吞吐量、可扩展性、可靠性等优点。通过深入理解 Kafka 的核心概念、架构、工作原理、应用场景以及最佳实践,可以更好地利用 Kafka 来构建高效、可靠的分布式系统。在实际应用中,可以根据具体的业务需求和系统架构来选择合适的 Kafka 配置和优化策略,充分发挥 Kafka 的优势,提高系统的性能和稳定性。同时,Kafka 的高级特性如事务支持、Exactly Once 语义、Kafka Streams 等也为复杂的业务场景提供了更多的解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/56072.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Axure重要元件三——中继器修改数据

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;中继器修改数据 主要内容&#xff1a;显示编辑内容、表格赋值、修改数据 应用场景&#xff1a;更新行、表单数据行修改 案例展示&#xff1a; 正文…

前端算法合集-2(含面试题-美团一面)

主要考察的就是数组扁平化,由浅入深吧 ①利用tostring()和split() let arr [1, 2, 3, [4, 5, 6], [7, 8, [9, 10, 11], 12], [13, 14, 15]] let newarrarr.toString().split(,) let numarrnewarr.map((item)>{itemNumber(item)return item }) console.log(numarr) ②利用…

AndroidStudio移动开发:使用Service播放音乐【步骤】

目录 一、创建新application 二、准备音乐文件 三、创建项目和布局&#xff08;如果需要交互界面的话&#xff0c;这里简单假设一个基本布局&#xff09; 四、创建MusicService类 五、在MainActivity中启动和控制Service&#xff08;也可以另外创建MusicActivity类&#x…

MoeCTF 2024 ---Misc方向WP

安全杂项 signin 题目描述&#xff1a; xdsec的小伙伴们和参赛者来上课&#xff0c;碰巧这一天签到系统坏了&#xff0c;作为老师的你&#xff0c;要帮他们 教师代签。 特殊提醒&#xff1a;luo同学今天好像在宿舍打游戏&#xff0c;不想来上课&#xff0c;这是严重的缺勤行为…

【数据分享】全国人口-人口年龄结构和抚养比(1990-2021年)

数据介绍 一级标题指标名称单位指标解释人口年末总人口万人年末人口数指每年12月31日24时的人口数。年度统计的全国人口总数内未包括香港、澳门特别行政区和台湾省以及海外华侨人数。1981年及以前人口数据为户籍统计数&#xff1b;1982、1990、2000、2010、2020年数据为当年人口…

实操上手TinyEngine低代码引擎插件化开发

1.背景介绍 1.1 TinyEngine 低代码引擎简介 低代码开发是近些年非常热门的一种开发方式&#xff0c;用户可以通过可视化的方式&#xff0c;简单拖拽&#xff0c;不写代码或者编写少量代码&#xff0c;类似搭积木一样搭建业务应用。 TinyEngine是一个强大的低代码引擎&#x…

Redis 常用指令详解

Redis是一款开源的、高性能的键值对存储数据库&#xff0c;常用于缓存、会话存储以及其他需要快速访问的数据场景。本文将介绍Redis的一些常用指令&#xff0c;并通过代码示例进行说明。 一、连接操作指令 1. 连接 Redis 服务器 ./redis-cli -h 127.0.0.1 -p 63792. 认证&a…

计算广告第三版pdf

需要该书pdf版本的同学点赞&#xff0c;私信我&#xff1a;

Spark_入库时报错ORA-00001 unique constraint violated 解决办法

首先可能是数据入重复了 检查一下看看是否入库前删除了分区的数据&#xff0c;可能是重复数据入库的问题&#xff0c;如果不是这个那么继续排查。 入库的数据有问题&#xff0c;检测方法 如果报主键冲突了&#xff0c;则group by 一下id,date&#xff0c;然后select 的时候加一…

飞睿智能超宽带UWB音频传输模块,超低延迟数据传输,实时音频声音更纯净

在信息爆炸的时代&#xff0c;音频传输技术正以未有的速度发展&#xff0c;创新我们进入一个全新的听觉世界。今天&#xff0c;我们要探讨的&#xff0c;就是这场技术创新中的一颗璀璨明星——飞睿智能超宽带&#xff08;UWB&#xff09;音频传输模块。它以其独特的优势&#x…

RHCSA课后练习1

文件管理命令练习 vi/vim练习 vim newfile 按 a 进入编辑模式 &#xff1a;r 文件 在末尾模式中插入文件 &#xff1a;%s/#/ /g 先将#标记为匹配项&#xff1a;%g#d 再删除 : set nu 开启行号 自行组cp 用grep命令找到6段再用tail命令选中第六段 用find查找 [A-Z]代表所有…

如何写一个视频编码器演示篇

先前写过《视频编码原理简介》&#xff0c;有朋友问光代码和文字不太真切&#xff0c;能否补充几张图片&#xff0c;今天我们演示一下&#xff1a; 这是第一帧画面&#xff1a;P1&#xff08;我们的参考帧&#xff09; 这是第二帧画面&#xff1a;P2&#xff08;需要编码的帧&…

python包以及异常、模块、包的综合案例(较难)

1.自定义包 python中模块是一个文件&#xff0c;而包就是一个文件夹 有这个_init_.py就是python包&#xff0c;没有就是简单的文件夹 包的作用&#xff1a;当我们的模块越来越多时&#xff0c;包可以帮助我们管理这些模块&#xff0c;包的作用就是包含多个模块&#xff0c;但包…

基于JSP的校园宿舍电费缴纳系统【附源码】

基于JSP的校园宿舍电费缴纳系统 效果如下&#xff1a; 系统首页界面 学生登录界面 公告栏页面 在线留言页面 个人中心界面 管理员登录界面 管理员功能界面 宿舍信息管理界面 余额管理界面 使用电量管理界面 余额提醒管理界面 学生功能界面 研究背景 随着网络的高速发展&…

使用休眠的方式来解决电脑合盖后偶尔不能正常睡眠的问题

背景描述 用过Windows笔记本电脑的用户应该都偶尔遇到过这样的一个问题&#xff0c;就是电脑直接合上盖后放在包里&#xff0c;按道理来说应该会自动进入睡眠模式&#xff0c;但是等电脑再从包里拿出来时发现电脑很烫&#xff0c;并且已经没电了&#xff0c;似乎并没有进入到休…

【乐企文件生成工程】关于乐企文件生成工程的详细介绍

发票文件生成方式有两种思路&#xff1a; 1、根据已有的OFD模板&#xff0c;动态替换ofd模板内容&#xff1b;之后将ofd转pdf&#xff08;局限&#xff1a;单行问题不大&#xff09; 可在【乐企】专栏查看详细代码详情可以在此处了解【乐企】有关乐企能力测试接口对接-基础版&a…

Web,RESTful API 在微服务中的作用是什么?

大家好&#xff0c;我是锋哥。今天分享关于【Web&#xff0c;RESTful API 在微服务中的作用是什么&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; Web&#xff0c;RESTful API 在微服务中的作用是什么&#xff1f; 在微服务架构中&#xff0c;Web 和 RESTful …

Python语法结构(三)(Python Syntax Structure III)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

Python编程基础入门:从风格到数据类型再到表达式

前期已经详细介绍了环境搭建&#xff1a;PycharmPython、VsCodePython Python编程基础入门&#xff1a;从风格到数据类型再到表达式 在编写Python程序时&#xff0c;理解其基础结构和语法是每个初学者的必修课。这篇文章将带你深入了解Python的基本编程风格、数据类型、类型转…

【功能安全】相关项定义item definition

目录 01 item definition定义 02 相关项组成 03 相关项最佳实践 📖 推荐阅读 01 item definition定义 概念阶段的开发是以相关项定义(Item Definition)开始的,相关项定义是对系统的描述,此系统也是标准中安全要求应用的对象。 相关项定义目的: a) 在整车层面对相关…