当前位置: 首页 > news >正文

SprinBoot整合KafKa的使用(详解)

前言

1. 高吞吐量(High Throughput)

Kafka 设计的一个核心特性是高吞吐量。它能够每秒处理百万级别的消息,适合需要高频次、低延迟消息传递的场景。即使在大规模分布式环境下,它也能保持很高的吞吐量和性能,支持低延迟的数据传输。

2. 可扩展性(Scalability)

Kafka 具有强大的可扩展性。它支持水平扩展,可以轻松增加更多的节点来处理更多的数据流量。Kafka 通过分区机制(Partitioning)和分布式架构,确保即使数据量剧增,也能够平滑地扩展。
  • 分区:消息被划分成多个分区(partition),每个分区可以独立存储和读取数据,从而支持并行处理。
  • 副本:Kafka 会将每个分区的数据复制到多个节点上,以确保高可用性和容错性。

3. 高可用性和容错性(Fault Tolerance)

Kafka 提供了内建的高可用性和容错机制。它通过将消息复制到多个代理(broker)上来确保数据的可靠性,即使部分节点出现故障,数据仍然可以从其他副本中恢复。这种机制使得 Kafka 能够承受硬件故障而不会丢失数据。

4. 持久化和日志存储(Durability and Log Storage)

Kafka 的消息是持久化存储的,意味着消息会被写入磁盘并按日志顺序存储。这使得 Kafka 不仅可以作为一个消息队列,还能用作长期的日志存储系统,能够回溯历史数据。消息默认保留在 Kafka 中一段时间,消费者可以根据需要按需读取。

5. 低延迟(Low Latency)

Kafka 的设计能够提供低延迟的数据传输,特别适合于实时流处理的应用场景。Kafka 能够以毫秒级的延迟来传输大量数据,这对许多实时数据处理应用至关重要,比如实时分析、监控系统等。

6. 强大的消费模型(Consumer Model)

Kafka 提供了灵活的消费模型,允许消费者以不同的方式读取消息:
  • 发布/订阅模式:多个消费者可以同时订阅相同的主题(Topic),消息将被广播给所有消费者。
  • 点对点模式:消费者组(Consumer Group)机制允许多个消费者协调工作,处理不同的消息分区。
  • 消息偏移量:Kafka 维护每个消费者的消息偏移量(offset),消费者可以从任意位置开始读取消息,支持灵活的消息消费和重播。

7. 分布式和横向扩展(Distributed and Horizontal Scaling)

Kafka 本身是一个分布式系统,设计上支持横向扩展。随着系统需求的增加,可以简单地增加更多的 Kafka 节点,分区和副本会在节点之间自动重新平衡,确保负载均匀分布和高可用性。

8. 支持流处理(Stream Processing)

Kafka 不仅是一个消息队列,也可以作为流处理平台。通过 Kafka Streams API,可以对流数据进行实时处理(例如聚合、过滤、连接等)。此外,Kafka 可以与其他流处理框架(如 Apache Flink、Apache Spark)集成,构建复杂的数据处理管道。

9. 灵活的集成能力(Integration Capabilities)

Kafka 被广泛集成到各种技术栈中,包括传统数据库、数据仓库、大数据系统、微服务架构等。Kafka 的强大支持让它成为企业架构中的核心组件。
  • Kafka Connect:Kafka Connect 是 Kafka 官方提供的一个框架,用于将 Kafka 与外部系统(如数据库、文件系统、Hadoop、Elasticsearch 等)进行连接。它简化了系统之间的数据同步和集成。

10. 广泛的社区支持和生态系统

Kafka 拥有活跃的开源社区和庞大的生态系统。它得到了许多企业的广泛使用,拥有大量的插件和扩展工具,可以满足各种需求。Kafka 的生态系统包括但不限于:
  • Kafka Streams:用于实时数据流处理。
  • Kafka Connect:用于与外部系统集成。
  • KSQL:用于在 Kafka 上执行 SQL 查询的流处理工具。

11. 使用场景

Kafka 被广泛应用于以下场景:
  • 日志收集与传输:Kafka 可以作为一个日志聚合平台,将来自不同服务或系统的日志收集起来并传输到中央日志分析平台。
  • 实时数据处理:Kafka 用于支持实时数据处理和流计算,例如监控系统、推荐系统、用户行为分析等。
  • 事件驱动架构:Kafka 非常适合于事件驱动的微服务架构,帮助微服务之间实现解耦和异步通信。
  • 数据管道:Kafka 作为一个高效的数据管道,广泛用于将不同系统中的数据实时传输到数据仓库、数据湖或分析平台。

总结:

Kafka 是一个高性能、可扩展、容错且持久化的消息队列系统,非常适合处理大规模的实时数据流。它在大数据流处理、日志聚合、微服务架构、事件驱动架构等多个领域都有广泛应用。如果你的系统需要处理高吞吐量、低延迟、可扩展的消息传递和实时数据流处理,那么 Kafka 是一个非常合适的选择。

使用教程

1.导入依赖

        <!-- Kafka --><dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId></dependency>

2.导入配置


# Spring
spring:kafka:producer:# Kafka服务器bootstrap-servers: 你自己的kafka服务器地址# 开启事务,必须在开启了事务的方法中发送,否则报错transaction-id-prefix: kafkaTx-# 发生错误后,消息重发的次数,开启事务必须设置大于0。retries: 3# acks=0 : 生产者在成功写入消息之前不会等待任何来自服务器的响应。# acks=1 : 只要集群的首领节点收到消息,生产者就会收到一个来自服务器成功响应。# acks=all :只有当所有参与复制的节点全部收到消息时,生产者才会收到一个来自服务器的成功响应。# 开启事务时,必须设置为allacks: all# 当有多个消息需要被发送到同一个分区时,生产者会把它们放在同一个批次里。该参数指定了一个批次可以使用的内存大小,按照字节数计算。batch-size: 16384# 生产者内存缓冲区的大小。buffer-memory: 1024000# 键的序列化方式key-serializer: org.springframework.kafka.support.serializer.JsonSerializer# 值的序列化方式(建议使用Json,这种序列化方式可以无需额外配置传输实体类)value-serializer: org.springframework.kafka.support.serializer.JsonSerializerconsumer:# Kafka服务器bootstrap-servers: 你自己的kafka服务器地址group-id: firstGroup# 自动提交的时间间隔 在spring boot 2.X 版本中这里采用的是值的类型为Duration 需要符合特定的格式,如1S,1M,2H,5D#auto-commit-interval: 2s# 该属性指定了消费者在读取一个没有偏移量的分区或者偏移量无效的情况下该作何处理:# earliest:当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费分区的记录# latest:当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据(在消费者启动之后生成的记录)# none:当各分区都存在已提交的offset时,从提交的offset开始消费;只要有一个分区不存在已提交的offset,则抛出异常auto-offset-reset: latest# 是否自动提交偏移量,默认值是true,为了避免出现重复数据和数据丢失,可以把它设置为false,然后手动提交偏移量enable-auto-commit: false# 键的反序列化方式#key-deserializer: org.apache.kafka.common.serialization.StringDeserializerkey-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer# 值的反序列化方式(建议使用Json,这种序列化方式可以无需额外配置传输实体类)value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer# 配置消费者的 Json 反序列化的可信赖包,反序列化实体类需要properties:spring:json:trusted:packages: "*"# 这个参数定义了poll方法最多可以拉取多少条消息,默认值为500。如果在拉取消息的时候新消息不足500条,那有多少返回多少;如果超过500条,每次只返回500。# 这个默认值在有些场景下太大,有些场景很难保证能够在5min内处理完500条消息,# 如果消费者无法在5分钟内处理完500条消息的话就会触发reBalance,# 然后这批消息会被分配到另一个消费者中,还是会处理不完,这样这批消息就永远也处理不完。# 要避免出现上述问题,提前评估好处理一条消息最长需要多少时间,然后覆盖默认的max.poll.records参数# 注:需要开启BatchListener批量监听才会生效,如果不开启BatchListener则不会出现reBalance情况max-poll-records: 3properties:# 两次poll之间的最大间隔,默认值为5分钟。如果超过这个间隔会触发reBalancemax:poll:interval:ms: 600000# 当broker多久没有收到consumer的心跳请求后就触发reBalance,默认值是10ssession:timeout:ms: 10000listener:# 在侦听器容器中运行的线程数,一般设置为 机器数*分区数concurrency: 4# 自动提交关闭,需要设置手动消息确认ack-mode: manual_immediate# 消费监听接口监听的主题不存在时,默认会报错,所以设置为false忽略错误missing-topics-fatal: false# 两次poll之间的最大间隔,默认值为5分钟。如果超过这个间隔会触发reBalancepoll-timeout: 600000

3.config文件(一共4个,已经封装好直接使用即可)

import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
import org.springframework.kafka.config.KafkaListenerContainerFactory;
import org.springframework.kafka.core.ConsumerFactory;
import org.springframework.kafka.core.DefaultKafkaConsumerFactory;
import org.springframework.kafka.listener.ConcurrentMessageListenerContainer;
import org.springframework.kafka.listener.ContainerProperties;
import org.springframework.kafka.support.serializer.JsonDeserializer;import java.util.HashMap;
import java.util.Map;/*** kafka配置,也可以写在yml,这个文件会覆盖yml*/
@SpringBootConfiguration
public class KafkaConsumerConfig {@Value("${spring.kafka.consumer.bootstrap-servers}")private String bootstrapServers;@Value("${spring.kafka.consumer.group-id}")private String groupId;@Value("${spring.kafka.consumer.enable-auto-commit}")private boolean enableAutoCommit;@Value("${spring.kafka.properties.session.timeout.ms}")private String sessionTimeout;@Value("${spring.kafka.properties.max.poll.interval.ms}")private String maxPollIntervalTime;@Value("${spring.kafka.consumer.max-poll-records}")private String maxPollRecords;@Value("${spring.kafka.consumer.auto-offset-reset}")private String autoOffsetReset;@Value("${spring.kafka.listener.concurrency}")private Integer concurrency;@Value("${spring.kafka.listener.missing-topics-fatal}")private boolean missingTopicsFatal;@Value("${spring.kafka.listener.poll-timeout}")private long pollTimeout;@Beanpublic Map<String, Object> consumerConfigs() {Map<String, Object> propsMap = new HashMap<>(16);propsMap.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);propsMap.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);//是否自动提交偏移量,默认值是true,为了避免出现重复数据和数据丢失,可以把它设置为false,然后手动提交偏移量propsMap.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, enableAutoCommit);//自动提交的时间间隔,自动提交开启时生效propsMap.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, "2000");//该属性指定了消费者在读取一个没有偏移量的分区或者偏移量无效的情况下该作何处理://earliest:当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费分区的记录//latest:当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据(在消费者启动之后生成的记录)//none:当各分区都存在已提交的offset时,从提交的offset开始消费;只要有一个分区不存在已提交的offset,则抛出异常propsMap.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, autoOffsetReset);//两次poll之间的最大间隔,默认值为5分钟。如果超过这个间隔会触发reBalancepropsMap.put(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, maxPollIntervalTime);//这个参数定义了poll方法最多可以拉取多少条消息,默认值为500。如果在拉取消息的时候新消息不足500条,那有多少返回多少;如果超过500条,每次只返回500。//这个默认值在有些场景下太大,有些场景很难保证能够在5min内处理完500条消息,//如果消费者无法在5分钟内处理完500条消息的话就会触发reBalance,//然后这批消息会被分配到另一个消费者中,还是会处理不完,这样这批消息就永远也处理不完。//要避免出现上述问题,提前评估好处理一条消息最长需要多少时间,然后覆盖默认的max.poll.records参数//注:需要开启BatchListener批量监听才会生效,如果不开启BatchListener则不会出现reBalance情况propsMap.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, maxPollRecords);//当broker多久没有收到consumer的心跳请求后就触发reBalance,默认值是10spropsMap.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, sessionTimeout);//序列化(建议使用Json,这种序列化方式可以无需额外配置传输实体类)propsMap.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class);propsMap.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class);return propsMap;}@Beanpublic ConsumerFactory<Object, Object> consumerFactory() {//配置消费者的 Json 反序列化的可信赖包,反序列化实体类需要try (JsonDeserializer<Object> deserializer = new JsonDeserializer<>()) {deserializer.trustedPackages("*");return new DefaultKafkaConsumerFactory<>(consumerConfigs(), new JsonDeserializer<>(), deserializer);}}/*** KafkaListenerContainerFactory 用来做消费者的配置* @return*/@Beanpublic KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<Object, Object>> kafkaListenerContainerFactory() {ConcurrentKafkaListenerContainerFactory<Object, Object> factory = new ConcurrentKafkaListenerContainerFactory<>();factory.setConsumerFactory(consumerFactory());//在侦听器容器中运行的线程数,一般设置为 机器数*分区数factory.setConcurrency(concurrency);//消费监听接口监听的主题不存在时,默认会报错,所以设置为false忽略错误factory.setMissingTopicsFatal(missingTopicsFatal);// 自动提交关闭,需要设置手动消息确认factory.getContainerProperties().setAckMode(ContainerProperties.AckMode.MANUAL_IMMEDIATE);factory.getContainerProperties().setPollTimeout(pollTimeout);// 设置为批量监听,需要用List接收// factory.setBatchListener(true);return factory;}
}
import org.apache.kafka.clients.producer.ProducerConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.kafka.core.DefaultKafkaProducerFactory;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.core.ProducerFactory;
import org.springframework.kafka.support.serializer.JsonSerializer;
import org.springframework.kafka.transaction.KafkaTransactionManager;import java.util.HashMap;
import java.util.Map;@SpringBootConfiguration
public class KafkaProviderConfig {@Value("${spring.kafka.producer.bootstrap-servers}")private String bootstrapServers;@Value("${spring.kafka.producer.transaction-id-prefix}")private String transactionIdPrefix;@Value("${spring.kafka.producer.acks}")private String acks;@Value("${spring.kafka.producer.retries}")private String retries;@Value("${spring.kafka.producer.batch-size}")private String batchSize;@Value("${spring.kafka.producer.buffer-memory}")private String bufferMemory;@Beanpublic Map<String, Object> producerConfigs() {Map<String, Object> props = new HashMap<>(16);props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);//acks=0 : 生产者在成功写入消息之前不会等待任何来自服务器的响应。//acks=1 : 只要集群的首领节点收到消息,生产者就会收到一个来自服务器成功响应。//acks=all :只有当所有参与复制的节点全部收到消息时,生产者才会收到一个来自服务器的成功响应。//开启事务必须设为allprops.put(ProducerConfig.ACKS_CONFIG, acks);//发生错误后,消息重发的次数,开启事务必须大于0props.put(ProducerConfig.RETRIES_CONFIG, retries);//当多个消息发送到相同分区时,生产者会将消息打包到一起,以减少请求交互. 而不是一条条发送//批次的大小可以通过batch.size 参数设置.默认是16KB//较小的批次大小有可能降低吞吐量(批次大小为0则完全禁用批处理)。//比如说,kafka里的消息5秒钟Batch才凑满了16KB,才能发送出去。那这些消息的延迟就是5秒钟//实测batchSize这个参数没有用props.put(ProducerConfig.BATCH_SIZE_CONFIG, batchSize);//有的时刻消息比较少,过了很久,比如5min也没有凑够16KB,这样延时就很大,所以需要一个参数. 再设置一个时间,到了这个时间,//即使数据没达到16KB,也将这个批次发送出去props.put(ProducerConfig.LINGER_MS_CONFIG, "5000");//生产者内存缓冲区的大小props.put(ProducerConfig.BUFFER_MEMORY_CONFIG, bufferMemory);//反序列化,和生产者的序列化方式对应props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);return props;}@Beanpublic ProducerFactory<Object, Object> producerFactory() {DefaultKafkaProducerFactory<Object, Object> factory = new DefaultKafkaProducerFactory<>(producerConfigs());//开启事务,会导致 LINGER_MS_CONFIG 配置失效factory.setTransactionIdPrefix(transactionIdPrefix);return factory;}@Beanpublic KafkaTransactionManager<Object, Object> kafkaTransactionManager(ProducerFactory<Object, Object> producerFactory) {return new KafkaTransactionManager<>(producerFactory);}@Beanpublic KafkaTemplate<Object, Object> kafkaTemplate() {return new KafkaTemplate<>(producerFactory());}
}
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.RecordMetadata;
import org.springframework.kafka.support.ProducerListener;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;/*** kafka消息发送回调*/
@Component
public class KafkaSendResultHandler implements ProducerListener<Object, Object> {@Overridepublic void onSuccess(ProducerRecord producerRecord, RecordMetadata recordMetadata) {System.out.println("消息发送成功:" + producerRecord.toString());}@Overridepublic void onError(ProducerRecord producerRecord, @Nullable RecordMetadata recordMetadata, Exception exception) {System.out.println("消息发送失败:" + producerRecord.toString() + exception.getMessage());}
}
import org.apache.kafka.clients.consumer.Consumer;
import org.springframework.kafka.listener.KafkaListenerErrorHandler;
import org.springframework.kafka.listener.ListenerExecutionFailedException;
import org.springframework.lang.NonNull;
import org.springframework.messaging.Message;
import org.springframework.stereotype.Component;/*** 异常处理*/
@Component
public class MyKafkaListenerErrorHandler implements KafkaListenerErrorHandler {@Override@NonNullpublic Object handleError(@NonNull Message<?> message, @NonNull ListenerExecutionFailedException exception) {return new Object();}@Override@NonNullpublic Object handleError(@NonNull Message<?> message, @NonNull ListenerExecutionFailedException exception,Consumer<?, ?> consumer) {System.out.println("消息详情:" + message);System.out.println("异常信息::" + exception);System.out.println("消费者详情::" + consumer.groupMetadata());System.out.println("监听主题::" + consumer.listTopics());// TODO 消费记录return KafkaListenerErrorHandler.super.handleError(message, exception, consumer);}
}

4.代码实现

生产者:

    @Autowiredprivate KafkaTemplate<Object,Object> kafkaTemplate;public void test() {// 生成一个随机的 UUID 字符串String message = UUID.randomUUID().toString();// 使用 KafkaTemplate 将消息发送到 Kafka 中的 "test" 主题// KafkaTemplate.send() 方法的第一个参数是目标主题名,第二个参数是要发送的消息内容kafkaTemplate.send("test", message);// 发送成功后,Kafka 会异步处理消息,返回一个 Future 对象, // 如果需要进一步处理发送成功与否的回调,可以通过该对象的回调接口进行处理}

消费者:

import lombok.extern.log4j.Log4j2;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.support.Acknowledgment;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
@Log4j2
public class Consumer {@Autowiredprivate StringRedisTemplate redisTemplate;private static final String REDIS_SET_KEY = "test";// Kafka 监听器配置@KafkaListener(topics = "test",containerFactory = "kafkaListenerContainerFactory", errorHandler = "myKafkaListenerErrorHandler")public void consumer(ConsumerRecord<Object, Object> consumerRecord, Acknowledgment acknowledgment) {String key = (String) consumerRecord.key();Object value = consumerRecord.value();// 记录消费的基本信息,便于追踪log.info("开始消费消息,Topic: {}, Partition: {}, Offset: {}, 消费内容: {}", consumerRecord.topic(), consumerRecord.partition(), consumerRecord.offset(), value);try {// Redis 去重,确保消息没有重复消费Long result = redisTemplate.opsForSet().add(REDIS_SET_KEY, key);// 如果 Redis 返回 1,表示该 key 尚未消费,才进行后续处理if (result != null && result == 1) {// 处理业务逻辑// 手动提交偏移量acknowledgment.acknowledge();log.info("消费成功,消费的信息: {}", value);} else {log.info("消息已消费过,跳过处理。key: {}", key);acknowledgment.acknowledge();}} catch (Exception e) {log.error("消费失败,错误信息: {}", e.getMessage(), e);// 如果发生异常,进行重试处理acknowledgment.nack(1000); // 可配置重试时间}}// 可选:定时清理 Redis 集合中的已消费记录@Scheduled(fixedDelay = 3600000) // 每小时清理一次public void cleanUpRedis() {// 可以根据消息处理的需要调整清理策略redisTemplate.delete(REDIS_SET_KEY);log.info("已清理 Redis 中的消费记录");}
}

相关文章:

SprinBoot整合KafKa的使用(详解)

前言 1. 高吞吐量&#xff08;High Throughput&#xff09; Kafka 设计的一个核心特性是高吞吐量。它能够每秒处理百万级别的消息&#xff0c;适合需要高频次、低延迟消息传递的场景。即使在大规模分布式环境下&#xff0c;它也能保持很高的吞吐量和性能&#xff0c;支持低延…...

CSS学习记录03

CSS背景 CSS 背景属性用于定义元素的背景效果。 CSS background-color background-color属性指定元素的背景色。 页面的背景色设置如下&#xff1a; body {background-color: lightblue; } 通过CSS&#xff0c;颜色通常由以下方式指定&#xff1a; 有效的颜色名称-比如“…...

在Java中使用Apache POI导入导出Excel(二)

本文将继续介绍POI的使用&#xff0c;上接在Java中使用Apache POI导入导出Excel&#xff08;一&#xff09; 使用Apache POI组件操作Excel&#xff08;二&#xff09; 14、读取和重写工作簿 try (InputStream inp new FileInputStream("workbook.xls")) { //Inpu…...

Vue3学习宝典

1.ref函数调用的方式生成响应式数据&#xff0c;可以传复杂和简单数据类型 <script setup> // reactive接收一个对象类型的数据 import { reactive } from vue;// ref用函数调用的方式生成响应式数据&#xff0c;可以传复杂和简单数据类型 import { ref } from vue // 简…...

Unity开发FPS游戏之完结篇

这个系列的前几篇文章介绍了如何从头开始用Unity开发一个FPS游戏&#xff0c;感兴趣的朋友可以回顾一下。这个系列的文章如下&#xff1a; Unity开发一个FPS游戏_unity 模仿开发fps 游戏-CSDN博客 Unity开发一个FPS游戏之二_unity 模仿开发fps 游戏-CSDN博客 Unity开发一个F…...

基于BM1684的AI边缘服务器-模型转换,大模型一体机(二)

目标追踪 注&#xff1a;所有模型转换都是在docker环境中的 先进入docker 这里我们是要在docker环境里编译的&#xff0c;所以先进入docker :~/tpu-nntc# docker run -v $PWD/:/workspace -it sophgo/tpuc_dev:latest初始化环境 root2bb02a2e27d5:/workspace/tpu-nntc# s…...

IDEA连接Apifox客户端

IDEA连接Apifox客户端 一、下载Apifox安装包二、IDEA配置三、配置Apifox和IDEA项目同步 一、下载Apifox安装包 Apifox官网&#xff0c;根据自己的操作系统下载对应的Apifox安装包&#xff0c;我是windows系统所以下载的是windows版。 下载 默认仅为我安装&#xff0c;点击下一…...

vue中引用svg图标

要在 Vue 项目中引用 SVG 图标&#xff0c;有几种常见的方法。这里我将介绍两种方法&#xff1a;一种是直接在组件中内联 SVG 代码&#xff0c;另一种是将 SVG 作为单独的文件引用。 方法一&#xff1a;内联 SVG 代码 你可以直接在 Vue 组件的模板中嵌入 SVG 代码。这种方法适…...

【Laravel】模型封装属性基础

文章目录 概要什么是封装模型属性&#xff1f;使用访问器和修改器封装属性访问器&#xff08;Accessor&#xff09;修改器&#xff08;Mutator&#xff09;测试业务实现 运行结果小结 概要 随着项目规模的扩大&#xff0c;模型中的属性和方法可能会变得越来越复杂&#xff0c;这…...

【ROS编译未来时间戳报错修正】一种无需重零编译的文件时间戳更新方法分享

问题描述 无论在ROS1还是ROS2使用catkin_make或者colcon build指令后&#xff0c;有时候会出现文件时间戳的问题&#xff0c;通常报错的内容大致如下文件的修改时间在未来XX秒后&#xff0c;警告&#xff1a;检测到时钟错误。您的构建版本可能是不完整的。 解决方法 不完美的…...

tauri使用github action打包编译多个平台arm架构和inter架构包踩坑记录

这些error的坑&#xff0c;肯定是很多人不想看到的&#xff0c;我的开源软件PakePlus是使用tauri开发的&#xff0c;PakePlus是一个界面化将任何网站打包为轻量级跨平台软件的程序&#xff0c;利用Tauri轻松构建轻量级多端桌面应用和多端手机应用&#xff0c;为了实现发布的时候…...

事务常见分类

目录 1.扁平事务 2.带有保存点的扁平事务 3.链事务 4.嵌套事务 5.分布式事务 从事务理论的角度来看&#xff0c;可以把事务分为以下几种类型&#xff1a; 扁平事务&#xff08;Flat Transactions&#xff09; 带有保存点的扁平事务&#xff08;Flat Transactions with Sa…...

深度学习案例:ResNet50模型+SE-Net

本文为为&#x1f517;365天深度学习训练营内部文章 原作者&#xff1a;K同学啊 一 回顾ResNet模型 ResNet&#xff0c;即残差网络&#xff0c;是由微软研究院的Kaiming He及其合作者于2015年提出的一种深度卷积神经网络架构。该网络架构的核心创新在于引入了“残差连接”&…...

第三方Cookie的消亡与Google服务器端标记的崛起

随着互联网用户对隐私保护的关注日益增强&#xff0c;各大浏览器正在逐步淘汰第三方Cookie。这一变革深刻影响了广告商和数字营销人员的用户跟踪和数据分析方式。然而&#xff0c;Google推出的服务器端标记技术为这一挑战提供了新的解决方案。 什么是第三方Cookie&#xff1f; …...

arkTS:使用ArkUI实现用户信息的持久化管理与自动填充(PersistentStorage)

arkUI&#xff1a;使用ArkUI实现用户信息的持久化管理与自动填充&#xff08;PersistentStorage&#xff09; 1 主要内容说明2 例子2.1 登录页2.1.1登陆页的相关说明2.1.1.1 持久化存储的初始化2.1.1.2 输入框2.1.1.3 记住密码选项2.1.1.4 登录按钮的逻辑2.1.1.5 注册跳转 2.1.…...

01-Zabbix监控快速入门

01-Zabbix监控快速入门 1、监控知识基本概述1.1 什么是监控1.2 为何需要监控1.3 如何进行监控 2、单机时代如何监控2.1 监控CPU2.2 监控内存2.3 监控磁盘2.4 监控⽹络2.5 监控TCP2.6 监控脚本示例 3、常⻅的监控⽅案3.1 Cacti3.2 Nagios3.3 Zabbix3.4 Prometheus3.5 商业监控⽅…...

docker 怎么启动nginx

在Docker中启动Nginx容器是一个简单的过程。以下是启动Nginx容器的步骤&#xff1a; 拉取Nginx镜像&#xff1a; 首先&#xff0c;你需要从Docker Hub拉取Nginx的官方镜像。使用以下命令&#xff1a; docker pull nginx运行Nginx容器&#xff1a; 使用docker run命令来启动一个…...

1-1 Gerrit实用指南

注&#xff1a;学习gerrit需要拥有git相关知识&#xff0c;如果没有学习过git请先回顾git相关知识点 黑马程序员git教程 一小时学会git git参考博客 git 实操博客 1.0 定义 Gerrit 是一个基于 Web 的代码审查系统&#xff0c;它使用 Git 作为底层版本控制系统。Gerrit 的主要功…...

数据库深入(学习笔记)

多表查询 概述&#xff1a; 多表查询&#xff1a;指从多张表中查询数据笛卡尔积&#xff1a;笛卡尔积是指在数学中&#xff0c;两个集合(A集合&#xff0c;B集合)的所有组合情况。 分类&#xff1a; 连接查询 内连接&#xff1a;相当于查询A、B交集部分数据 隐式内连接:sele…...

PostgreSQL17.x创建数据库及数据库信息查看命令

PostgreSQL17.x创建数据库及数据库信息查看命令 文章目录 PostgreSQL17.x创建数据库及数据库信息查看命令1.创建数据库1. 使用 SQL 命令创建数据库2. 创建数据库并指定字符集3. 验证数据库是否创建成功3. 远程连接1. 修改 PostgreSQL 配置文件2. 修改客户端认证配置4. 指定某个…...

Canal mysql数据库同步到es

Canal与Elasticsearch集成指南 [可视化工具](https://knife.blog.csdn.net/article/details/126348055)下载Canal 1.1.5版本 (alpha-2) 请从GitHub Releases下载Canal 1.1.5版本中间版本alpha-2。仅需下载canal.deployer和canal.adapter组件。 安装Elasticsearch 确保已安装…...

React 前端框架1

一、React 简介 &#xff08;一&#xff09;什么是 React React 是一个用于构建用户界面的 JavaScript 库&#xff0c;由 Facebook 开源并维护。它采用了组件化的开发思想&#xff0c;允许开发者将复杂的 UI 拆分成一个个独立、可复用的小组件&#xff0c;就如同搭积木一般&am…...

什么是Batch Normalization?

一、概念 Batch Normalization是在2015年提出的数据归一化方法&#xff0c;主要用在深度神经网络中激活层之前。它的主要作用是加快模型训练时的收敛速度&#xff0c;使模型训练过程更加稳定&#xff0c;避免梯度爆炸或消失&#xff0c;并起到一定的正则化作用&#xff0c;有时…...

rtc-pcf8563 0-0051: low voltage detected, date/time is not reliable

解决方法&#xff1a; 1、先测量pcf8563电源电压&#xff0c;是否满足要求。 2、pcf8563首次操作。第一次读取pcf8563的时间&#xff0c;未初始化&#xff0c;非法&#xff0c;芯片门槛电压检测配置不合理。使用hwclock命令写入一次&#xff0c;即可解决。 hwclock -f /dev/…...

tauri下的两个常用rust web框架:Leptos和Trunk

tauri下有两个常用rust web框架&#xff0c;就是Leptos和Trunk Leptos Leptos 是一个基于 Rust 的 Web 框架。您可以在他们的官方网站上了解更多关于 Leptos 的信息。本指南适用于 Leptos 的 0.6 版本。 Leptos Leptos 是一个用 Rust 编写的现代、高效且安全的 Web 框架。它…...

vscode + conda + qt联合开发

安装vscode 安装conda 清华大学开源软件镜像(Anaconda下载)_清华大学镜像-CSDN博客 conda create新建一个环境&#xff0c;激活这个环境&#xff0c;然后安装pyside6 pip install pyside6 -i https://pypi.tuna.tsinghua.edu.cn/simple 安装成功后输入 pip list查看是否安装…...

mac终端自定义命令打开vscode

1.打开终端配置文件 open -e ~/.bash_profile终端安装了zsh&#xff0c;那么配置文件是.zshrc&#xff08;打开zsh配置&#xff0c;这里举&#x1f330;使用zsh&#xff09; sudo open -e ~/.zshrc 2.在zshrc配置文件中添加新的脚本&#xff08;这里的code就是快捷命令可以进…...

关于单片机的原理与应用!

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///目前正在学习C&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于单片…...

【手术显微镜】市场高度集中,由于高端手术显微镜的制造技术主要掌握于欧美企业

摘要 HengCe (恒策咨询&#xff09;是全球知名的大型咨询机构&#xff0c;长期专注于各行业细分市场的调研。行业层面&#xff0c;重点关注可能存在“卡脖子”的高科技细分领域。企业层面&#xff0c;重点关注在国际和国内市场在规模和技术等层面具有代表性的企业&#xff0c;…...

速盾高防cdn支持移动端独立缓存

随着移动互联网的快速发展&#xff0c;移动端网页访问量也越来越大。然而&#xff0c;移动端的网络环境相对不稳定&#xff0c;用户体验可能会受到影响。因此&#xff0c;使用高防CDN来加速移动端网页访问&#xff0c;成为越来越多网站运营者的首选。 速盾高防CDN是一种分布式…...

java中的运算符

大家好&#xff0c;今天来看看java中运算符的一些知识点&#xff0c;理解好运算符是我们在写代码的一大重点&#xff0c;那么我们就来看看吧。 运算符:对操作数进行操作时的符号.,不同运算筹操作的含义不同. 一、算术算片. 1、基本四则运算符:加减乘除模(一*/%) 注意:都是二元…...

视频流媒体服务解决方案之Liveweb视频汇聚平台

一&#xff0c;Liveweb视频汇聚平台简介: LiveWeb是深圳市好游科技有限公司开发的一套综合视频汇聚管理平台&#xff0c;可提供多协议&#xff08;RTSP/RTMP/GB28181/海康Ehome/大华&#xff0c;海康SDK等&#xff09;的视频设备接入&#xff0c;支持GB/T28181上下级联&#xf…...

什么是六边形图?

什么是六边形图&#xff1f;&#xff09; 为什么用六边形图&#xff1f;六边形图的构造原理如何绘制六边形图&#xff1f;&#xff08;代码示例&#xff09;结果解读总结 六边形图是一种特殊的二维数据可视化方法&#xff0c;用来展示两个变量之间的关系。它用许多小的六边形&a…...

淘宝天猫API接口探索:店铺商品全览与拍立淘图片搜索实战

在当今的电商时代&#xff0c;淘宝和天猫作为两大巨头&#xff0c;为开发者提供了丰富的API接口&#xff0c;以实现与平台的数据交互。本文将带您探索如何使用淘宝天猫的API接口来获取店铺所有商品列表&#xff0c;以及如何通过拍立淘&#xff08;图片搜索&#xff09;功能找到…...

.net6.0 mvc 传递 model 实体参数(无法对 null 引用执行运行时绑定)

说一下情况&#xff1a; 代码没问题&#xff0c;能成功从数据库里查到数据&#xff0c;能将数据丢给ViewBag.XXXX, 在View页面也能获取到 ViewBag.XXXX的值&#xff0c;但是发布到线上后报这个错&#xff1a; Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 无法对 …...

电子电气架构 --- 面向服务的汽车诊断架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所有人的看法和评价都是暂时的,只有自己的经历是伴随一生的,几乎所有的担忧和畏惧,都是来源于自己的想象,只有你真的去做了,才会发现有多快乐。…...

困扰解决:mfc140u.dll丢失的解决方法,多种有效解决方法全解析

当电脑提示“mfc140u.dll丢失”时&#xff0c;这可能会导致某些程序无法正常运行&#xff0c;给用户带来不便。不过&#xff0c;有多种方法可以尝试解决这个问题。这篇文章将以“mfc140u.dll丢失的解决方法”为主题&#xff0c;教大家有效解决mfc140u.dll丢失。 判断是否是“mf…...

OpenCV_Code_LOG

孔洞填充 void fillHole(const Mat srcBw, Mat &dstBw) {Size m_Size srcBw.size();Mat TempMat::zeros(m_Size.height2,m_Size.width2,srcBw.type());//延展图像srcBw.copyTo(Temp(Range(1, m_Size.height 1), Range(1, m_Size.width 1)));cv::floodFill(Temp, Point(…...

【python】OpenCV—Tracking(10.5)—dlib

文章目录 1、功能描述2、代码实现3、效果展示4、完整代码5、涉及到的库函数dlib.correlation_tracker() 6、参考 1、功能描述 基于 dlib 库&#xff0c;实现指定类别的目标检测和单目标跟踪 2、代码实现 caffe 模型 https://github.com/MediosZ/MobileNet-SSD/tree/master/…...

音视频入门基础:MPEG2-TS专题(9)——FFmpeg源码中,解码TS Header的实现

一、引言 FFmpeg源码对MPEG2-TS传输流/TS文件解复用时&#xff0c;在通过read_packet函数读取出一个transport packet后&#xff0c;会调用handle_packet函数来处理该transport packet&#xff1a; static int handle_packets(MpegTSContext *ts, int64_t nb_packets) { //..…...

React 自定义钩子:useOnlineStatus

我们今天的重点是 “useOnlineStatus” 钩子&#xff0c;这是 React 自定义钩子集合中众多精心制作的钩子之一。 Github 的&#xff1a;https://github.com/sergeyleschev/react-custom-hooks import { useState } from "react" import useEventListener from &quo…...

【C++】vector

vector 是一种容器&#xff0c;广泛存在于多种编程语言中&#xff0c;如 C、Rust、Java 等。它是一种动态数组&#xff0c;可以存储任意类型的元素&#xff0c;并且可以根据需要自动调整大小。下面我将详细介绍 vector 的概念和使用方法&#xff0c;主要以 C 中的 std::vector …...

海外centos服务器如何更换yum镜像源

今天遇到一个海外服务器,需要更新yum源,发现使用国内的(阿里云,腾讯云,华为云等),都无法实现,正常更新,主要问题还是服务器的网络无法访问国内的,所以,本章教程,记录一下,我验证过的方法。 1、备份或删除 源已经停止维护了,也可以将其直接删除,也不会有影响。如…...

go和python的遍历对比

Go 和 Python 都有强大的循环控制结构&#xff0c;但它们在实现和行为上有所不同&#xff0c;特别是关于索引变量的管理、迭代器的使用以及如何在循环中修改循环变量。以下是 Go 和 Python 循环的详细差异分析&#xff1a; 1. 循环类型&#xff1a; Go&#xff1a; Go 使用 …...

ML 系列:第 37 节 — 统计中的估计

文章目录 一、说明二、统计学中估计的目的三、统计学中的估计类型四、什么是点估计量&#xff1f;4.1 基本概念4.2 点估计量的性质4.3 点估计与区间估计4.4 寻找点估计的常用方法 五、区间估计5.1 什么是区间估计&#xff1f;5.1.1 置信区间5.1.2 预测区间5.1.3 容差区间Tolera…...

四、初识C语言(4)

一、作业&#xff1a;static修饰局部变量 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> //作业&#xff1a;static修饰局部变量 int sum (int a) {int c 0;static int b 3;c 1;b 2;return (abc); } int main() {int i 0;int a …...

不同云计算网络安全等级

导读云计算的本质是服务&#xff0c;如果不能将计算资源规模化/大范围的进行共享&#xff0c;如果不能真正以服务的形式提供&#xff0c;就根本算不上云计算。 等级保护定级流程 定级是开展网络安全等级保护工作的 “基本出发点”&#xff0c;虚拟化技术使得传统的网络边界变…...

基于深度学习的甲状腺结节影像自动化诊断系统(PyQt5界面+数据集+训练代码)

随着医学影像技术的发展&#xff0c;计算机辅助诊断在甲状腺结节的早期筛查中发挥着重要作用。甲状腺结节的良恶性鉴别对临床治疗具有重要意义&#xff0c;但传统的诊断方法依赖于医生的经验和影像学特征&#xff0c;存在一定的主观性和局限性。为了解决这一问题&#xff0c;本…...

Codigger Desktop:多样 Look 设计,全新 Game Look 带来趣味体验

Codigger Desktop提供了多种不同的Look设计&#xff0c;以满足用户的不同需求和偏好。包括Keyboard Look、Value Look、Game Look、Location Look、Size Look、Stage Look和Tile Look。 Keyboard Look&#xff1a;提供类似键盘布局的界面设计&#xff0c;方便用户快速访问常用功…...

redis下载、基础数据类型、操作讲解说明,持久化、springboot整合等

1 Redis是什么 官网&#xff1a;https://redis.io 开发者&#xff1a;Antirez Redis诞生于2009年全称是Remote Dictionary Server 远程词典服务器&#xff0c;是一个基于内存的键值型NoSQL数据库。 Redis是一个开源的、高性能的键值对存储系统&#xff0c;它支持多种数据结构&…...