Kafka:可靠!可靠!还是xx的可靠!

详解Kafka 3.0 稳定版新特性 Kafka 2.8.0正式发布了KRaft的先行版,并且支持在KRaft模式下的部署和运行。KRaft模式下的Kafka可以完全脱离Zookeeper运行,使用自己的基于Raft算法实现的quorum来保证分布式Metadata的一致 阅读详情

前言

Kafka作为目前主流的消息中间件来说,内部有许多保证消息可靠的机制。消息丢失在线上生产环境来说,造成的影响可大可小,本篇将介绍Kafka保障可靠性的机制。

读完本篇你将会收获:

复制功能

复制功能是Kafka架构的核心,复制功能使得Kafka即便是在个别节点失效之后,仍然能保证对外提供正常的服务。

复制保证了Kafka的可用性和持久性。

复习一下:每个主题有多个分区,每个分区有多个副本。副本是被保存到broker上面。

分区副本种类

首先要明确2个概念,首领副本和跟随着副本,其实就是跟Zookeeper里面讲的Leader和Follower一样的概念。

  • 首领Leader副本:每个分区都有一个首领副本。所有的生产者请求和消费者请求都会经过这个副本。主要是为了保证一致性。跟zookeeper中的leader是一个道理。
  • 跟随者Follower副本:跟随者副本不会处理请求,他会从首领副本里面获取数据同步到自己这边。他的作用是当首领崩溃的时候,其中的一个跟随者副本会提升为新首领。

Kafka根据副本同步的情况,分成了3个集合:

  • AR(Assigned Replicas):包括ISR和OSR
  • ISR(In-sync Replicas):ISR是指和首领副本Leader保持同步的副本 集合,可以被认为是可靠的数据。
  • OSR(Out-Sync Replicas):就是失去了和Leader副本同步的副本集合。

可以把这些集合理解为一个池子,只有与首领同步的副本,才可以放进池子里面。

同步流程

首领会去检查哪个跟随者的状态是和自己是一致的。与其说是首领去询问跟随者,其实更像是让跟随者向首领汇报自己的状态同步信息。( poll),跟随者副本会向首领副本发送同步请求来进行同步。

跟随者会在有新消息到达时尝试从首领那里复制消息。

请求信息里面包括了跟随者想要获取消息的偏移量,而且这些偏移量总是有序的。跟随者和首领通过偏移量来检查数据的一致性。

请求类型

上面讲了同步流程是通过Fllower向Leader发送同步请求来进行的,下面讲一下Kakfa的其他请求类型:

  • 元数据请求
  • 生产请求
  • 同步请求

元数据请求

解决客户端去找分区首领所在哪个broker的问题

元数据请求里面包含了:

  • 客户端感兴趣的主题列表。
  • 服务器端的响应消息里指明了这些主题所包含的分区,
  • 每个分区都有哪些副本,
  • 以及哪个副本是首领。

有了这些元数据,客户端就知道该向哪个broker发送生产请求或者获取请求。

一般客户端都会把这些信息缓存起来。时不时会通过发送元数据请求来刷新这些信息。

当发生分区变化,比如新的broker加入,那么部分分区就会被分配到新的broker里,可能会有首领。

此时如果客户端还拿着旧的元数据信息,那么就会发生请求失败,返回一个非首领错误。

客户端在重试之前,会先发送元数据请求,去同步一下自己的元数据信息。然后再进行重试。

总结:其实就是Redis Clusters里面的全局key映射关系

生产请求

生产者发送的请求,可以理解为Kafka写入消息请求

如果之前有配置那个acks,那么首先会进行一个写入消息检查。

包含首领副本的broker收到生产请求后,会对请求做一些验证:

  • 对方是否具有主题的写入权限。
  • 请求里面包含的acks值是否有效。
  • 如果是acks=all,是否有足够多的同步副本保证消息已经被写入。

之后,消息会被写入本地磁盘。

在消息被写入分区的首领之后,broker开始检查acks配置参数,如果是0,或者是1,就立客返回响应。如果是all。那么会先把请求保存到一个叫做炼狱的缓冲区里,直到首领发现所有跟随者副本都复制了消息,响应才会返回给客户端。(ZAB里面是过半就行,这里要全部)

获取请求

获取请求解决的是跟随者跟首领数据一致性的问题

跟随者向首领发出请求,请求同步数据一致性。

跟随者会指定某主题下的某分区的偏移量一个区间的消息,让首领发送给他。

首领在收到请求后,会先检查请求是否有效,比如偏移量是否在分区上存在等等。

客户端可以指定broker最多可以从一个分区里面返回多少数据,因为服务器返回数据给我客户端,我客户端需要预分配一些内存空间来存储这些消息的。

如果是合法的偏移量,那么broker就会按照获取请求上面的要求,从分区里读取消息,然后返回给客户端。

Kafka使用零复制技术向客户端发送消息。 其实就是直接把消息从文件里发送到网络通道,不需要经过任何中间缓冲区。

一般来说,其他的数据库会在把数据发送给客户端之前,会把他们保存在本地缓存里。

同步副本的条件

分区首领是肯定是同步副本,因为只有同步副本才能被选举为首领。

对于跟随者副本来说,需要满足一下几个条件,才能被认为是同步的副本

  • 副本与Zookeeper之间有一个活跃的会话Session,也就是说他的心跳机制是正常的。
  • 过去10。s(可配置)内从首领那里获取过消息
  • 过去10s(可配置)内从首领那里获取过最新的消息。确保消息的一致性。

失败重试

跟随者副本先请求同步消息1,接着消息2、消息3……

如果没有收到这3个请求消息的响应,那么他不会发送第四个请求消息。(类似TCP中的ACK机制)

首领是通过查看每个跟随者请求的最新偏移量来确定每个跟随者的复制进度。

如果跟随者在10s内没有请求任何信息,或者是10s内没有请求最新的数据,那么就会被认为不同步。

当首领宕机时,这些不同步的副本并不会被选举为新首领。

这个10s是一个参数来设置的,replica.lag.time.max.ms

首选首领

在Kafka中,首领,我们分为当前首领和首选首领。字面意思,当前首领就是整个集群中当前状态下的首领,而首选首领他的目的是为了在选举的时候把首选首领选举为当前首领。

在创建主题的时候选定的首领就是分区的首选首领。

auto.leader.rebalance.enable被设置为true。表示他会开启自动的首领选举。

unclean.leader.election.enable设置为true表示它会检查首选首领是不是当前首领,如果不是,并且该副本是同步的,那么就会触发首领选举,让首选首领称为当前首领。

在后面broker配置中会讲解开启不完全的首领选举是如何保障Kafka的高可用性。

broker配置

这里讲的都是关于Kafka消息存储的可靠性,主要是由3个配置参数

复制系数

默认复制系数是3。

假设复制系数是​,那么即使是在​个broker失效的情况下,任然能对外提供正常服务。

复制系数意味着对分区进行备份多少份数据,假设分区副本为6个,复制系数是3,那么就会有18份副本。通过备份来获得高可用性。

不完全的首领选举

完全和不完全,指的是选举这个过程,而不是首领。

数据安全性和高可用性的一种取舍方案。

当一个分区首领不可用的时候,其中的一个同步副本就会被选举为新的分区首领。如果在选举的过程中,写入的数据能够被同步到所有的同步副本中,那么就称这个选举是完全的。

那为什么会出现不完全的选举呢?

  • 分区有3个副本,其中的两个跟随者副本不可用了(比如两个broker发生崩溃),此时生产者还在对首领副本写入消息,并且写多少,他就确认多少,因为他是当前唯一一个可用的同步副本。此时首领副本崩溃了,并且那两个跟随副本其中一个启动了,它就会称为分区里的唯一不同步副本。
  • 分区有3个副本,其中2个跟随者副本因为网络的原因,尽管已经很努力地同步了,还是未能跟首领副本的数据保持同步,此时首领副本裂开了。那么此时2个分区副本都是不同步的副本。

核心就是在于,分区首领在崩溃了之后,其他的副本是不同步的。

这种不同步的副本可不可以被选举为首领副本呢?

如果不可以!

那么可能就会有一段时间,导致Kafka无法对外提供服务,因为他要等不同步副本一直转化为同步副本为止。

他只有一个办法,就是等之前的那个首领副本恢复。所以他这种不可用状态可能会持续很久,他的高可用性是非常低的。

如果可以!

意味着我们会面临丢失消息的风险,因为我们选举的是不同步的副本,有一些消息存在于首领副本的,我们就无法恢复了。

主要的还是看场景吧,如果是用户点击网页这些不重要的消息,丢失一点倒是没关系。

unclean.leader.election.enable设置为True,就是允许不同步的副本称为首领,也就是不完全的选举。

对于银行这种系统来说,宁愿一个小时,甚至一天都不对外提供服务,也不可能冒着丢失消息的风险。

最少同步副本

最少同步副本,跟他很像的有可用的同步副本

一般我们来说,只有消息被写入到所有同步副本之后,才认为是已提交的。这样的消息才能够被消费者读取到。

假设我们的复制系数是3,正常情况下,我们一个主题会有3个副本。但是如果其他2个broker都宕机了,那么此时可用的同步副本就只有1个。如果这个副本也宕机了,那么消息就丢失了。

我们想要确保数据最少写入到多少个副本,就需要设置min.insync.replicas这个参数。如果当前集群中可用的同步副本小于我们这个最少同步副本,那么就会直接抛异常,拒绝生产者的请求。但是处理读请求。

可靠的生产者

配置的话主要是的是配置acks参数

即便我们禁止不完全选举、调高复制系数。也有可能会面临消息丢失的情况。

假设有3个副本,akcs=1,代表只需要在首领分区提交,就认为是消息被提交。此时有一个新的消息提交到首领分区中,并且处理完了。但是其他2个跟随者副本还没有来得及同步,首领分区宕机了。但是这2个跟随者会人为自己是同步副本,因为同步副本到非同步副本状态的转换是需要时间的。当新的分区首领选上之后,从首领角度来说是没有丢失消息,但是从生产者的角度来说是丢失了消息的。

还有一种情况就是,学聪明了,把acks=all,让所有的同步副本都同步才确认。生产者发送消息,首领副本裂开了。生产者会得到一个“首领不可用”的响应。如果生产者没有正确地处理这个错误,也没有重试发送消息直到发送成功,那么消息也有可能丢失。这问题的关键在于,生产者有没有对写入失败的消息,进行正确的处理。这个是在代码层面可以解决的问题。

生产者发送确认机制

其实就是acks的设置

这里就不过多重复了,可选配置那里有讲。详细的可以看Kafka:生产者全解 - 掘金 (juejin.cn) 往期文章,里面有非常详细的介绍。

生产者重试

有的错误,生产者是可以自动处理,有的错误需要开发者在代码层进行处理。

错误也分为重试可解决的错误和重试不可解决的错误。

如果我们追求的是不丢失任何消息这个级别,那么我们尽可能让生产者遇到可重试错误情况下,尽量保持重试。像首领选举和网络分区这类问题,可能很快就会得到解决,让生产者保持重试,就不需要额外地区解决这些问题。

重试次数这个就要我们自己定义,而且我们捕获到了异常之后,是选择直接重试,还是说把异常记录下来,一系列操作,都是可以在代码层解决地。

但是要注意的是,重试发送同一个失败过的消息是具有一定风险的,比如我正在处理你前面那个消息,我可能因为一些原因导致处理有点慢了,生产者那边认为超时了,再重试发送一个过来。此时相当于对Kafka写入了2个相同的消息,会出现消息重复消费的问题。

怎么解决呢?一般我们可以在消费接口那里设计为具有幂等性的,既然我们无法从问题的根源解决,那么就在下游进行解决问题。

具体怎么做就是在消息体里面携带消息的唯一标识符,具有单调递增性,通过Mysql主键锁去实现接口的幂等性。

额外的错误处理

有的错误,生产者是可以自动处理,有的错误需要开发者在代码层进行处理。

错误也分为重试可解决的错误和重试不可解决的错误。

如果我们追求的是不丢失任何消息这个级别,那么我们尽可能让生产者遇到可重试错误情况下,尽量保持重试。像首领选举和网络分区这类问题,可能很快就会得到解决,让生产者保持重试,就不需要额外地区解决这些问题。

重试次数这个就要我们自己定义,而且我们捕获到了异常之后,是选择直接重试,还是说把异常记录下来,一系列操作,都是可以在代码层解决地。

但是要注意的是,重试发送同一个失败过的消息是具有一定风险的,比如我正在处理你前面那个消息,我可能因为一些原因导致处理有点慢了,生产者那边认为超时了,再重试发送一个过来。此时相当于对Kafka写入了2个相同的消息,会出现消息重复消费的问题。

怎么解决呢?一般我们可以在消费接口那里设计为具有幂等性的,既然我们无法从问题的根源解决,那么就在下游进行解决问题。

具体怎么做就是在消息体里面携带消息的唯一标识符,具有单调递增性,可以通过Mysql主键锁去实现接口的幂等性。

可靠的消费者

消费者能够读取到的消息,都是被写入到全部可用同步副本的。消息已经是具有一定的可靠性的。而消费者就是要解决如何消费消息是可靠的问题。

消费者可靠性配置

  • group.id,这个是跟消费者群组有关的,同一个group.id的消费者,相当于在同一个消费者群组。注意的是,同一个群组下的消费者,每个消费者只能读到同一个主题下的部分数据,如果想要每个都读取到全部消息,则需要设置不同的group.id。
  • auto.offset.reset,当发生没有偏移量可提交的时候,比如消费者第一次启动时,或者请求的偏移量在broker上不存在。就会采取latest或者是earliest。earliest代表从头开始读,latest代表从分区末尾的开始读。earliest可能会出现消息重复的问题,但是这个还是比较好解决的,通过接口幂等性等,最差也就是耽误一段时间。但是采取latest就会面临丢失消息的风险,显然后者引发的问题严重性更大。
  • enable.auto.commit,手动还是自动提交偏移量。自动的话,就全部交给kafka中轮询来操作。手动的话就更加细,消息更可靠。

消费者重试

除了生产者对消息有重试机制,消费者要有重试机制,来确保消息的可靠性。

对于消费者来说,重试的是对偏移量的提交。

一次轮询,代表处理一个批次的消息,在这个批次里面,并不是所有的消息都会被完全处理。比如中途有一个写入DB的消息,此时DB处于不可用的状态。现在我想要稍后再去重试这个消息。但是我不能去提交比他后的消息偏移量,如果我提交了,那么就代表该偏移量之前的消息,我都人为处理成功了。这个跟TCP中ACK确认机制非常像。

怎么解决呢?这里我们假设都是遇到可重试的错误,不可重试的错误就没办法通过重试机制来解决。

  • 第一种方式,我们还是提交最后一个处理成功的偏移量。但是我们会把刚刚处理不成功的消息,保存到一个缓冲区里面。然后调用消费者的wudepause方法来确保其他的轮询不会返回数据。
  • 第二种方式,把处理不成功的消息,丢到一个特殊的主题,然后用一个消费者去单独处理这些主题的消息。其实说白了就是一个死信队列。

kafka3.1集群搭建(kraft模式) 导读 我公司有一个项目现场那边说zk有漏洞,所以我们就打算部署一套不依赖zookeeper的kafka高版本集群,也就是Kraft模式。 Apache Kafka3.0.0的发布为kafka彻底去掉Zookeeper铺平了道路,Kafka Raft 支持元数据主题的快照以及自我管理,而3.1.0版本在2022.1.24发布,对3.0.0版本又修改了。我们先来初步体验一下KRaft的入门。 KRaft简介 Kafka的共识机制KRaft,仍然处于预览机制。未来KRaft将作为Apache Kafka的 阅读详情

相关推荐

Kafka 启动时报Error: VM option ‘UseG1GC‘ is experimental and must be enabled via -XX:+UnlockExperimental

在Kylin Server v10 arm架构的服务器上安装Kafka时遇到启动失败的问题,错误信息提示'UseG1GC‘ is experimental and must be enabled via -XX:+UnlockExperimental'。经过排查,发现该问题由配置文件中的一项参数引起。删除kafka-run-class.sh中的-XX:+UseG1GC配置后,重启Kafka,问题得到解决,顺利启动。

禅与代码的艺术 1034

Kafka的稳定性

Kafka的消息传输保障机制非常直观。当producer向broker发送消息时,一旦这条消息被commit,由于副本机制(replication)的存在,它就不会丢失。但是如果producer发送数据给broker后,遇到网络问题而造成通信中断,那producer就无法判断该条消息是否已经提交。虽然kafka无法确定网络故障期间发生了什么,但是producer可以retry多次,确保消息已经正确传输到broker中,所以目前kafka实现的是at least once。 幂等性 所谓幂等性,就是对接口的多

... 570

Kafka-Eagle、Kafka-UI的安装及使用详细教程

Kafka-Eagle 框架可以监控 Kafka 集群的整体运行情况,在生产环境中经常使用。在生产过程中,想创建topic、查看所有topic、想查看某个topic 想查看分区等,都需要写命令,能不能有一个图形化的界面,让我们操作呢?

weixin_64860388的博客 3418

Kafka 实战 - Kafka-Kraft模式

总之,Kafka-Kraft 模式为 Kafka 集群提供了一种更为简洁、高效的元数据管理方案,简化了架构、提升了性能,并增强了容错性。在实战中,应充分考虑其部署、配置、迁移、监控与运维的特点,结合业务需求制定合适的策略,确保 Kafka 集群在 KRaft 模式下的稳定、高效运行。KRaft 模式旨在替代传统的依赖 ZooKeeper 的元数据管理模式,提供更为简洁、高效且高可用的 Kafka 集群管理方案。:为 KRaft 模式下的 Broker 网络通信设置专用的内网环境,减少网络延迟和干扰。

qq_33240556的博客 1995

【Kafka】Kafka-Eagle 和 Kafka-UI 的安装使用

Kafka Eagle 提供了完善的管理页面,可以监控 Kafka 集群的整体运行情况,很方便的去管理和可视化 Kafka 集群的一些信息,例如 Broker 详情、性能指标趋势、Topic 集合、消费者信息等,在生产环境中经常使用。

2403_86969226的博客 3304

深入Kafka源码01: 入门、Kafka2.0源码搭建(Gradle配置)

1、基本概念 http://kafka.apache.org/ kafka是Scala开发的,多分区、多副本且基于zookeeper协调的分布式消息系统 定位:分布式流式处理,高吞吐、可持久化、可水平扩展、支持流式处理 2、源码环境搭建 2.1 环境准备: 环境:jdk1.8 scala2.12(2.13上坑较多)kafka2.0 gradle4.9 (由于坑太多,已换为gradle4.9,以后再也不敢用新版的坑了,踩坑花了不少时间) gradle所有版本下载:https://s..

Big_data_implicit_ 907

Kafka-kraft模式部署与使用

Kafka-kraft模式部署与使用

虽非技冠群英首,愿与同道共长歌; 大鹏一日同风起,扶摇直上九万里; 2780

【Kafka】Kafka Record for partition topic at offset xx is invalid, cause: Record corrupt

1.背景 java.lang.Exception: org.apache.kafka.common.KafkaException: Record for partition topic_lcc-8 at offset 38264417 is invalid, cause: Record is corrupt (stored crc = 499639838, computed crc = 3050587176) at org.apache.flink.streaming.runtime.tasks.Sou

九师兄 2392

kafka:Kafka ISR机制深度解析:如何构建高可靠消息系统

容量规划每个Partition的Segment数控制在100以内保留时间至少为最大处理延迟的3倍参数调优# 高频交易场景log.segment.delete.delay.ms=30000 # 避免频繁删除log.retention.check.interval.ms=300000 # 5分钟检查# 数据分析场景监控关键点Segment平均年龄超过保留时间的50%需预警清理线程CPU持续高于70%需要扩容消息过期机制体现了Kafka"存储即服务"的设计哲学,理解其底层实现可以帮助开发者在。

weixin_43290370的博客 1320

Kafka 之 Broker 配置,含各大版本0.xx、1.xx、2.xx、3.xx

Kafka 集群由多个 Broker 组成。每个 Broker 都是一个独立的服务器,它负责管理一个或多个主题的分区。Broker 接收来自生产者的消息,并将消息存储在消息队列中。同时,它还处理来自消费者的请求,并将消息发送回消费者。每个分区都会被分配到一个 Broker 上,并在该 Broker 上进行复制,以确保数据的高可用性和冗余性。broker.idlog.dirs本文将详细论述主题级别配置和默认值。

流华追梦的专栏 2653

【Kafka】Kafka ERROR [ConsumerFetcherThread-console-consumer], Error for partition [xx,5] to broker 10

1.背景 kafka环境页面上看着正常,如下 在控制台里发数据也正常,但是消费数据的时候如下 [root@1 bin]# ./kafka-console-consumer.sh --topic topic_lcc --zookeeper xxx:2181 {metadata.broker.list=xxx:19093, request.timeout.ms=30000, client.id=console-consumer-1552, security.protocol=PLAINTEXT} [20.

九师兄 910

kafka启动失败:Error: VM option ‘UseG1GC‘ is experimental and must be enabled via -XX:+UnlockExperimental

中间件的安装,熟悉的话10来分钟启动完成。但是偶尔也会有坑,各种看起来毫无问题的坑。以下问题解决过程分享记录如下: Error: VM option ‘UseG1GC’ is experimental and must be enabled via -XX:+UnlockExperimental。 Error: Could not create the Java Virtual Machine… 首先说安装环境: **云服务器,麒麟v10服务器版,arm版本(aarch64)**安装kafka。zooke

一只赤脚行走的猪的博客 1万+

【kafka】kafka ClusterId 不匹配问题 The Cluster ID xx doesn‘t match stored clusterId Some

1.概述 一个环境kafka启动报错。 默认情况下broker.id值为-1。Kafka broker的id值必须大于等于0时才有可能正常启动,但是并不是只能通过配置文件config/server.properties来修改这个值,还可以通过meta.properties文件或者自动生成功能来实现broker的id值的设置。 比如:meta.properties文件中的内容参考如下: version=0 broker.id=1 meta.properties文件中记录了与当前Kafka版本对应的一个ve

九师兄 6233

springboot 2.XX集成kafka

springboot 2.2.6.RELEASE集成kafka 1、springboot 原生集成(相同版本) pom依赖 <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> </dependency> <dependency> <group

爱飞的小飞的博客 562

超详细 VMware Horizon 虚拟桌面VDI安装步骤

主要的目的是模拟生产环境中的共享存储。自动桌面相当于共享电脑,大家使用同一个虚拟机,对虚拟机的修改都放在用户的配置文件中,RDS桌面池相当于共享的服务器,可以多人同时连接到服务器上。1:之前已经建立好了NFS的存储,这部分配置好后,以后的虚拟机可以安装到NFS的存储中。2: 使用Composer发布系统可以解决SID,机器名冲突的问题,更重要的可以节约磁盘空间,发布的所有系统可以访问一块磁盘。26: 域选择我们之前建立的域,用户名我输入的是管理员,可以在AD域新建用户点击查找,我这里用的是管理员。

vv12345的博客 1万+

3D Slicer5.7在win11下的源码编译安装

本博客主要参考官方安装文档以及部分优快云的博客,部分内容的书写会直接参考官方文档的内容。

Topsort的博客 4761

kafka启动报错-XX:+CMSClassUnloadingEnabled -XX:+CMSScavengeBeforeRemark -XX:+DisableExplicitGC -

启动kafka的时候报错,查看错误log显示如下 Java HotSpot™ 64-Bit Server VM (25.152-b16) for linux-amd64 JRE (1.8.0_152-b16), built on Sep 14 2017 02:16:14 by “java_re” with gcc 4.3.0 20080428 (Red Hat 4.3.0-8) Memory: 4...

qq_32736999的博客 1938

解码运动想象:BCI Competition IV 2a数据集实战指南

本文提供了BCI Competition IV 2a数据集的实战指南,详细解析了该经典运动想象脑电数据集的结构、文件格式与实验范式。通过MNE-Python等工具,逐步演示了从原始信号读取、预处理(通道选择、滤波、分段)到特征提取(CSP、频带功率)和模型训练(LDA、SVM)的完整流程,并强调了受试者独立评估的重要性,为BCI研究者提供了可复现的入门与进阶路径。

weixin_29304985的博客 367

终于有人把 kafka 原理说清楚了!

Java技术栈www.javastack.cn关注阅读更多优质文章本文授权转自公众号:17coding技术博客为什么需要消息队列周末无聊刷着手机,某宝网APP突然蹦出来一条消息“为了回馈...

Java技术栈,分享最主流的Java技术 1267

深度学习初探 - 入门 DL 主流框架

这个课程主要是引导大家入门TensorFlow、Theano、Keras 及 Caffe 几个主流的深度学习框架。在课程中有关各种算法的详细推导及思想我们不会做过多的陈诉,旨在通过让同学们动手操作搭建自己的神经网络模型,了解如何使用这些框架解决实际问题。课程会基于每个框架的官方文档,先带大家熟悉框架中基本的定义语法及常用函数(可看成深度模型的小零件),每个实验最后都会综合这些零件搭建一个简易的神经深度网络模型。这个项目十分适合具有一定python编程基础,对人工智能、深度学习感兴趣的同学。Theano。

2401_86435672的博客 1235

UE5热更新(通过Pak包加载关卡资源,并添加到流关卡)

请先阅读我上一篇文章)**

xialuhui的博客 6456
上一篇: 21个MySQL表设计的经验准则
下一篇: 14天肝完这110道LeetCode算法题小抄,喜提8个大厂offer
程序员职业指南
博客等级 码龄4年 2138粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值