云原生时代顶流消息中间件Apache Pulsar部署实操之轻量级计算框架
文章目录
- Pulsar Functions(轻量级计算框架)
- 基础定义
- 工作流程
- 函数运行时
- 处理保证和订阅类型
- 窗口函数
- 定义
- 窗口类型
- 滚动窗口
- 滑动窗口
- 函数配置
- 函数示例
- 有状态函数示例
- 窗口函数示例
- 自定义函数开发
- 定义
- 原生语言接口示例
- Pulsar函数SDK示例
Pulsar Functions(轻量级计算框架)
基础定义
Function instance(函数实例)是函数执行框架的核心元素,由以下元素组成:
- 消费来自不同输入主题的消息的消费者的集合。
- 调用函数的执行程序。
- 将函数的结果发送到输出主题的生产者。
函数实例的内部工作流
- 一个函数可以有多个实例,每个实例执行一个函数的副本。可以在配置文件中指定实例数。
- 函数实例中的使用者使用FQFN作为订阅者名,以基于订阅类型在多个实例之间实现负载平衡。订阅类型可以在函数级别指定。
- 每个函数都有一个单独的FQFN状态存储。可指定一个状态接口,以便在BookKeeper中持久化中间结果。其他用户可以查询函数的状态并提取这些结果。
工作流程
Function worker 是一个逻辑组件,用于在Pulsar Functions的集群模式部署中监视、编排和执行单个函数。每个函数实例都可以作为线程或进程执行,具体取决于所选的配置。如果Kubernetes集群可用,则可以在Kubernetes中以StatefulSets的形式生成函数。
Function worker的内部架构和工作流如下
- 用户向REST服务器发送请求以执行函数实例。
- REST服务器响应请求并将请求传递给功能元数据管理器。
- 函数元数据管理器将请求更新写入函数元数据主题。并跟踪所有与元数据相关的消息,并使用函数元数据主题持久化函数的状态更新。
- 函数元数据管理器从函数元数据主题读取更新,并触发调度管理器计算分配。
- 日程管理器将作业更新写入作业主题。
- 函数运行时管理器侦听分配主题,读取分配更新,并更新其内部状态,该状态包含所有工作人员的所有分配的全局视图;如果更新更改了工作对象上的赋值,函数运行时管理器将通过启动或停止函数实例的执行来具体化新的赋值。
- 会员管理要求协调主题选举一个领导工作者,所有工作人员都订阅故障转移订阅中的协调主题,但活动的工作人员成为领导者并执行分配,从而保证该主题只有一个活动消费者。
- 成员管理器从协调主题读取更新。
函数运行时
函数实例是在运行时内调用的,许多实例可以并行运行。Pulsar支持三种不同成本和隔离保证的函数运行时类型,以最大限度地提高部署灵活性。可以根据需要使用其中之一来运行函数。
- 线程运行时:每个实例都作为一个线程运行。由于线程模式的代码是用Java编写的,所以它只适用于Java实例。当函数以线程模式运行时,它与函数工作者运行在同一个Java虚拟机(JVM)上。
- 进程运行时:每个实例都作为一个进程运行。当函数以进程模式运行时,它运行在函数工作者运行的同一台机器上。
- Kubernetes运行时:函数由worker以Kubernetes StatefulSet的形式提交,每个函数实例作为pod运行。Pulsar支持在启动函数时向Kubernetes StatefulSets和服务添加标签,这有助于选择目标Kubernetes对象。
处理保证和订阅类型
Pulsar提供了三种不同的消息传递语义,可以将它们应用于一个函数。根据ack时间节点确定不同的传递语义实现。
- At-most-once:最多一次,发送到函数的每个消息都将尽最大努力处理。不能保证消息是否会被处理。当选择此语义时,autoAck配置必须设置为true,否则启动将失败(autoAck配置将在将来的版本中弃用)。Ack时间节点:函数处理之前。
- At-least-once:最少一次,发送到函数的每个消息都可以被处理多次(以防处理失败或重新交付)。如果创建函数时没有指定——processing- guaranteed标志,则该函数提供至少一次交付保证。Ack时间节点:发送消息到输出后。
- Effectively-once:精确一次,送到函数的每条消息都可以被处理多次,但它只有一个输出。重复的消息将被忽略。有效地在至少一次处理和有保证的服务器端重复数据删除的基础上实现一次。这意味着一个状态更新可以发生两次,但是相同的状态更新只应用一次,另一个重复的状态更新在服务器端被丢弃。Ack时间节点:发送消息到输出后。
- Manual:当选择这个语义时,框架不会执行任何ack操作,需要在函数中调用context.getCurrentRecord().ack()方法来手动执行ack操作。Ack时间节点:在函数方法中自定义。
提示
- 默认情况下,Pulsar函数提供至少一次交付保证。如果创建函数时没有为——processing guaranteed标志提供值,则该函数提供至少一次保证。
- 排他订阅类型在Pulsar函数中不可用,原因:
- 如果只有一个实例,exclusive等于故障转移。
- 如果有多个实例,exclusive可能会在函数重新启动时崩溃并重新启动。在这种情况下,排他不等于故障转移。因为当主消费者断开连接时,所有未确认的和后续的消息都被传递到下一个。
- 要将订阅类型从shared更改为key_shared,可以在pulse -admin中使用- retain-key- ordered选项。
可以在创建函数时设置函数的处理保证。如下面的命令创建了一个应用了“精确一次”保证的函数。
bin/pulsar-admin functions create \--name my-effectively-once-function \--processing-guarantees EFFECTIVELY_ONCE \
可以使用update命令更改应用于函数的处理保证。
bin/pulsar-admin functions update \--processing-guarantees ATMOST_ONCE \
窗口函数
定义
目前,窗口函数仅在Java中可用,并且不支持MANUAL和effective -once delivery语义。窗口函数是跨数据窗口(即事件流的有限子集)执行计算的函数。如下图所示,流被划分为“桶”,其中可以应用函数。
函数的数据窗口定义包含两个策略:
- 清除策略:控制在窗口中收集的数据量。
- 触发策略:控制何时触发一个函数并执行该函数以根据清除策略处理窗口中收集的所有数据。
触发策略和驱逐策略都由时间或计数驱动。
提示
- 同时支持处理时间和事件时间。
- 处理时间是根据函数实例构建和处理窗口时的壁时间定义的。窗口完整性的判断很简单,您不必担心数据到达混乱。
窗口类型
滚动窗口
滚动窗口将元素分配给具有指定时间长度或计数的窗口。滚动窗口的驱逐策略总是基于窗口已满。因此只需要指定触发器策略,基于计数或基于时间。在具有基于计数的触发策略的滚动窗口中,如以下示例所示,触发策略被设置为2。当窗口中有两个项目时,无论时间如何,都会触发并执行每个函数。
相反,如下面的示例所示,滚动窗口的窗口长度为10秒,这意味着当10秒的时间间隔过去时,函数将被触发,而不管窗口中有多少事件。
滑动窗口
滑动窗口方法通过设置清除策略来限制保留用于处理的数据量,并使用滑动间隔设置触发器策略来定义固定的窗口长度。如果滑动间隔小于窗口长度,则存在数据重叠,这意味着同时落入相邻窗口的数据将被多次用于计算。如下面的示例所示,窗口长度为2秒,这意味着任何超过2秒的数据都将被清除,不会在计算中使用。滑动间隔被配置为1秒,这意味着该函数每秒执行一次,以处理整个窗口长度内的数据。
函数配置
在独立的Pulsar中创建和验证函数(包括有状态函数和窗口函数)的分步说明和示例
- 在conf/broker.conf文件(对于Pulsar standalone, conf/standalone.conf)中,将functionsWorkerEnabled设置为true。vim conf/broker.conf
functionsWorkerEnabled=true
如果是standalone Pulsar 在conf/standalone.conf文件中增加上面的字段。
- 重启broker
bin/pulsar-daemon stop broker
bin/pulsar-daemon start broker
- 检查Pulsar Function集群
bin/pulsar-admin functions-worker get-cluster
函数示例
使用官方的函数示例演示,查看根目录下examples文件夹
- 创建租户和命名空间
bin/pulsar-admin tenants create my-test
bin/pulsar-admin namespaces create my-test/my-namespace
bin/pulsar-admin namespaces list my-test
- 修改 vim examples/example-function-config.yaml
tenant: "my-test"
namespace: "my-namespace"
name: "example"
className: "org.apache.pulsar.functions.api.examples.ExclamationFunction"
inputs: ["persistent://my-test/my-namespace/test_src"]
userConfig:"PublishTopic": "persistent://my-test/my-namespace/test_result"output: "persistent://my-test/my-namespace/test_result"
autoAck: true
parallelism: 1
- 创建函数
bin/pulsar-admin functions create \--function-config-file examples/example-function-config.yaml \--jar examples/api-examples.jar
- 查看函数的配置
bin/pulsar-admin functions get \--tenant my-test \--namespace my-namespace \--name example
- 查看状态
bin/pulsar-admin functions status \--tenant my-test \--namespace my-namespace \--name example
- 消费消息
bin/pulsar-client consume persistent://my-test/my-namespace/test_result -s 'my-subscription' -p Earliest -n 0
- 生产消息
bin/pulsar-client produce persistent://my-test/my-namespace/test_src --messages "test-messages-`date`" -n 10
- 查看消费者的输出
有状态函数示例
- 在BookKeeper中启用streamStorage服务。目前服务使用的是NAR包,需要在conf/bookkeeper.conf文件中进行配置。vim conf/bookkeeper.conf
### Grpc Server ###
#
## the grpc server port to listen on. default is 4181
storageserver.grpc.port=4181
#
#### Dlog Settings for table service ###
#
##### Replication Settings
dlog.bkcEnsembleSize=3
dlog.bkcWriteQuorumSize=2
dlog.bkcAckQuorumSize=2
#
#### Storage ###
#
## local storage directories for storing table ranges data (e.g. rocksdb sst files)
storage.range.store.dirs=data/bookkeeper/ranges
#
## whether the storage server capable of serving readonly tables. default is false.
storage.serve.readonly.tables=false
#
## the cluster controller schedule interval, in milliseconds. default is 30 seconds.
storage.cluster.controller.schedule.interval.ms=30000
- 创建vim examples/example-stateful-function-config.yaml
tenant: "my-test"
namespace: "my-namespace"
name: "word_count"
className: "org.apache.pulsar.functions.api.examples.WordCountFunction"
inputs: ["persistent://my-test/my-namespace/wordcount_src"] # this function will read messages from these topics
autoAck: true
parallelism: 1
- 创建函数
bin/pulsar-admin functions create \--function-config-file examples/example-stateful-function-config.yaml \--jar examples/api-examples.jar
- 查询带有itxs键的函数的状态表。该操作监视与itxs相关的更改。
bin/pulsar-admin functions querystate \--tenant my-test \--namespace my-namespace \--name word_count -k itxs -w
- 消费消息
bin/pulsar-client consume persistent://my-test/my-namespace/wordcount_result -s 'my-subscription' -p Earliest -n 0bin/pulsar-client consume test_wordcount_dest -s 'my-subscription' -p Earliest -n 0
- 生产消息
bin/pulsar-client produce persistent://my-test/my-namespace/wordcount_src --messages "itxs" -n 10
窗口函数示例
- 创建vim examples/example-stateful-function-config.yaml
tenant: "my-test"
namespace: "my-namespace"
name: "window-example"
className: "org.apache.pulsar.functions.api.examples.AddWindowFunction"
inputs: ["persistent://my-test/my-namespace/window_src"]
userConfig:"PublishTopic": "persistent://my-test/my-namespace/window_result"output: "persistent://my-test/my-namespace/window_result"
autoAck: true
parallelism: 1
windowConfig:windowLengthCount: 10slidingIntervalCount: 5
- 创建函数
bin/pulsar-admin functions create \--function-config-file examples/example-window-function-config.yaml \--jar examples/api-examples.jar
- 消费消息
bin/pulsar-client consume -s test-sub -n 0 persistent://my-test/my-namespace/window_result
- 生产消息
bin/pulsar-client produce -m "3" -n 10 persistent://my-test/my-namespace/window_src
- 查看消费窗口输出
自定义函数开发
定义
Pulsar 函数支持Java、Python和Go等语言,如果是Java语言则支持下面三类接口:
- 使用原生语言接口:不需要特定于Pulsar的库或特殊依赖(只需要JDK核心库);适合于不需要访问上下文的函数。
- 使用Pulsar函数SDK:特定于脉冲星的库,提供了语言本机接口中无法提供的一系列功能,例如状态管理或用户配置;适用于需要访问上下文的函数。
- 扩展Pulsar函数SDK:对特定于pulse的库的扩展,在Java中提供初始化和关闭接口。适用于需要初始化和释放外部资源的函数。
原生语言接口示例
- 新建Maven工程,Pom文件内容如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>cn.itxs</groupId><artifactId>pulsar-demo</artifactId><version>1.0</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><build><plugins><plugin><artifactId>maven-assembly-plugin</artifactId><configuration><appendAssemblyId>false</appendAssemblyId><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><archive><manifest><mainClass>sn.itxs.pulsar.function.NativeFunctionDemo</mainClass></manifest></archive></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>assembly</goal></goals></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.10.1</version></plugin></plugins></build>
</project>
- 创建NativeFunctionDemo.java
package sn.itxs.pulsar.function;import java.util.function.Function;public class NativeFunctionDemo implements Function<String, String> {@Overridepublic String apply(String s) {return String.format("hahaha,native implement %s!", s);}
}
-
打包生成pulsar-demo-1.0.jar,上传到安装Pulsar服务器上的,这里就放在pulsar根目录下的examples文件夹,后续的操作就和前面函数示例一样
-
创建函数描述文件,vim examples/native-example-function-config.yaml
tenant: "my-test"
namespace: "my-namespace"
name: "native-example"
className: "sn.itxs.pulsar.function.NativeFunctionDemo"
inputs: ["persistent://my-test/my-namespace/native_src"]
userConfig:"PublishTopic": "persistent://my-test/my-namespace/native_result"output: "persistent://my-test/my-namespace/native_result"
autoAck: true
parallelism: 1
- 创建函数
bin/pulsar-admin functions create \--function-config-file examples/native-example-function-config.yaml \--jar examples/pulsar-demo-1.0.jar
- 消费消息
bin/pulsar-client consume persistent://my-test/my-namespace/native_result -s 'my-subscription' -p Earliest -n 0
- 生产消息
bin/pulsar-client produce persistent://my-test/my-namespace/native_src --messages "actual pulsar" -n 10
- 查看消费者的输出
Pulsar函数SDK示例
- 由于依赖Pulsar函数SDK,因此JDK需要选择17,在前面的工程添加Pom依赖
<properties><pulsar.version>2.11.0</pulsar.version></properties><dependencies><dependency><groupId>org.apache.pulsar</groupId><artifactId>pulsar-functions-api</artifactId><version>${pulsar.version}</version></dependency></dependencies>
-
打包指定sn.itxs.pulsar.function.SdkFunctionDemo
-
创建SdkFunctionDemo.java
package sn.itxs.pulsar.function;import org.apache.pulsar.functions.api.Context;
import org.apache.pulsar.functions.api.Function;public class SdkFunctionDemo implements Function<String, String> {@Overridepublic String process(String input, Context context) {return String.format("hahaha,pulsar sdk implement %s!", input);}
}
-
打包生成pulsar-demo-1.0.jar,上传到安装Pulsar服务器上的,这里还是覆盖pulsar根目录下的examples文件夹文件,其他和前面一样
-
创建函数描述文件,vim examples/sdk-example-function-config.yaml
tenant: "my-test"
namespace: "my-namespace"
name: "sdk-example"
className: "sn.itxs.pulsar.function.SdkFunctionDemo"
inputs: ["persistent://my-test/my-namespace/sdk_src"]
userConfig:"PublishTopic": "persistent://my-test/my-namespace/sdk_result"output: "persistent://my-test/my-namespace/sdk_result"
autoAck: true
parallelism: 1
- 创建函数
bin/pulsar-admin functions create \--function-config-file examples/sdk-example-function-config.yaml \--jar examples/pulsar-demo-1.0.jar
- 消费消息
bin/pulsar-client consume persistent://my-test/my-namespace/sdk_result -s 'my-subscription' -p Earliest -n 0
- 生产消息
bin/pulsar-client produce persistent://my-test/my-namespace/sdk_src --messages "actual pulsar" -n 10
- 查看消费者的输出
- 本人博客网站IT小神 www.itxiaoshen.com
相关文章:

云原生时代顶流消息中间件Apache Pulsar部署实操之轻量级计算框架
文章目录Pulsar Functions(轻量级计算框架)基础定义工作流程函数运行时处理保证和订阅类型窗口函数定义窗口类型滚动窗口滑动窗口函数配置函数示例有状态函数示例窗口函数示例自定义函数开发定义原生语言接口示例Pulsar函数SDK示例Pulsar Functions(轻量级计算框架) 基础定义 …...

数据结构刷题(十九):77组合、216组合总和III
1.组合题目链接过程图:先从集合中取一个数,再依次从剩余数中取k-1个数。思路:回溯算法。使用回溯三部曲进行解题:递归函数的返回值以及参数:n,k,startIndex(记录每次循环集合从哪里开始遍历的位…...

PyQt 做美*女GIF设置桌面,每天都很爱~
人生苦短,我用python 要说程序员工作的最大压力不是来自于工作本身, 而是来自于需要不断学习才能更好地完成工作, 因为程序员工作中面对的编程语言是在不断更新的, 同时还要学习熟悉其他语言来提升竞争力… 好了,学习…...
[渗透测试笔记] 54.日薪2k的蓝队hw中级定级必备笔记系列篇3之域渗透黄金票据和白银票据
前文链接 [渗透测试笔记] 52.告别初级,日薪2k的蓝队hw中级定级必备笔记 [渗透测试笔记] 53.日薪2k的蓝队hw中级定级必备笔记2 文章目录 Kerberos认证协议NTLM认证协议Kerberos和NTLM比较黄金票据原理黄金票据条件复现过程白银票据原理白银票据条件复现过程黄金票据和白银票据…...
【异常】Spring Cloud Gateway网关自定义过滤器无法获取到请求体body的内容?不存在的!
一、需求说明 项目要使用到网关SpringCloud Gateway进行验签,现在定义了一个过滤器ValidateSignFilter, 我希望,所以过网关SpringCloud Gateway的请求,都能够校验一下请求头,看看是否有Sign这个字段放在请求头中。 二、异常说明 但是,我遇到了SpringCloud Gateway网关…...
CNN 卷积神经网络对染色血液细胞分类(blood-cells)
目录 1. 介绍 2. 加载数据 3. 可视化 3.1 显示单幅图像 3.2 显示多幅图像...

Kubernetes学习(三)Service
Service对象 为什么需要Service 每个Pod都有自己的IP地址,但是在Deployment中,在同一时刻运行的Pod集合可能与稍后运行该应用程序的Pod集合不同。 这就导致了一个问题:如果一组Pod(称为后端)为集群内其他Pod&#x…...
数学小课堂:古德-图灵折扣估计法和插值法(防范黑天鹅事件的方法)
文章目录 引言I 黑天鹅事件产生的原因1.1 置信度1.2 数据的稀疏性1.3 零概率问题II 防范黑天鹅事件的方法2.1 古德-图灵折扣估计法2.2 插值法引言 防范黑天鹅事件的方法 古德-图灵折扣估计法:它主要是解决零概率的事件古德的方法虽然解决了零概率的问题,但是依然没有解决数据…...
redis getshell方法
前言 参考文章 https://paper.seebug.org/1169 https://blog.csdn.net/weixin_55843787/article/details/123829606 https://blog.csdn.net/chenglanqi6606/article/details/100909518 Redis是什么 Redis是一款基于键值对的NoSQL数据库,它的值支持多种数据结构 …...

【ONE·C || 程序编译简述】
总言 C语言:程序编译相关。 文章目录总言1、程序的翻译环境和运行环境1.1、简述1.2、翻译环境:程序编译与链接1.2.1、简介:程序如何从.c文件形成.exe可执行程序1.2.2、过程说明1.3、运行环境2、预处理详解2.1、预定义符号2.2、#define2.…...

MGAT: Multimodal Graph Attention Network for Recommendation
模型总览如下: 图1:多模态图注意力网络背景:本论文是对MMGCN(Wei et al., 2019)的改进。MMGCN简单地在并行交互图上使用GNN,平等地对待从所有邻居传播的信息,无法自适应地捕获用户偏好。 MMGCN…...

在SNAP中用sentinel-1数据做InSAR测量,以门源地震为例
在SNAP中用sentinel-1数据做InSAR0 写在前面1 数据下载2 处理步骤2.1 split2.2 apply orbit 导入精密轨道2.3 查看数据的时空基线base line2.4 back-geocoding 配准2.5 Enhanced Spectral Diversity2.6 Deburst2.7 Interogram Formation 生成干涉图2.8 Multilook 多视2.9 Golds…...

MySQL常用函数
什么是函数? 函数是指一段可以直接被另一段程序调用的程序或代码。 字符串函数 函数功能CONCAT(S1,S2,…Sn)字符串拼接,将S1,S2,… Sn拼接成一个字符串LOWER(str)将字符串str全部转为小写LOWER(str)将字符串str全部转为小写LPAD(…...

51单片机数字电子钟开题报告
目录 选题背景 初步设计方案 芯片的选型 编译环境 关键问题 策略 方案 参考文献 选题背景 数字电子钟是一种受到越来越多人喜爱的钟表,其准确性和稳定性成为设计和研发的重要考虑因素。在现代社会,时间的准确性对于各行各业都非常重要࿰…...
day7 HTTP协议
HTTP协议 什么是协议? 协议实际上是某些人,或者某些组织提前制定好的一套规范,大家都按照这个规范来,这样可以做到沟通无障碍。协议就是一套规范,就是一套标准。由其他人或其他组织来负责制定的。我说的话你能听懂&…...

3DCAT+一汽奥迪:共建线上个性化订车实时云渲染方案
近年来,随着5G网络和云计算技术的不断发展,交互式3D实时云看车正在成为一种新的看车方式。与传统的到4S店实地考察不同,消费者可以足不出户,通过网络与终端设备即可实现全方位展示、自选汽车配色、模拟效果、快捷选车并进行个性化…...

yii2项目使用frp https2http插件问题
yii2内网项目,使用frp进行内网穿透,使用 https2http插件把内网服务器http流量转成https,会存在一个问题:当使用 $this->redirect(...) 或 $this->goHome() (其实用的也是前者)等重定向时,…...

关于 interface{} 会有啥注意事项?下
我们一起来回顾一下上一次说到的 interface{} 可以用来做多态 接口类型分为空接口类型和非空接口类型,他们的底层数据结构不太一样 这里顺便说一下,用来作态需要满足这样的条件: 首先得有父类指针指向子类的对象这个接口还必须是非空接口…...

ansible组件介绍和简单playbook测试
一、ansible inventory 在大规模的配置管理工作中,管理不同业务的机器,机器的信息都存放在ansible的inventory组件里面。在工作中,配置部署针对的主机必须先存放在Inventory里面,然后ansible才能对它进行操作。默认的Ansible的in…...

[数据结构]:13-插入排序(顺序表指针实现形式)(C语言实现)
目录 前言 已完成内容 插入排序实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-PSeqListFunction.cpp 04-SortCommon.cpp 05-SortFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容,除其中使用到C引用外,全为C语言代…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...