kafka学习小结

kafka宝典 基础理论篇 前段时间leader让我选择一个东西深入研究下,我选择了Kafka,学习中以书籍为主,也在网上找了很多参考文献,其实Kafka主要就是网络通行和数据存储,更像是一个数据库,客户端的行为就是提交数据和获取数据,经过了一个月的陆陆续续的学历和文档整理,这次做一次整合怪,把总体的学习分享出来。下一步准备抽时间研究kafka源码。 阅读详情

简介

Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域

是 一个开源的 分 布式事件流平台 (Event Streaming Platform),被数千家公司用于高性能数据管道、流分析、数据集成和关键任务应用

作用

缓存/消峰、解耦和异步通信

架构

生产者 brokers(4.0版本后取消了zookeeper) 消费者

模式

点对点模式:

消费者主动拉取数据,消息收到后清除消息

发布/订阅模式:

可以有多个topic主题

消费者消费数据之后,不删除数据

每个消费者相互独立,都可以消费到数据

发布/订阅:

消息的发布者不会将消息直接发送给特定的订阅者,而是将发布的消息 分为不同的类别,订阅者只接收感兴趣的消息

生产者

流程图

架构

一.main线程 包含

1.拦截器 处理一些拦截作用 一般不使用

2.序列化器 序列化数据

3.分区器 将数据分到不同的双端队列 每个双端队列默认16k 全部队列内存为32m

二.sender线程 拉取双端队列的数据到kafka集群

1.selector打通好每个双端队列对应的kafka集群中的broker和分区的通道

每个broker节点的每个分区作为一个key 每个key是一个拉取队列 在没有确认应答情况下最多发送5条

双端队列达到batch.size最大值时会触发发送一次 或者 达到时间后会发送一次 默认时0ms

当发送后需要确认应答 根据asks的应答级别来处理 如果失败则重试 如果成功删掉对应key队列的数据

方式

同步发送 数据发到分区器 并且分区器把数据发送到了kafka集群 下一批数据才能发到分区器

异步发送 数据发到分区器 不管分区器是否发了数据到kafka集群 都可以继续发送到分区器

数据分区

指定分区

根据key的hash值分区

随机分区

自定义分区

提高吞吐量方法

数据可靠性

-1级别中也有个问题 会有数据重复的问题

要求数据既不能重复也不丢失 那么需要幂等性和事务

幂等性

事务

数据有序

单分区内,有序; 多分区,分区与分区间无序

数据乱序

生产者小结

生产者有main线程和sender线程

main线程有拦截器 序列化器和分区器

分区器有双端队列 每个topic的每个分区是一个队列 队列大小16k 总体大小为64m

当达到队列大小或者等到时间到了 sender线程会读取kafka集群的元数据然后找到对应的topic的分区的leader所在的节点 然后发送数据 每次最多发送5条没有返回确定的数据

kafka集群收到消息后 根据ack级别返回确定 -1表示leader和follower全部都要落盘了才返回确定

leader会有isr队列 就是跟follower有心跳包回复的数据

生产者可以开启幂等性 就是发的消息带有一个主键《pid,分区id,自增序号》 每次kafka重启都会给每个生产者分配一个pid

保证了单分区单会话的唯一性

事务是生产者定义一个唯一的事务id   kafka里有一个事务管理器和一个存储事务信息的事务主题 有50个分区   根据事务id的hash值%50得到找哪个事务管理器

必须要开启幂等性

生产者开启事务

从事务管理器得到pid

发消息给对应的leader

跟事务管理器申请预提交 事务管理器给对应的事务主题提交准备标志

事务管理器向对应的leader申请提交

对应的leader返回确定

事务管理器向事务主题提交提交标志

通过事务id和事务管理器和二阶段提交 保证了事务要么成功要么失败

消费者不可消费还没确定提交的消息

broker

存储的信息

brokers下的ids和topics  controller下的数据都是比较关键的元数据

controller下记录哪个broker节点的controller是主controller 控制选举的过程

在消费者和生成者中也会有一份数据

工作流程

节点服役和退役

在服役和退役前需操作数据的转移

副本

概念

AR = ISR + OSR

ISR,表示和 Leader 保持同步的 Follower 集合

OSR,表示 Follower 与 Leader 副本同步时,延迟过多的副本

故障选举

Kafka 集群中有一个 broker 的 Controller 会被选举为 Controller Leader,负责管理集群 broker 的上下线,所有 topic 的分区副本分配和 Leader 选举等工作

选举规则:在isr中存活为前提,按 照AR中排在前面的优先。例如 ar[1,0,2], isr [1,0,2],那么leader 就会按照1,0,2的顺序轮询

topic分区

文件存储

每个topic都多个分区

每个分区会都有对应的log 但防止log文件过大  所以每个分区下有多个segment

每个segment包括 .log日志文件 默认大小1g .index稀疏索引文件 .timeindex时间戳索引文件

注意:

1.index为稀疏索引,大约每往log文件写入4kb数据,会往index文件写入一条索引。 参数log.index.interval.bytes默认4kb

2.Index文件中保存的offset为相对offset,这样能确保offset的值所占空间不会过大, 因此能将offset的值控制在固定大小

文件清理策略

Kafka 中默认的日志保存时间为 7 天,可以通过调整参数修改保存时间。

日志删除

基于时间:默认打开。以 segment 中所有记录中的最大时间戳作为该文件时间戳

基于大小:默认关闭。超过设置的所有日志总大小,删除最早的 segment。 log.retention.bytes,默认等于-1,表示无穷大

日志压缩

compact日志压缩:对于相同key的不同value值,只保留最后一个版本

高效读写数据

1.Kafka 本身是分布式集群,可以采用分区技术,并行度高

2.读数据采用稀疏索引,可以快速定位要消费的数据

3.顺序写磁盘 Kafka 的 producer 生产数据,要写入到 log 文件中,写的过程是一直追加到文件末端, 为顺序写。官网有数据表明,同样的磁盘,顺序写能到 600M/s,而随机写只有 100K/s。这 与磁盘的机械机构有关,顺序写之所以快,是因为其省去了大量磁头寻址的时间

4.页缓存 + 零拷贝技术

零拷贝:Kafka的数据加工处理操作交由Kafka生产者和Kafka消费者处理。Kafka Broker应用层不关心存储的数据,所以就不用 走应用层,传输效率高

PageCache页缓存:Kafka重度依赖底层操作系统提供的PageCache功 能。当上层有写操作时,操作系统只是将数据写入 PageCache。当读操作发生时,先从PageCache中查找,如果找不到,再去磁盘中读取。实际上PageCache是把尽可能多的空闲内存 都当做了磁盘缓存来使用

消费者

消费方式

consumer采用从broker中主动拉取数据  pull(拉)模 式

pull模式不足之处是,如 果Kafka没有数 据,消费者可能会陷入循环中,一直返回 空数据

工作流程

消费者组

Consumer Group(CG):消费者组,由多个consumer组成。形成一个消费者组的条件,是所有消费者的groupid相同。 • 消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费。 • 消费者组之间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。

消费者组初始化

coordinator:辅助实现消费者组的初始化和分区的分配。 coordinator节点选择 = groupid的hashcode值 % 50( __consumer_offsets的分区数量) 例如: groupid的hashcode值 = 1,1% 50 = 1,那么__consumer_offsets 主题的1号分区,在哪个broker上,就选择这个节点的coordinator 作为这个消费者组的老大。消费者组下的所有的消费者提交offset的时候就往这个分区去提交offset

消费者组消费过程

分区的分配和再平衡

一个consumer group中有多个consumer组成,一个 topic有多个partition组成,哪个consumer来消费哪个 partition的数据需要有个策略

Kafka有四种主流的分区分配策略: Range、RoundRobin、Sticky、CooperativeSticky

可以通过配置参数partition.assignment.strategy,修改分区的分配策略。默认策略是Range + CooperativeSticky。Kafka可以同时使用 多个分区分配策略

指的就是leader的consumer制作消费方案的过程

Range

首先对同一个 topic 里面的分区按照序号进行排序,并 对消费者按照字母顺序进行排序。

通过 partitions数/consumer数 来决定每个消费者应该 消费几个分区。如果除不尽,那么前面几个消费者将会多 消费 1 个分区

注意:如果只是针对 1 个 topic 而言,C0消费者多消费1 个分区影响不是很大。但是如果有 N 多个 topic,那么针对每 个 topic,消费者 C0都将多消费 1 个分区,topic越多,C0消 费的分区会比其他消费者明显多消费 N 个分区。 容易产生数据倾斜!

RoundRobin

RoundRobin 针对集群中所有Topic而言

RoundRobin 轮询分区策略,是把所有的 partition 和所有的 consumer 都列出来,然后按照 hashcode 进行排序,最后 通过轮询算法来分配 partition 给到各个消费者。

Sticky

粘性分区定义:可以理解为分配的结果带有“粘性的”。即在执行一次新的分配之前, 考虑上一次分配的结果,尽量少的调整分配的变动,可以节省大量的开销。 粘性分区是 Kafka 从 0.11.x 版本开始引入这种分配策略,首先会尽量均衡的放置分区 到消费者上面,在出现同一消费者组内消费者出现问题的时候,会尽量保持原有分配的分 区不变化。

CooperativeSticky

采用合作式的分区重分配方式。当消费者组发生变更时,它不会一次性对所有分区进行重新分配,而是进行增量调整,只对受影响的分区进行移动。例如,当有新的消费者加入时,它会逐步将少量分区从现有消费者迁移到新消费者,避免了大规模的分区重新平衡,从而减少了消费者的停顿时间,提高了系统的可用

offset的维护

从0.9版本开始,consumer默认将offset保存在Kafka 一个内置的topic中,该topic为__consumer_offsets

__consumer_offsets 主题里面采用 key 和 value 的方式存储数据。key 是 group.id+topic+ 分区号,value 就是当前 offset 的值。每隔一段时间,kafka 内部会对这个 topic 进行 compact,也就是每个 group.id+topic+分区号就保留最新数据

自动提交offset

为了使我们能够专注于自己的业务逻辑,Kafka提供了自动提交offset的功能

enable.auto.commit:是否开启自动提交offset功能,默认是true

auto.commit.interval.ms:自动提交offset的时间间隔,默认是5s

手动提交offset

commitSync(同步提交) 同步提交阻塞当前线程,一直到提交成 功,并且会自动失败重试(由不可控因素导致,也会出现提交失败) 必须等待offset提交完毕,再去消费下一批数据

commitAsync(异步提交) 异步提交则没有失败重试机制,故 有可能提交失败  发送完提交offset请求后,就开始消费下一批数据了

offset消费方式

指定 Offset 消费  auto.offset.reset = earliest | latest | none 默认是 latest

指定时间消费

漏消费和重复消费

重复消费:已经消费了数据,但是 offset 没提交

用了kafka自动提交offset

消费者消费了数据    kafka自动提交的时间间隔还没到 消费者的数据落盘后消费者挂了  没有提交到最新的offset   等下次消费者再消费时读取的offset是之前的位置 则重复消费了

可以用redis分布式锁 key为topic加分区id加offset  超时时间大于自动提交的时间

漏消费:先提交 offset 后消费,有可能会造成数据的漏消费

手动提交offset 先提交offset然后消费者数据还没落盘 挂了 导致漏消费

两种常见方式

用redis分布式锁 key为topic加分区id加offset   开启事务 并且在数据落盘和提交完offset才解锁

然后消费者开启事务 读取上次本地已消费的offset位置 如果小于当前的则执行 大于等于则抛弃

然后数据落地加本地再记录最新的offset落地 再提交事务 同时手动提交kafka的offset

还有一种就是消费者事务和kafka事务一起

说白了 重复消费用幂等性

漏消费就是事务处理完再提交offset

消费者事务

如果想完成Consumer端的精准一次性消费,那么需要Kafka消费端将消费过程和提交offset 过程做原子绑定。此时我们需要将Kafka的offset保存到支持事务的自定义介质

package main

import (
    "database/sql"
    "fmt"
    "github.com/confluentinc/confluent-kafka-go/kafka"
    "log"
    "os"
    "os/signal"
    "syscall"

    _ "github.com/go-sql-driver/mysql"
)

func main() {
    // 配置 Kafka 消费者
    kafkaConfig := &kafka.ConfigMap{
        "bootstrap.servers":        "localhost:9092",
        "group.id":                 "test_group",
        "auto.offset.reset":        "earliest",
        "enable.auto.commit":       false, // 禁用自动提交偏移量
        "isolation.level":          "read_committed",
        "transactional.id":         "consumer_transactional_id",
    }

    // 创建 Kafka 消费者实例
    consumer, err := kafka.NewConsumer(kafkaConfig)
    if err != nil {
        log.Fatalf("Failed to create consumer: %s", err)
    }
    defer consumer.Close()

    // 订阅 Kafka 主题
    topic := "test_topic"
    err = consumer.SubscribeTopics([]string{topic}, nil)
    if err != nil {
        log.Fatalf("Failed to subscribe to topic: %s", err)
    }

    // 配置 MySQL 数据库
    db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/your_database")
    if err != nil {
        log.Fatalf("Failed to connect to MySQL: %s", err)
    }
    defer db.Close()

    // 初始化 Kafka 事务
    err = consumer.InitTransactions(0)
    if err != nil {
        log.Fatalf("Failed to initialize transactions: %s", err)
    }

    // 处理系统信号,优雅退出
    sigchan := make(chan os.Signal, 1)
    signal.Notify(sigchan, syscall.SIGINT, syscall.SIGTERM)

    run := true
    for run {
        select {
        case sig := <-sigchan:
            fmt.Printf("Caught signal %v: terminating\n", sig)
            run = false
        default:
            // 开始 Kafka 事务
            err = consumer.BeginTransaction()
            if err != nil {
                log.Printf("Failed to begin transaction: %s", err)
                continue
            }

            // 从 Kafka 拉取消息
            ev := consumer.Poll(100)
            if ev == nil {
                // 回滚事务
                err = consumer.AbortTransaction(0)
                if err != nil {
                    log.Printf("Failed to abort transaction: %s", err)
                }
                continue
            }

            switch e := ev.(type) {
            case *kafka.Message:
                // 开启 MySQL 事务
                tx, err := db.Begin()
                if err != nil {
                    log.Printf("Failed to begin MySQL transaction: %s", err)
                    // 回滚 Kafka 事务
                    err = consumer.AbortTransaction(0)
                    if err != nil {
                        log.Printf("Failed to abort Kafka transaction: %s", err)
                    }
                    continue
                }

                // 将消息插入到 MySQL 数据库
                _, err = tx.Exec("INSERT INTO your_table (message) VALUES (?)", string(e.Value))
                if err != nil {
                    log.Printf("Failed to insert message into MySQL: %s", err)
                    // 回滚 MySQL 事务
                    err = tx.Rollback()
                    if err != nil {
                        log.Printf("Failed to rollback MySQL transaction: %s", err)
                    }
                    // 回滚 Kafka 事务
                    err = consumer.AbortTransaction(0)
                    if err != nil {
                        log.Printf("Failed to abort Kafka transaction: %s", err)
                    }
                    continue
                }

                // 提交 MySQL 事务
                err = tx.Commit()
                if err != nil {
                    log.Printf("Failed to commit MySQL transaction: %s", err)
                    // 回滚 Kafka 事务
                    err = consumer.AbortTransaction(0)
                    if err != nil {
                        log.Printf("Failed to abort Kafka transaction: %s", err)
                    }
                    continue
                }

                // 提交 Kafka 偏移量
                err = consumer.SendOffsetsToTransaction([]kafka.TopicPartition{
                    {Topic: e.TopicPartition.Topic, Partition: e.TopicPartition.Partition, Offset: e.TopicPartition.Offset + 1},
                }, nil)
                if err != nil {
                    log.Printf("Failed to send offsets to transaction: %s", err)
                    // 回滚 Kafka 事务
                    err = consumer.AbortTransaction(0)
                    if err != nil {
                        log.Printf("Failed to abort Kafka transaction: %s", err)
                    }
                    continue
                }

                // 提交 Kafka 事务
                err = consumer.CommitTransaction(0)
                if err != nil {
                    log.Printf("Failed to commit Kafka transaction: %s", err)
                }

            case kafka.Error:
                fmt.Fprintf(os.Stderr, "%% Error: %v\n", e)
                if e.Code() == kafka.ErrAllBrokersDown {
                    run = false
                }
            default:
                fmt.Printf("Ignored event: %v\n", e)
            }
        }
    }

    fmt.Println("Closing consumer")
}
    

一段mysql作为kafka消费者的事务代码

数据积压

1.如果是Kafka消费能力不足,则可以考虑增 加Topic的分区数,并且同时提升消费组的消费者 数量,消费者数 = 分区数

2.如果是下游的数据处理不及时:提高每批次拉取的数 量。批次拉取数据过少(拉取数据/处理时间 < 生产速度), 使处理的数据小于生产的数据,也会造成数据积压

kraft

左图为 Kafka 现有架构,元数据在 zookeeper 中,运行时动态选举 controller,由 controller 进行 Kafka 集群管理。右图为 kraft 模式架构(实验性),不再依赖 zookeeper 集群, 而是用三台 controller 节点代替 zookeeper,元数据保存在 controller 中,由 controller 直接进 行 Kafka 集群管理

这样做的好处有以下几个: ⚫ Kafka 不再依赖外部框架,而是能够独立运行; ⚫ controller 管理集群时,不再需要从 zookeeper 中先读取数据,集群性能上升; ⚫ 由于不依赖 zookeeper,集群扩展时不再受到 zookeeper 读写能力限制; ⚫ controller 不再动态选举,而是由配置文件规定。这样我们可以有针对性的加强 controller 节点的配置,而不是像以前一样对随机 controller 节点的高负载束手无策。

线程架构

Kafka入门到精通 Kafka是由Apache软件基金会开发的一个开源流平台,由Scala和Java编写。Kafka的Apache官网是这样介绍Kakfa的。Apache Kafka是一个分布式流平台。发布和订阅流数据流,类似于消息队列或者是企业消息传递系统以容错的持久化方式存储数据流处理数据流Publish and subscribe:发布与订阅Store:存储Process:处理特性。 阅读详情

相关推荐

看完这篇Kafka,你也许就会了Kafka

Kafka学习 文章目录Kafka学习1. Kafka简介1.1 Kafka消费模式1.2 Kafka的基础架构1.3 Kafka的安装和使用2. Kafka高级2.1 工作流程2.2 文件存储2.3 生产者分区策略2.4 生产者ISR2.4.1 副本数据同步策略2.4.2 ISR(同步副本集)2.5 生产者ack机制2.6 数据一致性问题2.7 ExactlyOnce3. 消费者分区分配策略3.1 分区分配策略3.2 消费者offset的存储3.3 消费者组案例4. 高效读写&Zookeeper作

AaronCao 20万+

kafka学习

目录一、Kafka 概述消息队列的两种模式点对点模式发布/订阅模式Kafka 基础架构二、docker 安装 kafka三、Kafka 架构深入Kafka 工作流程及文件存储机制Kafka 生产者分区策略数据可靠性保证副本数据同步策略ISRack应答机制数据一致性问题。故障处理细节Exactly Once 语义Kafka 消费者消费方式分区分配策略RoundRobin(轮询)Range(范围)什么时候触发分区分配策略offset 的维护Kafka 高效读写数据 一、Kafka 概述 Kafka 是一个分布式

weixin_42412601的博客 5584

使用Kafka在C#中的小结

在C#中,我们可以使用Kafka来搭建可靠的消息传输系统。本文将介绍如何使用C#连接和发送消息到Kafka集群,并提供相应的代码示例。然后,右键点击项目,在弹出的菜单中点击"管理NuGet程序包"。通过运行上述代码,我们就可以连接到Kafka集群并发送消息了。当然,在实际应用中,我们可能还需要添加更多的逻辑来处理可能的异常情况和其他操作。然后,创建了一个ProducerConfig对象,用于配置Kafka生产者的相关设置。在上面的代码中,我们首先定义了Kafka集群的地址。使用Kafka在C#中的小结。

学习使你进步。 669

Kafka学习

在某些情况下,消费者组中的消费者消费分区发生变化时,会导致消费者分配不均匀,就会触发消费者组的Renalance机制,进行再均衡。

qq_59615070的博客 2688

如何在 VMware Workstation 虚拟机中利用 Nvidia 显卡的硬件加速功能

本文详细介绍了在VMware Workstation虚拟机中配置Nvidia显卡硬件加速的完整流程。重点包括:检查硬件兼容性、安装显卡驱动、编辑VMware配置文件启用PCI直通功能(需修改config.ini文件参数)、为虚拟机分配PCI设备等关键步骤。文章特别强调了配置注意事项,如系统资源需求、BIOS设置要求、驱动兼容性等问题,并建议操作前备份数据。通过此方法可实现虚拟机对Nvidia显卡的直接调用,适用于需要GPU加速的计算场景。

qq_39777550的博客 6697

数字孪生实战:如何用Blender+Unity快速搭建未来工厂3D模型(附资源包)

本文提供了一套利用Blender进行三维建模,再结合Unity构建虚拟仿真环境的实用方案,旨在帮助中小型制造企业低成本、高效率地搭建未来工厂数字孪生原型系统。文章详细介绍了从数据规划、模型优化到场景构建、逻辑仿真与数据对接的全流程,并附有资源包,助力技术团队快速实现从静态展示到动态交互的数字孪生应用。

weixin_29191669的博客 336

kafka快速入门

目录1 kafka1.1 kafka介绍1.2 kafka安装和配置1.2.1 jdk环境1.2.2 zookeeper安装1.2.3 kafka安装1.3 kafka入门案例1.3.1 创建工程kafka-demo1.3.2 消息生产者1.3.3 消息消费者1.3.4 测试及结论-重要1.3.5 相关概念再介绍1.3.5 生产者详解-理解1.3.6 消费者详解-理解1.4 spring boot集成kafka收发消息1.4.1 环境搭建1.4.2 消息生产者1.4.3 消息消费者1.4.4 测试1.5 传

赵广陆 3918

[STM32H750]HAL库下FMC驱动正点原子MCU屏的移植与优化

本文详细介绍了在STM32H750平台上使用HAL库移植与优化正点原子MCU屏幕驱动的完整过程。重点解析了FMC硬件配置、Cache一致性处理、精确延时实现等关键技术难点,提供了实用的移植方案和性能优化技巧,帮助开发者高效解决屏幕显示问题。

rock5的博客 286

Kafka学习小结

一. Kafka简介 1. 消息队列 消息队列 ---- 用于存放消息的组件 可以将消息存放到队列里, 也可以从消息队列中获取消息 很多时候消息队列不是一个永久性的存储, 是作为临时存储存在的 (设定一个期限, 设置消息在MQ中的保存时间) 消息队列中间件: 如Kafka, Active MQ, RabbitMQ, RocketMQ, ZeroMQ 2. Kafka的应用场景 异步处理: 可以将一些比较耗时的操作放在其他系统中, 通过消息队列将需要进行处理的消息进行存储, 其他系统

Milk_With_Tea的博客 268

无耳科技 Solon v3.0.8 发布,Java 企业级应用开发框架

Solon 是新一代,Java 企业级应用开发框架。是杭州无耳科技有限公司的“根级”开源项目(最近“杭州六小龙”很火啊,我们也是杭州的哦)。从零开始构建(No Spring、No Java-EE、No Servlet),有灵活的接口规范与开放生态。采用对商用友好的 Apache 2.0 开源协议。

向往自由的少年!(我是一个少年!!!) 1691

AP发票批量付款程序(WEB ADI)

CREATE OR REPLACE PACKAGE MEW_AP_BATCH_PAYMENTS_PKG IS   PROCEDURE MAIN(P_BATCH_ID          NUMBER                 ,P_ORG_ID            NUMBER                 ,P_BANK_ACCOUNT_NAME VARCHAR2

储藏室 5050

kafka阶段学习小结(面试)

kafka阶段学习小结(面试) https://blog.youkuaiyun.com/qq_28900249/article/details/90346599 主要是借鉴这篇文章的一些问题,做一个小总结,每回看到这些题都要好好思考一下。 1.请说明什么是Apache Kafka? 2.为什么要使用kafka,为什么要使用消息队列 3.kafka中的ISR,AR又代表什么?ISR的伸缩又指什么? 4.kafka中的broker是干什么的? 5.kafka中的zookeeper起到什么作用,可以不用zookeeper吗?

qq_40918324的博客 392

Sentaurus TCAD 实战指南:几何、掺杂与物理模型对Ion/Ioff的协同调控

本文详细介绍了Sentaurus TCAD在器件仿真中的实战应用,重点解析了Ion(开态电流)与Ioff(关态电流)的协同优化方法。通过几何结构设计、掺杂工程和物理模型选择三大要素的精细调整,实现器件性能的显著提升。文章结合28nm和7nm工艺案例,展示了如何平衡Ion与Ioff的矛盾关系,为TCAD工程师提供实用指导。

weixin_29159711的博客 135

Kafka常见问题&学习路径&源码阅读小结 | 写在Kafka3.0发布之际

严格来说,这篇文章也不是今天写的。是之前断断续续写在了几篇文章中。2021年9月21日,随着Kafka3.0的发布,Kafka在「分布式流处理平台」这个目标上的努力进一步得到加强!Kafk...

微信搜:import_bigdata,大数据领域硬核原创作者 417

Android系统去掉长按webview界面弹框中的分享功能

Android 系统去解决长按显示内容,去掉分享功能,不论那个界面,是所有界面都需要满足。如果仅仅去掉系统自带的,那么系统来处理如果客户自定义,部分App自定义的菜单项,不是调用系统的,那么还是需要应用去解决的。之前做过Editext,其实还需要去TextView,最难点的就是WebView中的HTML了 去分享功能了。WebView中涉及到分享功能菜单的界面,/***//***//***//***//***//***//***//***//**

十年饮冰,难凉热血 1017

Win10 开机突然蓝屏错误代码0xc0000001安全模式也进不了,不用重装系统怎么修复?(已解决)九个解决参考方案

Win 10专业版HP480G7。

本博客,博文仅代表个人操作经验,不能完全解决你的问题,仅供参考,佛系回复。 1万+

kafka学习小结(springboot2+kafka组成集群模式2基础实战)

搭建简单的springboot2项目 1.maven添  &lt;dependency&gt; &lt;groupId&gt;org.springframework.kafka&lt;/groupId&gt; &lt;artifactId&gt;spring-kafka&lt;/artifactId&gt; &lt;/dependency&gt; pom.xml配置添加 kafka: ...

qq_40650378的博客 2412

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Kafka学习 — 3 kafka消费者客户端,2024年Golang岗位BAT大厂面试题知识点小结

消费者分组仍需要提交offset,只是现在分区的设置只能通过调用assign修改,因为手动分配分区后不会进行分组协调,因此消费者故障不会引发分区重新平衡。“已提交”的位置是消费者已(处理的)安全保存的最后偏移量,如果进程失败或重新启动时,消费者将恢复到这个偏移量。:增大poll的间隔,可以为消费者提供更多的时间去处理返回的消息(调用poll(long)返回的消息,通常返回的消息都是一批)。分配给它的分区将重新分配给同一个分组中其他的消费者。在下面,我们的例子中,我们处理完每个分区中的消息后,提交偏移量。

2401_84281629的博客 893

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

kafka学习小结(springboot2+kafka组成集群模式3同步异步模式)

接着上一篇补充 官网上关于这一块迷迷糊糊的看不懂,自己总结了下其中的差异:     我们一般没做特殊处理的就是同步模式,生产者发送消息,然后交给消费者,这里面我们也可以对消息的结果进行处理,防止消息丢失 kafkademo中,修改REST接口如下:    ListenableFuture返回对象自带callback方法;我们可以根据成功或者失败进行下一步操作,不过这里主要讲的不是这个...

qq_40650378的博客 3472

kafka学习小结(springboot2+kafka组成集群模式1基础知识)

有幸公司已有搭建好的kafka服务器,这里和大家边学边看 springboot2 kafka基础:摘录的别人介绍  Replication &amp; Leader election(涉及到zookeeper核心问题,不是很明白)  Kafka通过Zookeeper管理集群配置,选举leader,以及在consumer group发生变化时进行rebalance。producer使用pus...

qq_40650378的博客 638

kafka保证数据有序性小结

最近,项目中使用过kafka但是不太理解,然后各种搜博客补习。然后对kafka如何保证数据的有序性很感兴趣,于是乎,又疯狂找博客学习,现在可以说是小有心得,在这里记录一下,怕忘记。也作为给大家的一个分享。本文内容为集多家之长,根据自己的理解就诞生了这篇内容,开始。自己在学习的过程中,看完博客结合自己理解的小结如下研究如何保障kafka消费的顺序性,宗旨就是通过将消息绑定到定向的分区或者队列来保证顺序性,通过增加分区或者线程来提升消费能力。同一组行为设置相同的key,会把这组数据投递到同一分区。...

weixin_53709630的博客 5228

Kafka学习资料(持续更新)

Kafka学习资料(持续更新) Books 《Kafka权威指南》Neha Narkhede Gwen Shapira Todd Palino著 Links What is Kafka IBM Cloud | What is Kafka What is Apache Kafka®? (A Confluent Lightboard by Tim Berglund) + ksqlDB Apache Kafka Explained (Comprehensive Overview) 展示了大量的手绘图来帮助理

锐意工作室 721

Kafka使用经验小结

本文尽量从一个使用者的角度去记录一些在实战当中使用Kfaka所需要关注的要点,这样可能会贴切更多的读者,本文并不会介绍太多的Kafka的一些架构层次设计的知识,因为网上已经有一大堆的重复搬运的资料任由你们学习参考。 明确Kafka在你的系统中的定位 众所周知,Kafka的可用性和数据可靠性相对其他的高可用的MQ来说会低一点,但是带来的却是更大更高性能的消息吞吐量的优势,因此要是你的系统需要的是金融...

weixin_30307267的博客 120

k8s学习--k8s集群部署kafka详细过程

Kafka 是一个由 Apache 软件基金会开发的分布式流处理平台,主要用于实时数据流的处理和传输。它最初由 LinkedIn 开发,并于 2011 年开源。 ### kafka主要特点 1高吞吐量: Kafka 能够处理大量的数据流,适用于需要高吞吐量的场景。 2.分布式:Kafka 具有分布式架构,能够在多个节点上运行,提供高可用性和容错性。 3.**持久化:** Kafka 使用磁盘存储消息,确保数据的持久性。 4.高可靠性: 通过复制机制,Kafka 可以在节点故

lwxvgdv的博客 2550
上一篇: golang常见框架
下一篇: 操作系统学习小结
卜睵·-嗳
博客等级 码龄5年 76粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值