【Java微服务组件】异步通信P2—Kafka与消息
欢迎来到啾啾的博客🐱。
记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。
欢迎评论交流,感谢您的阅读😄。
目录
- 引言
- Kafka与消息
- 生产者发送消息到Kafka
- 批处理发送设计
- 消息的幂等信息
- 确保消息送达
- acks配置
- send()方法返回
- retries配置
- 消息在Kafka的存储
- Kafka Cluster\Broker\Topic\Partition
- Cluster
- Broker
- Topic/Partition
- 数据冗余与分布式协调带来可靠
- 零拷贝和操作系统内存利用是高吞吐的核心
- 消息怎么过期(移除)
- 消息滞后风险
- 消息者消费消息
- 消费者群组
- 偏移量
- 消息积压怎么处理
- Kafka为什么快
引言
在上一篇【Java微服务组件】异步通信P1—消息队列基本概念
中已经简单介绍了MQ。
目前主流的消息队列应该就是Kafka与RocketMQ了。在RocketMQ官网中有讲解其与Kafka的区别,如下:
消息产品 | 客户端 SDK | 协议与规范 | 顺序消息 | 定时消息 | 批量消息 | 广播消息 | 消息过滤 | 服务端触发重投递 | 消息存储 | 消息回溯 | 消息优先级 | 高可用与故障转移 | 消息轨迹 | 配置方式 | 管理与运维工具 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Kafka | Java, Scala 等 | 拉模型 (Pull Model), 支持 TCP 协议 | 保证分区内消息有序 | 不支持 | 支持, 通过异步生产者实现 | 不支持 | 支持, 可使用 Kafka Streams 进行消息过滤 | 不支持 | 高性能文件存储 | 支持, 通过偏移量 (offset) 定位 | 不支持 | 支持, 依赖 ZooKeeper 服务 | 不支持 | Kafka 使用键值对格式进行配置。这些值可以通过文件或编程方式提供。 | 支持, 使用终端命令暴露核心指标 |
RocketMQ | Java, C++, Go | 拉模型 (Pull Model), 支持 TCP, JMS, OpenMessaging 协议 | 保证严格顺序消息, 且能优雅地水平扩展 | 支持 | 支持, 通过同步模式避免消息丢失 | 支持 | 支持, 基于 SQL92 的属性过滤表达式 | 支持 | 高性能、低延迟文件存储 | 支持, 通过时间戳和偏移量 (offset) 两种方式定位 | 不支持 | 支持, 主从模型, 无需额外组件 | 支持 | 开箱即用, 用户只需关注少量配置 | 支持, 丰富的 Web 界面和终端命令暴露核心指标 |
但今天我们还是先深入了解Kafka的设计与功能。因为Kafka快。
资料引用自《Kafka权威指南》、https://developer.confluent.io/courses/architecture/broker/
Kafka与消息
生产者发送消息到Kafka
怎么可靠、高效地发送消息到Kafka呢?
批处理发送设计
如果每一条消息都单独穿行于网络中,那么就会导致大量的网络开销,把消息分成批次传输可以减少网络开销。
所以,Kafka Producer 的核心设计之一就是客户端批处理。生产者会将多条消息收集到一个批次 (Batch) 中,然后一次性将整个批次发送给对应的Broker。
为此,Kafka Producer 内部有一个缓冲区 (Accumulator / RecordAccumulator)。消息在缓冲区按照目标的Topic-Partition进行组织,满足以下任一条件后随批次发送给Broker:
- batch.size: 某个批次的消息累积大小达到了配置的 batch.size(默认16KB)。
- linger.ms: 距离该批次第一条消息进入缓冲区的时间超过了配置的 linger.ms(默认0ms,但实际中为了启用批处理,通常会设置一个大于0的值,比如5ms, 10ms)。即使批次未满 batch.size,到达 linger.ms 后也会发送,以避免消息在缓冲区停留过久导致延迟。
- producer.flush()被调用: 应用程序显式要求将所有缓冲区的消息立即发送。
- producer.close()被调用: 在关闭生产者之前,会确保所有缓冲区的消息都被发送出去。
![[异步通信P2—Kafka-3.png]]
批处理设计通过牺牲一点点单条消息的即时性,节省网络开销(TCP/IP开销、传输数据量)、磁盘开销,从整体提升消息吞吐量、网络效率、资源利用率。
对于大多数高吞吐量的消息系统场景来说,这样做是非常值得的。
消息的幂等信息
Q:怎么保证Kafka存储(收到)的消息是唯一的?
从 Kafka 3.0.0 版本开始,Kafka 生产者内置了幂等性支持。幂等可以防止因Broker未及时响应ack导致消息在Broker重复存储。
配置默认为true。
spring.kafka.producer.enable-idempotence=true
它通过为每个生产者分配一个唯一的生产者ID (PID) 和为发送到每个分区的每条消息分配一个序列号来实现。Broker 会跟踪这些 (PID, Partition, SequenceNumber) 组合,并丢弃重复的写入尝试。
需要注意的时,幂等启动时,除非用户显示配置了其他值,retries 会被设置为 Integer.MAX_VALUE,acks 会被设置为 all,max.in.flight.requests.per.connection 会被限制为 <= 5 (默认为5)。
确保消息送达
生产者发送消息的producer.send() 方法本身是异步的,它将消息放入生产者的发送缓冲区,并由一个后台线程负责批量发送(哪怕linger.ms配置为0)。
生产者有以下方式来确保消息送达。
acks配置
这个参数决定了生产者在认为一个请求完成之前需要等待多少个 Broker 副本的确认。它有三个主要的值:
- acks=0
完全没有送达保证。 - acks=1
Leader确认后则认为送达。 - acks=all
Leader Broker 在自己写入并且所有ISR都向它报告已写入后,才向生产者发送确认响应。
一般配置acks=all,虽然会略微增加延迟,但数据不丢失通常是更重要的考量。
acks一般还与min.insync.replicas一起使用,min.insync.replicas默认值通常是1,这意味着只要有一个副本(包括leader副本)已经接收并同步了消息,就可以认为该消息是成功写入的。
所以配置acks=all时,一般推荐min.insync.replicas=2,即有两个副本同步了消息。
send()方法返回
producer.send(record) 方法会返回一个 java.util.concurrent.Future<RecordMetadata>
对象。常用的KafkaTemplate.send()则返回一个ListenableFuture<SendResult<K, V>>
,两者都可以用于等待返回结果(阻塞或非阻塞)。
// 阻塞等待try {SendResult<String, String> result = kafkaTemplate.send("myTopic", "key", "value").get();RecordMetadata metadata = result.getRecordMetadata();log.info("Sent message to topic " + metadata.topic() +" partition " + metadata.partition() +" offset " + metadata.offset());
} catch (InterruptedException | ExecutionException e) {// 处理发送失败,e.getCause() 通常是 KafkaExceptionlog.error("Failed to send message: " + e.getMessage());
}// 非阻塞
ListenableFuture<SendResult<String, String>> future = kafkaTemplate.send("myTopic", "key", "value");
future.addCallback(new ListenableFutureCallback<SendResult<String, String>>() {@Overridepublic void onSuccess(SendResult<String, String> result) {RecordMetadata metadata = result.getRecordMetadata();log.info("Successfully sent message to topic " + metadata.topic() +" partition " + metadata.partition() +" offset " + metadata.offset());}@Overridepublic void onFailure(Throwable ex) {// 处理发送失败log.error("Failed to send message: " + ex.getMessage());}
});
retries配置
Kafka 生产者客户端内置了重试机制,用于处理可恢复的错误(如网络抖动、Leader 切换等)。
spring.kafka.producer.retries一般设置3或者5。
另外还有控制重试等待时间的spring.kafka.producer.properties.retry.backoff.ms。
控制producer.send() 和 producer.flush() 调用完成的总时间的spring.kafka.producer.properties.delivery.timeout.ms。这个时间包括消息在缓冲区等待的时间+网络传输时间+Broker确认时间+所有重试时间。如果超过这个时间,send()返回的Future会报超时。
默认的两分钟通常是够的。
spring.kafka.producer.retries=3
spring.kafka.producer.properties.retry.backoff.ms=1000 # 例如设置为1秒
spring.kafka.producer.properties.delivery.timeout.ms=120000
# 如果开启幂等性 (通常推荐)
spring.kafka.producer.enable-idempotence=true
# 当 enable-idempotence=true 时,retries 默认为 Integer.MAX_VALUE, acks 默认为 all
# max.in.flight.requests.per.connection 默认为 5
消息在Kafka的存储
消息在Kafka是怎么存储的,怎么保证数据安全可靠?
Kafka Cluster\Broker\Topic\Partition
Cluster
一个 Kafka Cluster 由一个或多个 Broker 组成。这些 Broker 协同工作,提供消息的存储、读取和高可用性。
可以通过增加Broker来扩展集群的处理能力和存储容量。集群之间的数据共享(通信)早起是ZooKeeper,现在是KRaft控制器。
Broker
集群中的一个服务器实例就是一个Broker,每个Broker有唯一的数字ID。 Broker 负责接收来自生产者的消息,并将它们存储在磁盘上(以分区的形式)。
生产者请求到Broker后进入请求队列,然后由I/O线程验证并存储批次最后持久化到磁盘。
Kafka利用了操作系统本身的Page Cache,即,Kafka的读写操作基本上是基于系统内存的,读写性能得到了极大的提升。
同时,Broker使用了零拷贝技术,消费取消息时不走用户空间缓存区,数据从磁盘读取到内存空间page cache后,直接复制到socket缓冲区。避免了内核空间到用户空间的来回拷贝,也极大提升了性能。
集群中会有一个 Broker被选举为 Controller。Controller 负责管理集群的元数据,例如创建/删除 Topic、分区分配、Leader 选举等。
Broker的Leader-Follower只负责管理Kafka Cluster的集群元数据、监控Broker状态、执行管理操作、发起Leader选举。并不进行消息读写管理。
Topic/Partition
Kafka的消息通过Topic进行分类,生产者将消息发布到特定的 Topic,消费者订阅特定的 Topic 来消费消息。
Topic是一个逻辑概念,会通过分散到集群的多个Broker上。
Topic被分为若干个Partition,一个Partition就是一个提交日志。
- Partition日志
Partition日志并不是一个无限大的文件,而是一系列的日志短文件(LOg Segment Files)组成的。
一般用文件中第一条消息的offset命名,如00000000000000000000.log,00000000000000170123.log 等。
每个日志文件都有两个索引文件:偏移量索引与时间戳索引。- 偏移量索引 (.index): 存储相对偏移量(相对于该段的基准偏移量)到消息在 .log 文件中物理位置(字节偏移)的稀疏映射。这使得 Kafka 可以通过 Offset 快速定位到消息在日志段中的大致位置,然后顺序扫描一小段来找到确切的消息。
- 时间戳索引 (.timeindex): 存储时间戳到消息相对偏移量的稀疏映射。这使得 Kafka 可以通过时间戳快速定位到某个时间点附近的消息。
消息会以追加的方式被写入Partition,然后按照先入先出的顺序读取。一个Partition只能有一个Leader位于某个Broker上,且所有读写都在Leader上进行,其他Follower用于保障数据安全。
具体关系如下:
一个 Topic 的不同分区(及其副本)会分布到集群中的不同 Broker 上。Kafka可以保证消息在当前Partition的顺序。
Kafka Producer可以指定消息发送到哪个Topic,也可以指定到哪个Partition。没有指定Partition时,Kafka Producer会使用分区器 Partitioner来决定消息应该到哪个partition,策略以前是轮询,2.4版本后是“粘性分区”(简单来说就是先选一个分区一直发,然后换一个一直发)。
决定消息发往哪个Partition后,生产者会讲消息发给Partition中的Leader。然后Follower从Partition拉去信息同步进自己的文件中。
消费者也是连接Leader进行消费。
通常会把一个Topic的数据看成一个流。
数据冗余与分布式协调带来可靠
Kafka通过acks和min.insync.replicas配置防止消息发送失败,然后通过将数据冗余(数据副本)存放到多个 Follower Partition以及分布式共识选举机制来保障数据的可靠。
零拷贝和操作系统内存利用是高吞吐的核心
Kafka的读写操作基本上是基于系统内存的,读写性能得到了极大的提升。同时使用零拷贝技术,提升了消费的速率。
消息怎么过期(移除)
Kafka的数据过期(移除)和消费者是否消费完消息没有直接关系。消息移除主要由Topic级别配置的数据保留策略(Retention Policy)决定。
主要的数据保留策略如下:
- 基于时间
配置参数: retention.ms (毫秒) 或 retention.hours (小时) 或 retention.days (天,较老版本,retention.ms 更精确且优先)。
时间从消息写入开始算。 - 基于大小
配置参数: retention.bytes (字节)。每个Partition日志文件的最大总大小。
当一个 Partition 的日志文件总大小超过这个配置值时,Kafka 会从日志的最旧端开始删除消息段 (Log Segments),直到该 Partition 的大小回落到配置的限制以下。 - 日志压缩
配置参数: cleanup.policy=compact (默认是 delete)。
对于启用了日志压缩的 Topic,Kafka 会保留每个消息 Key 的最新版本的值。旧版本的消息(具有相同 Key 的旧值)会被删除。这主要用于构建状态存储、变更数据捕获 (CDC) 等场景,而不是传统的队列消息传递。
消息滞后风险
因此,kafka存在消息滞后风险,如果长时间没有消费消息,消息可能丢失。
因此,监控消费情况、设计兜底很重要。
消息者消费消息
Q:消费者该怎么消费?
A:Kafka限定消费者实例必须属于一个消费者组(有group.id)。
通常同一个消费者组内的所有实例应该订阅相同的Topic,让每个消费者组专注于自己需要处理的Topic集合。
consumer.subscribe(Collection<String> topics)
不同的消费者组消费消息表现得像发布-订阅模式。每个消费者组会独立跟踪自己的消费进度。
而在同一个消费者组内部,一个 Topic 的一个 Partition 在同一时间只会被该组内的一个消费者实例消费。
为同组消费者实例分配不同Partition的机制是Rebalance。机制有负载均衡的效果,将工作分散到多个实例上,提高整体的吞吐量。
所以设计上推荐消费者指定到具体的Topic即可,然后利用Rebalance机制提高吞吐。
即,消费者逻辑上属于一个消费组然后消费指定的Topic,且同一个消费者组内不同消费者消费不同Partition。
Q:消费者怎么确定消费倒哪了?
A:每个消费者组都会追踪自己订阅的Topic的自己的消费记录——偏移量。
每个消息都有一个整数偏移量。
消费者组在消费完消息后,会发送一个Offset Commit请求到Broker。由Broker记录消费者组消费到的最新偏移量(以前是zk)。
Kafka消费者采用的是拉模型(Pull Model)。消费者根据自己的处理能力和节奏,向 Kafka Broker 发送 Fetch 请求来获取消息。
在拉取消息前,消费者需要向负责所属消费者的Broker(Group Coordinator)询问自己被分配了哪些Topic(尽管订阅指定了Topic,还是需要重新获取)和Partition,然后Broker返回之前消费到的最新偏移量。
消费者群组
Kafka限定消费者实例必须属于一个消费者组(有group.id)。一个消费者组内的所有实例应该订阅相同的Topic,让每个消费者组专注于自己需要处理的Topic集合。
偏移量
偏移量:偏移量是一种元数据,不断递增的整数值。由Broker(Leader)在消息被成功写入Partition时,分配并添加到消息的元数据中,仅在当前Partition唯一。
消息的元数据有:offset、timestamp、key、partition 、Headers、topic
消费者会按照消息写入Partition的顺序读取消息,并通过检查消息的偏移量来区分已经读取过的消息。
消费者会定期或在消费完成后向 Kafka(或外部存储)提交(commit)它所消费的偏移量。
当消费者重启或因故障切换时,可以从上次提交的偏移量之后开始继续消费。
消息积压怎么处理
首先,检查消费速率,看是否消费者代码异常。
代码是否有bug,性能需要优化?
然后,检查生产者消息,是否消息过大?是否需要优化传输效率?
再然后,检查积压情况,看是怎么积压的?
积压情况关键指标——Consumer Lag (消费滞后量):
表示某个 Partition 最新消息的 Offset 与消费者已提交 Offset 之间的差值。
如果是所有Topic都积压,则需要考虑扩容提Broker和Consumer。垂直扩容、水平扩容。
如果是单个Topic积压,则要从生产者做Topic、Partition的消费拆分。
单个Partition积压,则拆具体生产者消息。全部Partition积压,则拆Topic。
具体情况具体分析:
Kafka为什么快
-
发的快
设计有批量发送+与服务端轻量高效的通信协议,整体吞吐快。 -
存的快
利用了系统内存page cache+磁盘顺序读写,Kafka存的快。 -
消息取的快
文件分区分段且有索引+零拷贝,给消费者取消息取的快。
相关文章:
【Java微服务组件】异步通信P2—Kafka与消息
欢迎来到啾啾的博客🐱。 记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。 欢迎评论交流,感谢您的阅读😄。 目录 引言Kafka与消息生产者发送消息到Kafka批处理发送设计消息的幂等信息确保消息送达acks配置…...
AI数字人一体机和智慧屏方案:开启智能交互新纪元
在当今这个信息化飞速发展的时代,AI技术正以前所未有的速度改变着我们的生活方式和工作模式。特别是在人机交互领域,AI数字人的出现不仅极大地丰富了用户体验,也为各行各业提供了前所未有的创新解决方案。本文将重点介绍由广州深声科技有限公…...
10-码蹄集600题基础python篇
题目如上: 这题就是ASCII的转换,直接使用ord就可以 下面是代码: def main():#code here# a1,a2input().split(",")# print(f"The ASCII code of {a1} is {ord(a1)}")# print(f"The ASCII code of {a2} is {ord(a2…...
给几张图片和一段文字,怎么制作成带有语音的视频---php
想用PHP将图片和文字转换成带有语音的视频,想做自动化的视频生成,比如用于广告、演示或者其他需要多媒体处理的场景。 接下来考虑PHP本身的能力。PHP主要是用于服务器端的脚本语言,不太擅长处理多媒体内容,比如视频和语音合成。所…...
vue3中RouterView配合KeepAlive实现组件缓存
KeepAlive组件缓存 为什么需要组件缓存代码展示缓存效果为什么不用v-if 为什么需要组件缓存 业务需求:一般是列表页面通过路由跳转到详情页,跳转回来时,需要列表页面展示上次展示的内容 代码展示 App.vue入口 <script setup lang"…...
NIFI的处理器:ExecuteGroovyScript 2.4.0
ExecuteGroovyScript是常用的处理器之一,用于执行GroovyScript脚本。该脚本负责处理传入的流文件(例如传输到SUCCESS或删除)以及由该脚本创建的任何流文件。如果处理不完整或不正确,会话将被回滚。 属性值-失败处理策略 Failure …...
安全可控的AI底座:灯塔大模型应用开发平台全面实现国产信创兼容适配认证
国产信创产品兼容适配认证是为了支持和推动国产信息技术产品和服务的发展而设立的一种质量标准和管理体系。适配认证旨在确保相关产品在安全性、可靠性、兼容性等方面达到一定的标准,以满足政府和关键行业对信息安全和自主可控的需求。 北京中烟创新科技有限公司&a…...
.NET外挂系列:5. harmony 中补丁参数的有趣玩法(下)
一:背景 1. 讲故事 开局一张表,故事全靠编,为了能够承上启下,先把参数列表放出来。 参数名说明__instance访问非静态方法的实例(类似 this)。__result获取/修改返回值,要想修改用 ref。__res…...
Spring Boot 登录实现:JWT 与 Session 全面对比与实战讲解
Spring Boot 登录实现:JWT 与 Session 全面对比与实战讲解 2025.5.21-23:11今天在学习黑马点评时突然发现用的是与苍穹外卖jwt不一样的登录方式-Session,于是就想记录一下这两种方式有什么不同 在实际开发中,登录认证是后端最基础也是最重要…...
vscode离线安装组件工具vsix
1.外网下载vsix 网址为:Open VSX Registry 2.输入需要下载的组件 3.下载组件 4.安装 5.选择安装文件 6.安装完成...
Vue大数据量前端性能优化策略
文章目录 前言Vue大数据量前端性能优化策略1. 虚拟列表的使用方式及优势2. 列表和图表的懒加载技术3. Web Worker 在图表数据预处理中的应用4. 图表渲染优化技巧5. 分批渲染技术实现方法(如 requestIdleCallback)6. 其他可行的 Vue 层优化策略 前言 Vue…...
Hass-Panel - 开源智能家居控制面板
文章目录 ▎项目介绍:预览图▎主要特性安装部署Docker方式 正式版Home Assistant Addon方式详细安装方式1. Home Assistant 插件安装(推荐)2. Docker 安装命令功能说明 :3. Docker Compose 安装升级说明Docker Compose 版本升级 功…...
iPaaS集成平台技术选型关注哪些指标?
在数字化转型进程中,企业系统间的数据孤岛问题日益凸显。根据IDC调研,85%的IT决策者将“系统集成效率”列为业务创新的关键瓶颈。iPaaS(集成平台即服务)凭借其敏捷性、低代码特性和智能化能力,已成为企业构建数字生态的…...
JavaScript性能优化实战(14):跨端JavaScript性能优化
在当今多端开发的时代,JavaScript已经突破了浏览器的界限,广泛应用于移动应用、桌面应用、小程序等各类环境。然而,不同平台的运行时环境存在差异,为JavaScript性能优化带来了新的挑战和思考维度。 目录 React Native性能优化最佳实践Electron应用性能优化策略混合应用中J…...
多通道经颅直流电刺激器产品及解决方案特色解析
前记 团队在多通道经颅直流电刺激这个技术方向,一路深耕。在服务了不少客户之后,为了方便后续的产品和方案推广。我们弄出来了产品和方案两种形态。标准产品是为了给用户演示以及一些常规的实验使用。方案则是为了满足不同方向的科研用户的需求。这两者相…...
Quasar 使用 Pinia 进行状态管理
官方文档:使用 Pinia 进行状态管理 |Quasar 框架 视频教程:quasar框架store-状态管理库pinia介绍_哔哩哔哩_bilibili 使用 Quasar CLI 创建一个新的store quasar new store date --format jsPinia存储模板详解解 基本结构解析 import { defineStore,…...
计算机网络--第一章(下)
1.计算机网络的分层结构 1.1 分层结构 网络体系结构描述的是,计算机网络有几层,有什么功能,用的什么协议。 水平方向的关系, 协议,说的是对等实体间通信需要遵守的规则。用于约束,这个约束的方向是水平的。…...
Veo 3 可以生成视频,并附带配乐
谷歌最新的视频生成 AI 模型 Veo 3 可以创建与其生成的剪辑相配的音频。 周二,在谷歌 I/O 2025 开发者大会上,谷歌发布了 Veo 3。该公司声称,这款产品可以生成音效、背景噪音,甚至对话,为其制作的视频增添配乐。谷歌表…...
数据结构核心知识总结:从基础到应用
数据结构核心知识总结:从基础到应用 数据结构是计算机科学中组织和存储数据的核心方式,直接影响程序的性能和资源利用率。本文系统梳理常见数据结构及其应用场景,帮助读者构建清晰的知识体系。 一、数据结构基础概念 数据结构是数据元素之间…...
Flannel后端为UDP模式下,分析数据包的发送方式(二)
发往 10.244.2.5 的数据包最终会经过物理网卡 enp0s3,尽管路由表直接指定通过 flannel.1 发出。以下以 Markdown 格式详细解释为什么会经过 enp0s3,结合 Kubernetes 和 Flannel UDP 模式的背景。 问题分析 在 Kubernetes 环境中,使用 Flanne…...
超低延迟音视频直播技术的未来发展与创新
引言 音视频直播技术正在深刻改变着我们的生活和工作方式,尤其是在教育、医疗、安防、娱乐等行业。无论是全球性的体育赛事、远程医疗、在线教育,还是智慧安防、智能家居等应用场景,都离不开音视频技术的支持。为了应对越来越高的需求&#x…...
改写视频生产流程!快手SketchVideo开源:通过线稿精准控制动态分镜的AI视频生成方案
Sketch Video 的核心特点 Sketch Video 通过手绘生成动画的形式,将复杂的信息以简洁、有趣的方式展现出来。其核心特点包括: 超强吸引力 Sketch Video 的手绘风格赋予了视频一种质朴而真实的质感,与常见的精致特效视频形成鲜明对比。这种独…...
Circle宣布Circle Payments Network主网上线
据 Circle 官方消息,Circle Payments Network 主网正式上线。该网络是一个基于区块链的支付协调协议,允许银行和支付服务提供商使用公共区块链上的 USDC 进行实时结算。 Circle Payments Network 支持企业对企业供应商支付、跨境汇款、资金管理、企业定期…...
【RabbitMQ】记录 InvalidDefinitionException: Java 8 date/time type
目录 1. 添加必要依赖 2. 配置全局序列化方案(推荐) 3. 配置RabbitMQ消息转换器 关键点说明 1. 添加必要依赖 首先确保项目中包含JSR-310支持模块: <dependency><groupId>com.fasterxml.jackson.datatype</groupId>&l…...
linux 学习之位图(bitmap)数据结构
bitmap 可以高效地表示大量的布尔值,并且在许多情况下可以提供快速的位操作。 1 定义 enum device_state{DOWN,DOEN_DONE,MAILBOX_READY,MAILBOX_PENDING,STATE_BUILD };DECLARE_BITMAP(state,STATE_BUILD);相当于》u32 state[BITS_TO_LONGS(4)] BIT…...
CNN手写数字识别/全套源码+注释可直接运行
数据集选择: MNIST数据集来自美国国家标准与技术研究所, National Institute of Standards and Technology (NIST)。训练集(training set)由来自250个不同人手写的数字构成,其中50%是高中学生,50%来自人口普查局&…...
基于springboot+vue网页系统的社区义工服务互动平台(源码+论文+讲解+部署+调试+售后)
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统背景 在社会文明程度不断提升、社区治理需求持续深化的大背景下,社区义工服务作为…...
MBSS-T1:基于模型的特定受试者自监督运动校正方法用于鲁棒心脏 T1 mapping|文献速递-深度学习医疗AI最新文献
Title 题目 MBSS-T1: Model-based subject-specific self-supervised motion correction forrobust cardiac T1 mapping MBSS-T1:基于模型的特定受试者自监督运动校正方法用于鲁棒心脏 T1 mapping 01 文献速递介绍 心脏T1定量成像(Quantitative Car…...
Google机器学习实践指南(迭代学习机制解析篇)
🔥 Google机器学习(5)-迭代学习机制解析 Google机器学习实战(5)-深入理解模型训练中的迭代优化过程 一、迭代学习概念 ▲ 核心定义: 在训练机器学习模型时,首先对权重和偏差进行初始猜测,然后反复调整这些猜测,直到…...
【时时三省】Python 语言----文件
目录 1,文件打开 2, 文件关闭 3, 文件写入 4, 文件读出 5, 文件定位 6, 文件重命名 7, 复制文件 山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 1,文件打开 file = open(file, mode, buffering, encoding, errors, newline, closefd, opener) 2, 文…...
WPF···
设置启动页 默认最后一个窗口关闭,程序退出,可以设置 修改窗体的icon图标 修改项目exe图标 双击项目名会看到代码 其他 在A窗体点击按钮打开B窗体,在B窗体设置WindowStartupLocation=“CenterOwner” 在A窗体的代码设置 B.Owner = this; B.Show(); B窗体生成在A窗体中间…...
架构图 C4 规范简介
架构图 C4 规范简介 C4(Context, Containers, Components, Code)是一种用于软件架构可视化的分层建模方法,由 Simon Brown 提出。它通过四个不同层次的抽象来描述软件系统,适用于不同受众(如业务人员、架构师、开发人…...
运维Web服务器核心知识与实战指南
一、Web服务器基础概述 (一)核心定义与功能 Web服务器是互联网的基础设施,负责存储、处理和传输网页内容,通过HTTP/HTTPS协议与客户端交互。其核心功能包括: 请求处理:监听端口(默认80/443&a…...
免费建站系统是什么?如何选择免费建站系统?
如今,换互联网成为大家生活中必不可少的一部分。对于普通的个人、一些企业、包括一些事业单位,拥有一个高效实用的网站成为展示、宣传、产品介绍的重要途径。但是对于很多用户来说,对于一些没有建站基础的用户来说:建站是一项高门…...
React---day1
React 它允许我们只需要维护自己的状态,当状态改变时,React可以根据最新的状态去渲染我们的UI界面 开发React必须依赖三个库: eact:包含react所必须的核心代码react-dom:react渲染在不同平台所需要的核心代码babel&…...
赋能智慧党建:远眺科技助力党校可视化系统高效落地
项目背景:智慧党校建设的时代召唤 在数字化浪潮席卷各行各业的今天,传统党校亦面临转型升级的迫切需求。 宁波某地党校,积极响应国家关于推进“智慧党建”的号召,旨在通过引入先进信息技术,打造一个集数据展示、信息…...
解决使用HBuilder X开发时uView组件不生效的问题
1.uni-ui 是一个为 uni-app 开发的 UI 组件库,你可以通过 npm 安装它。 在项目的根目录下打开终端(可以通过菜单“工具” > “终端”打开),然后运行以下命令来安装 uni-ui: npm install uview-ui2.安装后ÿ…...
React中 lazy与 Suspense懒加载的组件
MyHead.jsx console.log(MyHead.jsx); function Head() {return <>hello Head</>; } export default Head;懒加载.jsx // 引入 React 的 useState、lazy 和 Suspense API // lazy 用于懒加载组件,Suspense 用于在加载过程中显示 loading 状态 import …...
网络学习-利用reactor实现http请求(六)
一、实现HTTP请求 1、印象里面,总有人说C/C语言不能实现HTTP请求,其实不然。C/C语言完全可以实现HTTP请求。通过对select,poll,epoll等IO多路复用技术的学习以及reactor模式的学习,完全能够实现HTTP请求。 2、webserver 主要解决两个问题 …...
【东枫科技】usrp rfnoc 开发环境搭建
作者 太原市东枫电子科技有限公司 ,代理销售 USRP,Nvidia,等产品与技术支持,培训服务。 环境 Ubuntu 20.04 依赖包 sudo apt-get updatesudo apt-get install autoconf automake build-essential ccache cmake cpufrequtils …...
RabbitMQ的其中工作模式介绍以及Java的实现
文章目录 前文一、模式介绍1. 简单模式2. 工作队列模式3. 广播模式4. 路由模式5. 通配符模式6. RPC模式7. 发布确认模式 二、代码实现1、简单模式2、工作队列模式生产者消费者消费者 1消费者 2 3、广播模式 (Fanout Mode)生产者消费者 4、路由模式 (Direct Mode)生产者消费者 5…...
Docker 镜像打包到本地
保存镜像 使用 docker save 命令将镜像保存为一个 tar 文件。命令格式如下: docker save [options] IMAGE [IMAGE...]示例:docker save -o centos.tar centos:latest--output 或 -o:将输出保存到指定的文件中。 加载镜像 如果需要在其他机器…...
5分钟搭建智能看板:衡石科技自助式BI工具使用教程
在数据驱动的时代,业务人员需要快速将数据转化为洞察,而非依赖IT团队排队开发报表。衡石科技HENGSHI SENSE的自助式BI工具,通过零代码配置、模板化设计、智能分析三大核心能力,让任何人都能在5分钟内搭建专业级数据看板。本文将手…...
安卓开发用到的设计模式(1)创建型模式
安卓开发用到的设计模式(1)创建型模式 文章目录 安卓开发用到的设计模式(1)创建型模式1. 单例模式(Singleton Pattern)2. 工厂模式(Factory Pattern)3. 抽象工厂模式(Abs…...
Unity3D序列化机制详解
前言 Unity3D的序列化机制是其编辑器与运行时数据管理的核心,理解其工作原理对高效开发至关重要。以下是关键点总结: 对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀! 1. 序列化的作…...
[Harmony]自定义导航栏
1.方案一 CustomNavigationBar import { router } from kit.ArkUI; import { DevicesUtil } from ../utils/DevicesUtil; import { common } from kit.AbilityKit;Component export struct CustomNavigationBar {State private navHeight: number 44State parTitle: string …...
LeetCode117_填充每个结点的下一个右侧结点指针Ⅱ
LeetCode117_填充每个结点的下一个右侧结点指针Ⅱ 标签:#树 #深度优先遍历 #广度优先遍历 #链表 #二叉树Ⅰ. 题目Ⅱ. 示例 0. 个人方法 标签:#树 #深度优先遍历 #广度优先遍历 #链表 #二叉树 Ⅰ. 题目 给定一个二叉树: struct Node {int v…...
Qt enabled + geometry 属性(2)
文章目录 enabled属性可用与禁用的概念API接口代码演示 阐述说明1. 先简单描述下要如何演示出上面两个接口的效果(思路)2. 事先规范按钮对象的命名3. 定义两个按钮对象的槽函数 动图演示效果4. widget.cpp geometry属性预备知识API接口上下左右移动 ta…...
OpenHarmony外设驱动使用 (十),Sensor
OpenHarmony外设驱动使用 (十) Sensor 概述 功能简介 Sensor驱动模型屏蔽硬件器件差异,为上层Sensor服务系统提供稳定的Sensor基础能力接口,包括Sensor列表查询、Sensor启停、Sensor订阅及取消订阅,Sensor参数配置等…...
(2025小白全踩坑版)【OpenHarmony】移植 3.1 版本系统到 STM32F407ZG开发板
在上stm32课程,有这样一道要求: 参考了大佬的文章之后,发现出现了liteos_m.mk文件找不到的情况,于是只能另寻他路 VSCode 搭建 STM32 开发环境_vscode stm32仿真-CSDN博客 【OpenHarmony】移植 3.1 版本系统到 STM32_openharm…...