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

云原生时代顶流消息中间件Apache Pulsar部署实操之轻量级计算框架

文章目录

  • Pulsar Functions(轻量级计算框架)
    • 基础定义
    • 工作流程
    • 函数运行时
    • 处理保证和订阅类型
    • 窗口函数
      • 定义
      • 窗口类型
        • 滚动窗口
        • 滑动窗口
    • 函数配置
    • 函数示例
    • 有状态函数示例
    • 窗口函数示例
    • 自定义函数开发
      • 定义
      • 原生语言接口示例
      • Pulsar函数SDK示例

Pulsar Functions(轻量级计算框架)

基础定义

Function instance(函数实例)是函数执行框架的核心元素,由以下元素组成:

  • 消费来自不同输入主题的消息的消费者的集合。
  • 调用函数的执行程序。
  • 将函数的结果发送到输出主题的生产者。

函数实例的内部工作流

  • 一个函数可以有多个实例,每个实例执行一个函数的副本。可以在配置文件中指定实例数。
  • 函数实例中的使用者使用FQFN作为订阅者名,以基于订阅类型在多个实例之间实现负载平衡。订阅类型可以在函数级别指定。
  • 每个函数都有一个单独的FQFN状态存储。可指定一个状态接口,以便在BookKeeper中持久化中间结果。其他用户可以查询函数的状态并提取这些结果。

工作流程

Function worker 是一个逻辑组件,用于在Pulsar Functions的集群模式部署中监视、编排和执行单个函数。每个函数实例都可以作为线程或进程执行,具体取决于所选的配置。如果Kubernetes集群可用,则可以在Kubernetes中以StatefulSets的形式生成函数。

Function worker的内部架构和工作流如下

image-20230303180946526

  • 用户向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语义。窗口函数是跨数据窗口(即事件流的有限子集)执行计算的函数。如下图所示,流被划分为“桶”,其中可以应用函数。

image-20230306161555132

函数的数据窗口定义包含两个策略:

  • 清除策略:控制在窗口中收集的数据量。
  • 触发策略:控制何时触发一个函数并执行该函数以根据清除策略处理窗口中收集的所有数据。

触发策略和驱逐策略都由时间或计数驱动。

提示

  • 同时支持处理时间和事件时间。
  • 处理时间是根据函数实例构建和处理窗口时的壁时间定义的。窗口完整性的判断很简单,您不必担心数据到达混乱。

窗口类型

滚动窗口

滚动窗口将元素分配给具有指定时间长度或计数的窗口。滚动窗口的驱逐策略总是基于窗口已满。因此只需要指定触发器策略,基于计数或基于时间。在具有基于计数的触发策略的滚动窗口中,如以下示例所示,触发策略被设置为2。当窗口中有两个项目时,无论时间如何,都会触发并执行每个函数。

image-20230306162713067

相反,如下面的示例所示,滚动窗口的窗口长度为10秒,这意味着当10秒的时间间隔过去时,函数将被触发,而不管窗口中有多少事件。

image-20230306162723916

滑动窗口

滑动窗口方法通过设置清除策略来限制保留用于处理的数据量,并使用滑动间隔设置触发器策略来定义固定的窗口长度。如果滑动间隔小于窗口长度,则存在数据重叠,这意味着同时落入相邻窗口的数据将被多次用于计算。如下面的示例所示,窗口长度为2秒,这意味着任何超过2秒的数据都将被清除,不会在计算中使用。滑动间隔被配置为1秒,这意味着该函数每秒执行一次,以处理整个窗口长度内的数据。

image-20230306162804742

函数配置

在独立的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

image-20230306171929532

函数示例

使用官方的函数示例演示,查看根目录下examples文件夹

image-20230306172608701

  • 创建租户和命名空间
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

image-20230306173307386

  • 查看函数的配置
bin/pulsar-admin functions get \--tenant my-test \--namespace my-namespace \--name example

image-20230307094316237

  • 查看状态
bin/pulsar-admin functions status \--tenant my-test \--namespace my-namespace \--name example

image-20230307094334789

  • 消费消息
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
  • 查看消费者的输出

image-20230307094031460

有状态函数示例

  • 在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
  • 查看消费窗口输出

image-20230307143014857

自定义函数开发

定义

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
  • 查看消费者的输出

image-20230307164653697

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
  • 查看消费者的输出

image-20230307170134637

  • 本人博客网站IT小神 www.itxiaoshen.com

相关文章:

云原生时代顶流消息中间件Apache Pulsar部署实操之轻量级计算框架

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

数据结构刷题(十九):77组合、216组合总和III

1.组合题目链接过程图&#xff1a;先从集合中取一个数&#xff0c;再依次从剩余数中取k-1个数。思路&#xff1a;回溯算法。使用回溯三部曲进行解题&#xff1a;递归函数的返回值以及参数&#xff1a;n&#xff0c;k&#xff0c;startIndex(记录每次循环集合从哪里开始遍历的位…...

PyQt 做美*女GIF设置桌面,每天都很爱~

人生苦短&#xff0c;我用python 要说程序员工作的最大压力不是来自于工作本身&#xff0c; 而是来自于需要不断学习才能更好地完成工作&#xff0c; 因为程序员工作中面对的编程语言是在不断更新的&#xff0c; 同时还要学习熟悉其他语言来提升竞争力… 好了&#xff0c;学习…...

[渗透测试笔记] 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地址&#xff0c;但是在Deployment中&#xff0c;在同一时刻运行的Pod集合可能与稍后运行该应用程序的Pod集合不同。 这就导致了一个问题&#xff1a;如果一组Pod&#xff08;称为后端&#xff09;为集群内其他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数据库&#xff0c;它的值支持多种数据结构 …...

【ONE·C || 程序编译简述】

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

MGAT: Multimodal Graph Attention Network for Recommendation

模型总览如下&#xff1a; 图1&#xff1a;多模态图注意力网络背景&#xff1a;本论文是对MMGCN&#xff08;Wei et al., 2019&#xff09;的改进。MMGCN简单地在并行交互图上使用GNN&#xff0c;平等地对待从所有邻居传播的信息&#xff0c;无法自适应地捕获用户偏好。 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常用函数

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

51单片机数字电子钟开题报告

目录 选题背景 初步设计方案 芯片的选型 编译环境 关键问题 策略 方案 参考文献 选题背景 数字电子钟是一种受到越来越多人喜爱的钟表&#xff0c;其准确性和稳定性成为设计和研发的重要考虑因素。在现代社会&#xff0c;时间的准确性对于各行各业都非常重要&#xff0…...

day7 HTTP协议

HTTP协议 什么是协议&#xff1f; 协议实际上是某些人&#xff0c;或者某些组织提前制定好的一套规范&#xff0c;大家都按照这个规范来&#xff0c;这样可以做到沟通无障碍。协议就是一套规范&#xff0c;就是一套标准。由其他人或其他组织来负责制定的。我说的话你能听懂&…...

3DCAT+一汽奥迪:共建线上个性化订车实时云渲染方案

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

yii2项目使用frp https2http插件问题

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

关于 interface{} 会有啥注意事项?下

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

ansible组件介绍和简单playbook测试

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

[数据结构]:13-插入排序(顺序表指针实现形式)(C语言实现)

目录 前言 已完成内容 插入排序实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-PSeqListFunction.cpp 04-SortCommon.cpp 05-SortFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容&#xff0c;除其中使用到C引用外&#xff0c;全为C语言代…...

es6 new Promise

Promise 是一个构造函数&#xff0c;本身身上有 all、reject、resolve 这几个方法&#xff0c;原型上有 then、catch 等方法。所以 Promise new 出来的对象确定就有 then、catch 方法。Promise 的构造函数接收一个参数&#xff0c;是函数&#xff0c;而且传入两个参数&#xff…...

Python爬虫实战:使用Requests和BeautifulSoup爬取网页内容

标题&#xff1a;Python爬虫实战&#xff1a;使用Requests和BeautifulSoup爬取网页内容 Python爬虫技术是网络爬虫中的一种&#xff0c;它可以从互联网上抓取各种网页信息&#xff0c;如文本、图片、视频等&#xff0c;并将它们存储在本地数据库中。Python语言具有简单易学、语…...

质量指标——什么是增量覆盖率?它有啥用途?

目录 引言 什么是增量覆盖率 增量覆盖率有啥用途 1、对不同角色同学的用途 2、对不同规模的业务需求的用途 增量覆盖率的适用人员 增量覆盖率不太适用的情况 引言 有些质量团队&#xff0c;有时会拿「增量覆盖率」做出测试的准出卡点。 但在实际的使用过程中&#xff0c;…...

Hive---拉链表

拉链表 文章目录拉链表定义用途案例全量流程增量流程合并过程第一步第二步第三步案例二&#xff08;含分区&#xff09;创建外部表orders增量分区表历史记录表定义 拉链表是一种数据模型&#xff0c;主要是针对数据仓库设计中表存储数据的方式而定义的&#xff0c;顾名思义&am…...

日常文档标题级别规范

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…...

C++学习记录——십이 vector

文章目录1、vector介绍和使用2、vector模拟实现insert和erase和迭代器失效补齐其他函数深浅拷贝难点思考1、vector介绍和使用 vector可以管理任意类型的数组&#xff0c;是一个表示可变大小数组的序列容器。 通过vector文档来看它的使用。 #include <iostream> #inclu…...

Lombok常见用法总结

目录一、下载和安装二、常见注释&#xff08;一&#xff09;Data&#xff08;二&#xff09;Getter和Setter&#xff08;三&#xff09;NonNull和NotNull&#xff08;不常用&#xff09;&#xff08;四&#xff09;ToString&#xff08;不常用&#xff09;&#xff08;五&#…...

【Ajax】异步通信

一.概述 概念&#xff1a;AJAX(Asynchronous JavaScript And XML)&#xff1a;异步的 JavaScript 和 XML 作用&#xff1a; 与服务器进行数据交换&#xff1a;通过AJAX可以给服务器发送请求&#xff0c;并获取服务器响应的数据 使用了AJAX和服务器进行通信&#xff0c;就可以使…...

近红外吸收荧光染料IR-808,IR-808 NH2,IR-808 amine,发射808nm 性质分享

中文名称&#xff1a;IR-808 氨基英文名称&#xff1a;IR-808 NH2&#xff0c;IR-808 amine&#xff0c;IR-808-NH2规格标准&#xff1a;10mg&#xff0c;25mg&#xff0c;50mgCAS&#xff1a;N/A产品描述&#xff1a;IR-808&#xff0c;发射808nm&#xff0c;酯溶性染料修饰氨…...

一图来看你需要拥有那些知识储备

技术实践 数据 关系型数据 MySQLSQLServerOraclePostgrSQLDB2 大数据存储 RedisMemcacheMongoDBHBaseHive 大数据处理 Hadoop 数据报表看板 DataGearGrafanaKibanaMetaBase 消息对列 Rabbit MQRock MQActive MQKafka 大数据搜索 SolrElasticSearchLucenHive 服务提…...

ui交互动效 wordpress/电子商务平台有哪些

文章目录写在开头的话功能需求演示写在最后的话&#xff1a;这里是一段防爬虫文本&#xff0c;请读者忽略。 本文原创首发于CSDN&#xff0c;作者IDYS 博客首页&#xff1a;https://blog.csdn.net/weixin_41633902/ 本文链接&#xff1a;https://blog.csdn.net/weixin_41633902…...

nas有域名了怎么做网站/seo诊断分析工具

Windows部署服务是SystemCenter2012SP1的体系中属于一个必要环节&#xff0c;对VMM和SCCM来说&#xff0c;Windows部署服务&#xff08;WDS&#xff09;显得尤为重要&#xff0c;在批量化的运维当中&#xff0c;WDS能够节约基层运维人员大量的工作时间&#xff0c;降低重复劳动…...

网页网站开发平台/学开网店哪个培训机构好正规

layout动画在每次布局发生变化的时候系统调用的一个预加载动画效果&#xff0c;使用layout动画可以让布局的变化过度看起来更自然。使用起来很简单&#xff0c;只需在控件中添加一个属性就可以了&#xff0c;系统默认是不会启动layout动画的&#xff0c;因此我们平时的应用中不…...

长沙做网站seo/竞价推广思路

下面是最常见的线程池的使用和声明方式&#xff1a; public class ThreadTest {ExecutorService fixedThreadPool Executors.newFixedThreadPool(50);public void dothing(){for(int i0;i<50;i){fixedThreadPool.execute(new Runnable() {Overridepublic void run() {…...

厦门做网站的公司/重庆百度竞价推广

细心的朋友会注意到,当你在linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching.这个问题,貌似有不少人在问,不过都没有看到有什么很好解决的办法.那么我来谈谈这个问题.先来说说free命令[rootserver ~]# free -mtotal use…...

做ppt选小图案的网站/2021年中国关键词

原文地址 你是否曾经也有过这样的问题&#xff1a; 用VS的时候&#xff0c;有时会用到一些非自带的库&#xff0c;例如WTL、Boost、DX等&#xff0c;每次需要用到时都要在项目属性里添加相应的include目录&#xff0c;久而久之觉得有点麻烦。是否有解决办法呢&#xff1f; 于是…...