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

一、kafka入门

Kafka入门

为什么要用消息中间件?

异步处理

场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种1.串行的方式;2.并行方式。

串行方式:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QSbXkisA-1686193157416)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image002.jpg)]image.png

(2)并行方式:将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间。

假设三个业务节点每个使用50毫秒钟,不考虑网络等其他开销,则串行方式的时间是150毫秒,并行的时间可能是100毫秒。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9p13A393-1686193157418)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image004.jpg)]image.png

小结:如以上案例描述,传统的方式系统的性能(并发量,吞吐量,响应时间)会有瓶颈。如何解决这个问题呢?

引入消息队列,将不是必须的业务逻辑,异步处理。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8RExvNKZ-1686193157419)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image006.jpg)]image.png

按照以上约定,用户的响应时间相当于是注册信息写入数据库的时间,也就是50毫秒。注册邮件,发送短信写入消息队列后,直接返回,因此写入消息队列的速度很快,基本可以忽略,因此用户的响应时间可能是50毫秒。因此架构改变后,系统的吞吐量提高到每秒20 QPS。比串行提高了3倍,比并行提高了两倍。

应用解耦

场景说明:用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口。

传统模式的缺点:

1) 假如库存系统无法访问,则订单减库存将失败,从而导致订单失败;

2) 订单系统与库存系统耦合;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CZbRjNwt-1686193157420)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image008.jpg)]image.png

如何解决以上问题呢?引入应用消息队列后的方案

订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。

库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c7GtV11T-1686193157422)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image010.jpg)]image.png

假如:在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦。

流量削峰

流量削峰也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛。

应用场景:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列:可以控制活动的人数;可以缓解短时间内高流量压垮应用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KkntO33S-1686193157423)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image012.gif)]image.png

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8cQLq6b0-1686193157425)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image014.gif)]

用户的请求,服务器接收后,首先写入消息队列。假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面;秒杀业务根据消息队列中的请求信息,再做后续处理。

日志处理

日志处理是指将消息队列用在日志处理中,比如Kafka的应用,解决大量日志传输的问题。架构简化如下:

image.png

日志采集客户端,负责日志数据采集,定时写入Kafka队列:Kafka消息队列,负责日志数据的接收,存储和转发;日志处理应用:订阅并消费kafka队列中的日志数据;

为什么选择Kafka?

消息中间件的编年史

image.png

Kafka的外在表现和内在设计

kafka最初是LinkedIn的一个内部基础设施系统。最初开发的起因是,LinkedIn虽然有了数据库和其他系统可以用来存储数据,但是缺乏一个可以帮助处理持续数据流的组件。

所以在设计理念上,开发者不想只是开发一个能够存储数据的系统,如关系数据库、Nosql数据库、搜索引擎等等,更希望把数据看成一个持续变化和不断增长的流,并基于这样的想法构建出一个数据系统,一个数据架构。

Kafka外在表现很像消息系统,允许发布和订阅消息流,但是它和传统的消息系统有很大的差异:

1、Kafka是个现代分布式系统,以集群的方式运行,可以自由伸缩。

2、Kafka可以按照要求存储数据,保存多久都可以,

3、流式处理将数据处理的层次提示到了新高度,消息系统只会传递数据,Kafka的流式处理能力可以让我们用很少的代码就能动态地处理派生流和数据集。所以Kafka不仅仅是个消息中间件。

Kafka不仅仅是一个消息中间件,同时它是一个流平台,这个平台上可以发布和订阅数据流(Kafka的流,有一个单独的包Stream的处理),并把他们保存起来,进行处理,这个是Kafka作者的设计理念。

大数据领域,Kafka还可以看成实时版的Hadoop,但是还是有些区别,Hadoop可以存储和定期处理大量的数据文件,往往以TB计数,而Kafka可以存储和持续处理大型的数据流。Hadoop主要用在数据分析上,而Kafka因为低延迟,更适合于核心的业务应用上。

Kafka名字的由来:卡夫卡与法国作家马塞尔·普鲁斯特,爱尔兰作家詹姆斯·乔伊斯并称为西方现代主义文学的先驱和大师。《变形记》是卡夫卡的短篇代表作,是卡夫卡的艺术成就中的一座高峰,被认为是20世纪最伟大的小说作品之一(达到管理层的高度同学可以多看下人文相关的书籍,增长管理知识和人格魅力)。

本次课程,将会以kafka_2.13-3.3.1版本做主讲(这是讲课时的最新版本)。

市场主流消息中间件对比

image.png

Kafka中的基本概念

消息和批次

消息 ,Kafka里的数据单元,也就是我们一般消息中间件里的消息的概念(可以比作数据库中一条记录)。消息由字节数组组成。消息还可以包含键(可选元数据,也是字节数组),主要用于对消息选取分区。

作为一个高效的消息系统,为了提高效率,消息可以被分批写入Kafka。批次就是一组消息,这些消息属于同一个主题和分区。如果只传递单个消息,会导致大量的网络开销,把消息分成批次传输可以减少这开销。但是,这个需要权衡(时间延迟和吞吐量之间),批次里包含的消息越多,单位时间内处理的消息就越多,单个消息的传输时间就越长(吞吐量高延时也高)。如果进行压缩,可以提升数据的传输和存储能力,但需要更多的计算处理。

对于Kafka来说,消息是晦涩难懂的字节数组,一般我们使用序列化和反序列化技术,格式常用的有JSON和XML,还有Avro(Hadoop开发的一款序列化框架),具体怎么使用依据自身的业务来定。

主题和分区

Kafka里的消息用主题进行分类(主题好比数据库中的表),主题下有可以被分为若干个 分区(分表技术) 。分区本质上是个提交日志文件,有新消息,这个消息就会以追加的方式写入分区(写文件的形式),然后用先入先出的顺序读取。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PG8I02O1-1686193157434)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image002.jpg)]image.png

但是因为主题会有多个分区,所以在整个主题的范围内,是无法保证消息的顺序的,单个分区则可以保证。

Kafka通过分区来实现数据冗余和伸缩性,因为分区可以分布在不同的服务器上,那就是说一个主题可以跨越多个服务器(这是Kafka高性能的一个原因,多台服务器的磁盘读写性能比单台更高)。

前面我们说Kafka可以看成一个流平台,很多时候,我们会把一个主题的数据看成一个流,不管有多少个分区。

生产者和消费者、偏移量、消费者群组

就是一般消息中间件里生产者和消费者的概念。一些其他的高级客户端API,像数据管道API和流式处理的Kafka Stream,都是使用了最基本的生产者和消费者作为内部组件,然后提供了高级功能。

生产者默认情况下把消息均衡分布到主题的所有分区上,如果需要指定分区,则需要使用消息里的消息键和分区器。

消费者订阅主题,一个或者多个,并且按照消息的生成顺序读取。消费者通过检查所谓的偏移量来区分消息是否读取过。偏移量是一种元数据,一个不断递增的整数值,创建消息的时候,Kafka会把他加入消息。在一个主题中一个分区里,每个消息的偏移量是唯一的。每个分区最后读取的消息偏移量会保存到Zookeeper或者Kafka上,这样分区的消费者关闭或者重启,读取状态都不会丢失。

多个消费者可以构成一个消费者群组。怎么构成?共同读取一个主题的消费者们,就形成了一个群组。群组可以保证每个分区只被一个消费者使用。

image.png

消费者和分区之间的这种映射关系叫做消费者对分区的所有权关系,很明显,一个分区只有一个消费者,而一个消费者可以有多个分区。

(吃饭的故事:一桌一个分区,多桌多个分区,生产者不断生产消息(消费),消费者就是买单的人,消费者群组就是一群买单的人),一个分区只能被消费者群组中的一个消费者消费(不能重复消费),如果有一个消费者挂掉了<James跑路了>,另外的消费者接上)

Broker和集群

一个独立的Kafka服务器叫Broker。broker的主要工作是,接收生产者的消息,设置偏移量,提交消息到磁盘保存;为消费者提供服务,响应请求,返回消息。在合适的硬件上,单个broker可以处理上千个分区和每秒百万级的消息量。(要达到这个目的需要做操作系统调优和JVM调优)

多个broker可以组成一个集群。每个集群中broker会选举出一个集群控制器。控制器会进行管理,包括将分区分配给broker和监控broker。

集群里,一个分区从属于一个broker,这个broker被称为首领。但是分区可以被分配给多个broker,这个时候会发生分区复制。

集群中Kafka内部一般使用管道技术进行高效的复制。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-trE4nSw7-1686193157437)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image006.jpg)]image.png

分区复制带来的好处是,提供了消息冗余。一旦首领broker失效,其他broker可以接管领导权。当然相关的消费者和生产者都要重新连接到新的首领上。

保留消息

在一定期限内保留消息是Kafka的一个重要特性,Kafka broker默认的保留策略是:要么保留一段时间(7天),要么保留一定大小(比如1个G)。到了限制,旧消息过期并删除。但是每个主题可以根据业务需求配置自己的保留策略(开发时要注意,Kafka不像Mysql之类的永久存储)。

为什么选择Kafka

优点

多生产者和多消费者

基于磁盘的数据存储,换句话说,Kafka的数据天生就是持久化的。

高伸缩性,Kafka一开始就被设计成一个具有灵活伸缩性的系统,对在线集群的伸缩丝毫不影响整体系统的可用性。

高性能,结合横向扩展生产者、消费者和broker,Kafka可以轻松处理巨大的信息流(LinkedIn公司每天处理万亿级数据),同时保证亚秒级的消息延迟。

常见场景

活动跟踪

跟踪网站用户和前端应用发生的交互,比如页面访问次数和点击,将这些信息作为消息发布到一个或者多个主题上,这样就可以根据这些数据为机器学习提供数据,更新搜素结果等等(头条、淘宝等总会推送你感兴趣的内容,其实在数据分析之前就已经做了活动跟踪)。

传递消息

标准消息中间件的功能

收集指标和日志

收集应用程序和系统的度量监控指标,或者收集应用日志信息,通过Kafka路由到专门的日志搜索系统,比如ES。(国内用得较多)

提交日志

收集其他系统的变动日志,比如数据库。可以把数据库的更新发布到Kafka上,应用通过监控事件流来接收数据库的实时更新,或者通过事件流将数据库的更新复制到远程系统。

还可以当其他系统发生了崩溃,通过重放日志来恢复系统的状态。(异地灾备)

流处理

操作实时数据流,进行统计、转换、复杂计算等等。随着大数据技术的不断发展和成熟,无论是传统企业还是互联网公司都已经不再满足于离线批处理,实时流处理的需求和重要性日益增长

近年来业界一直在探索实时流计算引擎和API,比如这几年火爆的Spark
Streaming、Kafka Streaming、Beam和Flink,其中阿里双11会场展示的实时销售金额,就用的是流计算,是基于Flink,然后阿里在其上定制化的Blink。

Kafka的安装、管理和配置

安装

预备环境

Kafka是Java生态圈下的一员,用Scala编写,运行在Java虚拟机上,所以安装运行和普通的Java程序并没有什么区别。

安装Kafka官方说法,Java环境推荐Java8。

Kafka需要Zookeeper保存集群的元数据信息和消费者信息。Kafka一般会自带Zookeeper,但是从稳定性考虑,应该使用单独的Zookeeper,而且构建Zookeeper集群。

运行

Kafka with ZooKeeper

启动Zookeeper

进入Kafka目录下的bin\windows

执行kafka-server-start.bat …/…/config/server.properties

Linux下与此类似,进入bin后,执行对应的sh文件即可

Kafka with KRaft

1、生成集群id

image.png

2、格式化存储目录

image.png

3、启动服务

image.png

启动正确后的界面如下:

image.png

kafka基本的操作和管理

## 列出所有主题

./kafka-topics.sh --bootstrap-server localhost:9092 --list

## 列出所有主题的详细信息

./kafka-topics.sh --bootstrap-server localhost:9092 --describe

## 创建主题主题名 my-topic ,1副本,8分区

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

## 增加分区,注意:分区无法被删除

./kafka-topics.sh --bootstrap-server localhost:9092 --alter --topic my-topic --partitions 16

## 创建生产者(控制台)

./kafka-console-producer.sh --broker-list localhost:9092 --topic my-topic

## 创建消费者(控制台)

./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic my-topic --from-beginning --consumer.config ../config/consumer.properties

## kafka终止命令

./kafka-server-stop.sh 

总结就是:

Broker配置

配置文件放在Kafka目录下的config目录中,主要是server.properties文件

常规配置

broker.id

在单机时无需修改,但在集群下部署时往往需要修改。它是个每一个broker在集群中的唯一表示,要求是正数。当该服务器的IP地址发生改变时,broker.id没有变化,则不会影响consumers的消息情况

listeners

监听列表(以逗号分隔 不同的协议(如plaintext,trace,ssl、不同的IP和端口)),hostname如果设置为0.0.0.0则绑定所有的网卡地址;如果hostname为空则绑定默认的网卡。如果没有配置则默认为java.net.InetAddress.getCanonicalHostName()。

如:PLAINTEXT://myhost:9092,TRACE://:9091或 PLAINTEXT://0.0.0.0:9092,

zookeeper.connect

zookeeper集群的地址,可以是多个,多个之间用逗号分割。(一组hostname:port/path列表,hostname是zk的机器名或IP、port是zk的端口、/path是可选zk的路径,如果不指定,默认使用根路径)

log.dirs

Kafka把所有的消息都保存在磁盘上,存放这些数据的目录通过log.dirs指定。可以使用多路径,使用逗号分隔。如果是多路径,Kafka会根据“最少使用”原则,把同一个分区的日志片段保存到同一路径下。会往拥有最少数据分区的路径新增分区。

num.recovery.threads.per.data.dir

每数据目录用于日志恢复启动和关闭时的线程数量。因为这些线程只是服务器启动(正常启动和崩溃后重启)和关闭时会用到。所以完全可以设置大量的线程来达到并行操作的目的。注意,这个参数指的是每个日志目录的线程数,比如本参数设置为8,而log.dirs设置为了三个路径,则总共会启动24个线程。

auto.create.topics.enable

是否允许自动创建主题。如果设为true,那么produce(生产者往主题写消息),consume(消费者从主题读消息)或者fetch
metadata(任意客户端向主题发送元数据请求时)一个不存在的主题时,就会自动创建。缺省为true。

delete.topic.enable=true

删除主题配置,默认未开启

主题配置

新建主题的默认参数

num.partitions

每个新建主题的分区个数(分区个数只能增加,不能减少 )。这个参数一般要评估,比如,每秒钟要写入和读取1000M数据,如果现在每个消费者每秒钟可以处理50MB的数据,那么需要20个分区,这样就可以让20个消费者同时读取这些分区,从而达到设计目标。(一般经验,把分区大小限制在25G之内比较理想)

log.retention.hours

日志保存时间,默认为7天(168小时)。超过这个时间会清理数据。bytes和minutes无论哪个先达到都会触发。与此类似还有log.retention.minutes和log.retention.ms,都设置的话,优先使用具有最小值的那个。(提示:时间保留数据是通过检查磁盘上日志片段文件的最后修改时间来实现的。也就是最后修改时间是指日志片段的关闭时间,也就是文件里最后一个消息的时间戳)

log.retention.bytes

topic每个分区的最大文件大小,一个topic的大小限制 = 分区数*log.retention.bytes。-1没有大小限制。log.retention.bytes和log.retention.minutes任意一个达到要求,都会执行删除。(注意如果是log.retention.bytes先达到了,则是删除多出来的部分数据),一般不推荐使用最大文件删除策略,而是推荐使用文件过期删除策略。

log.segment.bytes

分区的日志存放在某个目录下诸多文件中,这些文件将分区的日志切分成一段一段的,我们称为日志片段。这个属性就是每个文件的最大尺寸;当尺寸达到这个数值时,就会关闭当前文件,并创建新文件。被关闭的文件就开始等待过期。默认为1G。

如果一个主题每天只接受100MB的消息,那么根据默认设置,需要10天才能填满一个文件。而且因为日志片段在关闭之前,消息是不会过期的,所以如果log.retention.hours保持默认值的话,那么这个日志片段需要17天才过期。因为关闭日志片段需要10天,等待过期又需要7天。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-15U5n3yQ-1686193157450)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image010.jpg)]image.png

log.segment.ms

作用和log.segment.bytes类似,只不过判断依据是时间。同样的,两个参数,以先到的为准。这个参数默认是不开启的。

message.max.bytes

表示一个服务器能够接收处理的消息的最大字节数,注意这个值producer和consumer必须设置一致,且不要大于fetch.message.max.bytes属性的值(消费者能读取的最大消息,这个值应该大于或等于message.max.bytes)。该值默认是1000000字节,大概900KB~1MB。如果启动压缩,判断压缩后的值。这个值的大小对性能影响很大,值越大,网络和IO的时间越长,还会增加磁盘写入的大小。

Kafka设计的初衷是迅速处理短小的消息,一般10K大小的消息吞吐性能最好(LinkedIn的kafka性能测试)

硬件配置对Kafka性能的影响

为Kafka选择合适的硬件更像是一门艺术,就跟它的名字一样,我们分别从磁盘、内存、网络和CPU上来分析,确定了这些关注点,就可以在预算范围之内选择最优的硬件配置。

磁盘吞吐量/磁盘容量

磁盘吞吐量(IOPS 每秒的读写次数)会影响生产者的性能。因为生产者的消息必须被提交到服务器保存,大多数的客户端都会一直等待,直到至少有一个服务器确认消息已经成功提交为止。也就是说,磁盘写入速度越快,生成消息的延迟就越低。(SSD固态贵单个速度快,HDD机械偏移可以多买几个,设置多个目录加快速度,具体情况具体分析)

磁盘容量的大小,则主要看需要保存的消息数量。如果每天收到1TB的数据,并保留7天,那么磁盘就需要7TB的数据。

内存

Kafka本身并不需要太大内存,内存则主要是影响消费者性能。在大多数业务情况下,消费者消费的数据一般会从内存(页面缓存,从系统内存中分)中获取,这比在磁盘上读取肯定要快的多。一般来说运行Kafka的JVM不需要太多的内存,剩余的系统内存可以作为页面缓存,或者用来缓存正在使用的日志片段,所以我们一般Kafka不会同其他的重要应用系统部署在一台服务器上,因为他们需要共享页面缓存,这个会降低Kafka消费者的性能。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vsyB4Z1r-1686193157452)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image012.jpg)]image.png

网络

网络吞吐量决定了Kafka能够处理的最大数据流量。它和磁盘是制约Kafka拓展规模的主要因素。对于生产者、消费者写入数据和读取数据都要瓜分网络流量。同时做集群复制也非常消耗网络。

CPU

Kafka对cpu的要求不高,主要是用在对消息解压和压缩上。所以cpu的性能不是在使用Kafka的首要考虑因素。

总结

我们要为Kafka选择合适的硬件时,优先考虑存储,包括存储的大小,然后考虑生产者的性能(也就是磁盘的吞吐量),选好存储以后,再来选择CPU和内存就容易得多。网络的选择要根据业务上的情况来定,也是非常重要的一环。

相关文章:

一、kafka入门

Kafka入门 为什么要用消息中间件&#xff1f; 异步处理 场景说明&#xff1a;用户注册后&#xff0c;需要发注册邮件和注册短信。传统的做法有两种1.串行的方式&#xff1b;2.并行方式。 串行方式&#xff1a;将注册信息写入数据库成功后&#xff0c;发送注册邮件&#xff…...

公司新来一00后,真让人崩溃...

2022年已经结束结束了&#xff0c;最近内卷严重&#xff0c;各种跳槽裁员&#xff0c;相信很多小伙伴也在准备今年的金九银十的面试计划。 在此展示一套学习笔记 / 面试手册&#xff0c;年后跳槽的朋友可以好好刷一刷&#xff0c;还是挺有必要的&#xff0c;它几乎涵盖了所有的…...

(1Gb)S28HS01GTGZBHA030/ S28HS01GTGZBHV033/ S28HS01GTGZBHA033 FLASH - NOR闪存器件

产品简介&#xff1a; Infineon 带有HyperBus™的S26HSxT以及S26HLxT Semper™闪存是一种高性能、安全可靠的NOR闪存解决方案。 这些组件集成了关键的安全功能&#xff0c;用于汽车、工业、通信等行业的各种应用。S26HSxT和S26HLxT Semper闪存采用HyperBus接口&#xff0c;符…...

苹果服务端通知v2处理(AppStore Server Notifications V2)

苹果服务端通知v2处理 关键词: App Store Server Notifications V2、Python源码、苹果订阅、JWS、x5c、JSON WEB TOKEN 背景 最近要接入苹果订阅功能&#xff0c;调研后发现订阅生命周期内的状态变更是通过苹果服务端通知返回的(什么时候普通内购也能加上减少掉单的概率)&am…...

matlab 道路点云路缘石边界提取

目录 一、功能概述1、算法概述2、主要函数3、参考文献二、代码实现三、结果展示四、参考链接一、功能概述 1、算法概述 1、对于扫描线上的每个点,该函数计算这三个特征。 高差特征——计算一个点周围的标准偏差和高度最大差。路缘石点的标准偏差和高度差必须分别在指定的Heig…...

二叉树详解:带你掌握二叉树

目录 前言1. 树型结构1. 1 树的概念1.2 树的特点1.3 树的相关术语 2. 二叉树&#xff08;binary tree&#xff09;2.1 二叉树的概念2.2 二叉树中的特殊树2.2.1 满二叉树2.2.2 完全二叉树 2.3 二叉树的性质 3. 二叉树的遍历3.1 前序遍历3.2 中序遍历3.3 后序遍历3.4 层序遍历 总…...

LNMP网站框架搭建(编译安装)

目录 一、Nginx的工作原理 工作进程&#xff1a; 二、Nginx编译安装安装 三、mysql的编译安装 四、php的编译安装 验证PHP与nginx的是否连接 验证lnmp的是否搭建成功 五、部署 Discuz&#xff01;社区论坛 一、Nginx的工作原理 php-fpm.conf 是控制php-fpm守护…...

详解Servlet API

目录 前言 HttpServlet HttpServletRequest 代码实例 打印请求信息 通过URL中的queryString进行传递。 通过post请求的body&#xff0c;使用form表单传递 通过POST 请求中的 body 按照 JSON 的格式进行传递 HttpServletResponse 核心方法代码实例 设置状态码 自动刷…...

【小白教程】Docker安装使用教程,以及常用命令!

【小白教程】Docker安装使用教程&#xff0c;以及常用命令&#xff01; - 带你薅羊毛最近调试Docker内容&#xff0c;顺手记录一下&#xff0c;我常用的几个命令&#xff01;这里总结一下&#xff0c;方便自己也同时方便大家使用&#xff01; 内容慢慢完善更新&#xff01;如有…...

TypeScript基础

TS编译运行 ts不是在终端运行&#xff0c;是一门中间语言&#xff0c;最终编译为js运行。 手动编译 // 1. ts编译为js npm i -g typescript // 查看版本 tsc -v// 2. ts直接运行&#xff0c;主要用来查看是否报错 npm i -g ts-node // 查看版本 ts-node -v1.手动编译ts代码 …...

QML学习二:Doxygen为qml工程生成代码文档

效果如下: 设置后能够支持.js和.qml文档。 QML学习二:Doxygen为工程生成注释文档 前言一、安装doxyqml二、Doxygen设置1.文档目录设置2.文档目录设置三、添加注释总结前言 好的代码必须配一个好的文档说明,方便以后维护以及学习。 前提条件: 1.安装好了Doxygen代码生成工…...

Vue 有哪些经典面试题?

前言 下面总结了vue的一些经典的面试题&#xff0c;希望对正在找工作面试的小伙伴们提供一些帮助&#xff0c;我们废话少说直接进入整体、 简述一下什么是MVVM模型 MVVM&#xff0c;是Model-View-ViewModel的简写&#xff0c;其本质是MVC模型的升级版。其中 Model 代表数据模…...

pandas速学-DataFrame

一、理解DataFrame 他是一个表格结构&#xff1a;DataFrame 是一个表格型的数据结构 他是有序的&#xff0c;不同值类型&#xff1a;它含有一组有序的列&#xff0c;每列可以是不同的值类型&#xff08;数值、字符串、布尔型值&#xff09;。 他可以被看做一个由series组成的…...

在任务与执行策略之间的隐性耦合

我们已经知道&#xff0c; Executor 框架可以将任务的提交与任务的执行策略解耦开来。就像许多对复杂过程的解耦操作那样&#xff0c;这种论断多少有些言过其实了。虽然Executor 框架为制定和修改执行策略都提供了相当大的灵活性&#xff0c;但并非所有的任务都能适用所有的执行…...

Spring Cloud Alibaba Nacos 构建配置中心

构建配置中心 新建命名空间 登录 Nacos 面板&#xff0c;依次点击左侧菜单栏【命名空间→新建命名空间】、填写命名空间名和描述信息&#xff0c;点击【确定】&#xff1a; 新建配置文件 依次点击左侧菜单栏【配置管理→配置列表】、切换到指定命名空间【此处为 shop】、点击…...

华为OD机试真题 Java 实现【猴子爬山】【2023 B卷 100分】,附详细解题思路

一、题目描述 一天一只顽猴想去从山脚爬到山顶,途中经过一个有个N个台阶的阶梯,但是这猴子有一个习惯: 每一次只能跳1步或跳3步,试问猴子通过这个阶梯有多少种不同的跳跃方式? 二、输入描述 输入只有一个整数N(0<N<=50)此阶梯有多少个阶梯。 三、输出描述 输…...

【19JavaScript for 循环】JavaScript for 循环:掌握重复执行的关键

JavaScript for 循环 在JavaScript中&#xff0c;for循环是一种常用的循环结构&#xff0c;它允许您重复执行一段代码&#xff0c;达到循环的目的。 基本语法 for (initialization; condition; iteration) {// 要执行的代码}for循环由以下几个关键部分组成&#xff1a; init…...

MySQL学习(联结,组合查询,全文本搜索)

联结 SQL最强大的功能之一就是能在数据检索查询的执行中联结表&#xff1b; 关系表 为什么要使用关系表&#xff1f; 使用关系表可以储存数据不重复&#xff0c;从而不浪费时间和空间&#xff1b;如果有数据信息变动&#xff0c;只需更新一个表中的单个记录&#xff0c;相关…...

Nautilus Chain:独特且纯粹的创新型 Layer3

以 Layer3 架构为主要特点的模块化公链 Nautilus Chain 即将在近期上线主网&#xff0c;这也进一步引发了行业关于 Layer3 的讨论。 实际上&#xff0c;在2022年以太坊的创始人 Vitalik 提出了三大目标&#xff1a;Layer2 用于扩展&#xff0c;Layer3 用于定制功能&#xff0c;…...

十六、立方体贴图(天空盒)

第一部分 概念&#xff1a; 1) 引用 OpenGL ES 立方体贴图本质上还是纹理映射&#xff0c;是一种 3D 纹理映射。立方体贴图所使的纹理称为立方图纹理&#xff0c;它是由 6 个单独的 2D 纹理组成&#xff0c;每个 2D 纹理是立方图的一个面。 立方图纹理的采样通过一个 3D 向量…...

UniAD:实现多类别异常检测的统一模型

来源&#xff1a;投稿 作者&#xff1a;Mr.Eraser 编辑&#xff1a;学姐 论文标题&#xff1a;用于多类异常检测的统一模型 论文链接&#xff1a;https://arxiv.org/abs/2206.03687 论文贡献&#xff1a; 提出UniAD&#xff0c;它以一个统一框架完成了多个类别的异常检测。 …...

Java 面试 | tcp ip http https(2023版)

文章目录 HTTP&HTTPS1、Http和Https的区别?2、什么是对称加密与非对称加密3、客户端不断进行请求链接会怎样?DDos(Distributed Denial of Service)攻击?4、GET 与 POST 的区别?5、什么是 HTTP 协议无状态协议?怎么解决Http协议无状态协议?6、Session、Cookie 与 Appl…...

全志V3S嵌入式驱动开发(音频输出和音频录制)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 之前在芯片公司的时候&#xff0c;基本没有看过音频这一块&#xff0c;只知道有个alsa框架这么个知识点。要驱动音频&#xff0c;需要两部分&#…...

使用RP2040自制的树莓派pico—— [2/100] HelloWorld! 和 点亮LED

使用RP2040自制的树莓派pico—— [2/100] HelloWorld! 和 点亮LED 开发环境HelloWorld!闪烁 LED 灯代码 由于比较简单就放在一起写了 开发环境 软件&#xff1a;Thonny HelloWorld! 要想使串口打印HelloWorld&#xff01; 只需要一行代码 print("HelloWorld!")保…...

康耐视In-Sight2800相机的使用

In-Sight2800相机注册分类程序 一、登录相机 二、图像导入 IS相机支持拍摄图像和从文件中导入图像 如选择从文件中导入图像&#xff0c;文件夹选择位置在页面左下方&#xff0c;如下图 三、注册分类器 在检查模块注册分类器&#xff0c;注册图像需要一张一张去学习&#x…...

驱动开发:内核封装WFP防火墙入门

WFP框架是微软推出来替代TDIHOOK传输层驱动接口网络通信的方案&#xff0c;其默认被设计为分层结构&#xff0c;该框架分别提供了用户态与内核态相同的AIP函数&#xff0c;在两种模式下均可以开发防火墙产品&#xff0c;以下代码我实现了一个简单的驱动过滤防火墙。 WFP 框架分…...

python+vue校园快递代取系统的设计与实现3i0v9

开发语言&#xff1a;Python 框架&#xff1a;django/flask Python版本&#xff1a;python3.7.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;PyCharm 本系统名为“基于vue快递代取系统”&#xff0c;系统主要适用于毕业设计&#xff0c;不…...

C 语言详细教程

目录 第一章 C语言基础知识 第二章 数据类型、运算符和表达式 第三章 结构化程序设计 第四章 数组 第五章 函数 第六章 指针 第七章 结构体类型和自定义类型 第八章 编译预处理 第九章 文件 说明&#xff1a;本教程中的代码除一二三个之外&#xff0c;都在https://ligh…...

函数重载与缺省参数

目录 一 缺省参数 缺省参数分半缺省和全缺省。 2&#xff0c;半缺省参数 3&#xff0c;全缺省参数 4.缺省参数的注意事项 二 函数重载 2 .函数重载参数类型不同强调 三 函数名修饰规则 一 缺省参数 1.缺省参数特性(备胎) 缺省参数是指我们定义函数时有给缺省值的参数&#xf…...

线程引入的开销

单线程程序既不存在线程调度&#xff0c;也不存在同步开销&#xff0c;而且不需要使用锁来保证数据结构的一致性。在多个线程的调度和协调过程中都需要一定的性能开销&#xff1a;对于为了提升性能而引入的线程来说&#xff0c;并行带来的性能提升必须超过并发导致的开销。 上下…...

做网站公司实习日记/百度首页优化

据华夏时报引述自安居客和经纬的数据指&#xff0c;肇庆的房价已出现较大跌幅&#xff1b;此前另有媒体报道指广州等城市的房价却出现上涨&#xff0c;这显示出不同城市的房价开始出现分化&#xff0c;柏铭科技认为三四五线城市的房地产风险较大。据经纬的数据&#xff0c;肇庆…...

优秀b2c网站设计/网站内部seo优化包括

http://www.sina.com.cn 2004年11月07日 07:54 新浪科技微软CEO鲍尔默称Linux要比人们想象的成本更高&#xff0c;而且安全性也较低(新浪科技配图)新浪科技讯 美国东部时间11月6日(北京时间11月7日)消息&#xff0c;作为对微软“获得真相”等宣传活动的回应&#xff0c;Novell进…...

积分兑换商城网站建设/优化清理大师

Java设计模式 —— 单例模式(Singleton) 单例模式最初的定义出现于《设计模式》&#xff08;艾迪生维斯理, 1994&#xff09;&#xff1a;“保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。” 定义 Java中单例模式定义&#xff1a;“一个类有且仅有一个实例…...

wordpress文章公众号/企业营销策划书范文

win7系统打开本地连接发现出现很多多余的本地连接&#xff0c;怎么删除呢&#xff1f;本地连接是电脑中最常见的图标之一&#xff0c;创建本地连接可以将计算机连接到局域网&#xff0c;实现上网&#xff0c;电脑中必须要有本地连接。正常情况下&#xff0c;我们只需要一个本地…...

重庆装修房子可以提取公积金吗/优化合作平台

Java语言中try-catch-finally的执行顺序 最近遇到一道Java编程题目&#xff0c;让根据以下程序写输出&#xff1a; public static int func (){ try{ return 1; }catch (Exception e){ return 2; }finally{ return 3; } } 按着之前的想法&#xff0c;finally肯定会执行&#…...

西峡县住房和城乡建设局网站/网站seo哪家公司好

5G渐渐进入大众市场的今天&#xff0c;很多新的概念和疑惑也出现在人们脑海中&#xff0c;对于5G为何要争夺6GHz频段、5.5G为何物等等问题&#xff0c;小伙伴曾经好奇过吗&#xff1f;小编为大家整理了这篇科普性质的文章&#xff0c;希望能给大家增长知识。5G网络的6GHz争夺战…...