字节头条golang二面

docker和云服务的区别
首先明确Docker的核心功能是容器化,它通过容器技术将应用程序及其依赖项打包在一起,确保应用在不同环境中能够一致地运行。而云服务则是由第三方提供商通过互联网提供的计算资源,例如计算能力、存储、数据库等。云服务的范围更广,涵盖了IaaS(基础设施即服务)、PaaS(平台即服务)和SaaS(软件即服务)等多种形式。
Docker可以与云服务结合使用,例如在云服务商提供的虚拟机中运行Docker容器,或者直接使用云服务商提供的容器服务(如AWS ECS、Google Kubernetes Engine等)。但两者本质上解决的问题不同,Docker关注的是应用的封装和隔离,而云服务关注的是计算资源的按需分配和管理。
-
Docker底层原理:Docker利用了Linux内核的命名空间(namespace)和控制组(cgroup)技术来实现容器的隔离和资源限制。命名空间提供了进程、网络、文件系统等方面的隔离,使得每个容器看起来像是独立的系统。控制组则用于限制和分配容器使用的CPU、内存等资源。
-
云服务分类:
-
IaaS(基础设施即服务):提供虚拟机、存储、网络等基础计算资源,用户可以在这些资源上部署自己的操作系统和应用。例如AWS EC2、Azure Virtual Machines。
-
PaaS(平台即服务):除了基础资源外,还提供了开发工具、数据库管理、应用托管等功能,简化了应用的开发和部署过程。例如Google App Engine、Heroku。
-
SaaS(软件即服务):直接向用户提供完整的软件应用,用户无需关心底层的技术细节。例如Salesforce、Office 365。
-
Docker与云服务的关系:虽然Docker和云服务的功能不同,但它们可以很好地互补。云服务提供了灵活的计算资源,而Docker则确保了应用在这些资源上的可移植性和一致性。例如,在Kubernetes集群中,Docker容器可以被编排和调度到不同的云实例上,从而实现高效的资源利用和应用扩展。
-
扩展知识:
-
容器与虚拟机的区别:容器和虚拟机都是用于隔离应用运行环境的技术,但容器共享宿主机的操作系统内核,而虚拟机则需要为每个实例运行一个完整操作系统。因此,容器在启动速度、资源占用方面具有优势,但在安全性上可能不如虚拟机。
-
云原生架构:随着容器技术和云服务的发展,云原生架构逐渐成为现代应用开发的趋势。云原生强调应用的设计应充分利用云的特点,例如弹性扩展、自动化部署、微服务架构等。Docker和Kubernetes是实现云原生的重要工具。
golang中读取文件的流程是什么
- 导入必要的包:要进行文件操作,必须先导入"os"包,如果需要更高效的缓冲读取,则还需要导入"bufio"包。
- 打开文件:使用os.Open(path)函数打开指定路径的文件,该函数返回一个*os.File类型的指针和可能的错误信息。
- 读取文件:可以选择不同的方式读取文件内容。可以直接使用file.Read方法将文件内容读取到字节切片中,也可以使用bufio.NewReader创建一个带缓冲的Reader对象,然后逐行读取文件内容。
- 关闭文件:无论读取过程是否成功,都需要确保文件被正确关闭以释放系统资源。这通常通过defer file.Close()实现,确保即使发生错误也能关闭文件。
- 深度知识讲解:
- 文件操作涉及操作系统层面的知识,在Go语言中,文件被视为一种特殊的流(stream)。打开文件实际上是在操作系统中请求一个文件描述符(file descriptor),这个描述符是内核用来跟踪文件状态的一个整数标识符。
- os.Open实际上是调用了底层的操作系统API来获取对文件的访问权限。它返回的是一个实现了io.Reader接口的对象,这意味着你可以使用任何符合该接口的方法来处理文件数据。
- 使用bufio包的好处在于它可以提供缓冲机制,减少频繁的系统调用,从而提高性能。例如,bufio.NewReader会预先读取一定量的数据到内存缓冲区,后续的小批量读取操作都会从缓冲区中获取数据,而不是每次都向操作系统发起请求。



一个URL的输入到浏览器展示页面的过程

1. 浏览器解析url,产生http请求信息


2. DNS查询服务器域名对应的 IP 地址


3. 应用程序(浏览器)通过调用Socket库,来委托协议栈工作
协议栈的上半部分有两块,分别是负责收发数据的TCP和UDP协议,这两个传输协议会接受应用层的委托执行收发数据的操作。
协议栈的下面一半是用IP协议控制网络包收发操作,在互联网上传数据时,数据会被切分成一块块的网络包,而将网络包发送给对方的操作就是由IP负责的。

4. 可靠传输TCP(传输层)


5. 远程定位IP(网络层)

6. 两点传输MAC(数据链路层)



7. 网卡 网线

8. 交换机、路由器

KafKa
参考:https://blog.csdn.net/weixin_45366499/article/details/106943229

- Producer:Producer即生产者,消息的产生者,是消息的入口。
- Broker:Broker是kafka实例,每个服务器上有一个或多个kafka的实例,我们姑且认为每个broker对应一台服务器。每个kafka集群内的broker都有一个不重复的编号,如图中的broker-0、broker-1等……
- Topic:消息的主题,可以理解为消息的分类,kafka的数据就保存在topic。在每个broker上都可以创建多个topic。
- Partition:Topic的分区,每个topic可以有多个分区,分区的作用是做负载,提高kafka的吞吐量。同一个topic在不同的分区的数据是不重复的,partition的表现形式就是一个一个的文件夹!
- Replication:每一个分区都有多个副本,副本的作用是做备胎。当主分区(Leader)故障的时候会选择一个备胎(Follower)上位,成为Leader。在kafka中默认副本的最大数量是10个,且副本的数量不能大于Broker的数量,follower和leader绝对是在不同的机器,同一机器对同一个分区也只可能存放一个副本(包括自己)。
- Message:每一条发送的消息主体。
- Consumer:消费者,即消息的消费方,是消息的出口。
- Consumer Group:我们可以将多个消费组组成一个消费者组,在kafka的设计中同一个分区的数据只能被消费者组中的某一个消费者消费。同一个消费者组的消费者可以消费同一个topic的不同分区的数据,这也是为了提高kafka的吞吐量!
- Zookeeper:kafka集群依赖zookeeper来保存集群的的元信息,来保证系统的可用性。
发送数据



保存数据


消费数据




GMP
Go语言的GPM调度模型是Go运行时中用于处理并发的核心机制之一,它将Goroutine(轻量级线程)有效地映射到系统线程上,以最大化并发性能。GPM模型主要由三个部分组成:G(Goroutine)、P(Processor)、M(Machine)。让我们逐一详细介绍:
- G(Goroutine)
Goroutine 是Go语言中用于并发执行的轻量级线程,每个Goroutine都有自己的栈和上下文信息。
Goroutine相对于操作系统的线程更加轻量级,可以在同一时间内运行成千上万的Goroutine。 - P(Processor)
P 是处理Goroutine的调度器的上下文,每个P包含一个本地运行队列(Local Run Queue),用于存储需要运行的Goroutine。
P的数量由GOMAXPROCS设置决定,它决定了并行执行的最大线程数。
P不仅管理Goroutine,还负责与M协作,将Goroutine分配给M执行。 - M(Machine)
M 代表操作系统的线程,负责执行Goroutine。一个M一次只能执行一个Goroutine。
M是实际执行代码的工作单元,M与P绑定后才能执行Goroutine。
M可以通过调度器从全局运行队列中拉取新的Goroutine,也可以与其他M协作完成工作。 - GPM模型的调度过程
调度器工作机制:Goroutine创建后会被放入P的本地队列,P会从该队列中选择Goroutine,并将其分配给M执行。如果本地队列为空,P可以从全局运行队列或其他P的队列中窃取任务。
工作窃取机制:如果一个P的本地队列为空,而另一个P的本地队列中有多个Goroutine,前者可以从后者中窃取任务,从而保持系统的高效利用率。
阻塞与调度**:当M执行的Goroutine阻塞(例如I/O操作)时,M会释放当前的P并等待P重新分配任务,从而避免资源浪费。** - 模型优点
高效的并发调度:GPM模型使得Go语言可以高效地管理数百万个Goroutine的并发执行。
可伸缩性:通过P与M的动态调度,GPM模型可以充分利用多核处理器的性能。
轻量级:Goroutine非常轻量,创建和切换的成本比系统线程要低得多。
P的核心作用
资源隔离与负载均衡
P作为逻辑“处理器”,负责管理本地Goroutine队列(runq),使每个OS线程(M)绑定到一个P上工作。这种设计避免了全局队列的锁竞争,同时支持不同P之间通过工作窃取(Work Stealing)动态平衡负载。
多核利用率
P的数量默认等于CPU核心数,确保Goroutine能均匀分配到多个核心上执行。若去掉P,调度器将无法有效利用多核,可能退化为单线程或引发全局锁争用。
- 去掉P的后果
全局锁竞争加剧
所有Goroutine必须通过全局队列调度,多个M(OS线程)会频繁争夺同一把锁,导致并发性能骤降(参考Go 1.0之前的调度器问题)。
调度效率降低
P的本地队列减少了Goroutine的调度延迟。若去掉P,每次调度都需要访问全局队列,增加延迟和不确定性。
阻塞操作的协作困难
当Goroutine因系统调用阻塞时,P会解绑M并创建/复用新的M继续运行其他Goroutine。若无P,阻塞操作可能导致线程长时间挂起,浪费资源。
GC

插入写屏障:黑色对象引用的对象变为灰色(栈区不会触发, stw+remark)

删除写屏障:删除的对象如果为白色被标记为灰色(被删除后即使没有别的对象再引用他,也会活到下一轮)
混合写屏障
GC期间,任何在栈上新创建的对象,均为黑色。
上面两点只有一个目的,将栈上的可达对象全部标黑,最后无需对栈进行STW,就可以保证栈上的对象不会丢失。有人说,一直是黑色的对象,那么不就永远清除不掉了么,这里强调一下,标记为黑色的是可达对象,不可达的对象一直会是白色,直到最后被回收。
堆上被删除的对象标记为灰色
堆上新添加的对象标记为灰色
k个一组翻转列表
https://leetcode.cn/problems/reverse-nodes-in-k-group/description/
/*** Definition for singly-linked list.* type ListNode struct {* Val int* Next *ListNode* }*/
func reverseKGroup(head *ListNode, k int) *ListNode {if head==nil{return nil}l,r := head, headroot := &ListNode{}rr := rootnum := 0for r!=nil{num++if num%k==0{tmp := r.Nextr.Next = nilrr.Next = reverse(l)rr = ll,r = tmp, tmp}else{r = r.Next}}rr.Next = lreturn root.Next
}
func reverse(head *ListNode) *ListNode{if head==nil || head.Next==nil{return head}l,r := head, head.Nextl.Next = nilfor r!=nil{tmp := r.Nextr.Next = ll = rr = tmp}return l
}
相关文章:
字节头条golang二面
docker和云服务的区别 首先明确Docker的核心功能是容器化,它通过容器技术将应用程序及其依赖项打包在一起,确保应用在不同环境中能够一致地运行。而云服务则是由第三方提供商通过互联网提供的计算资源,例如计算能力、存储、数据库等。云服务…...
数字化工厂五大核心系统(PLM 、ERP、WMS 、DCS、MOM)详解
该文档聚焦数字化工厂的五大核心系统,适合制造业企业管理者、信息化建设负责人、行业研究人员以及对数字化转型感兴趣的人士阅读。 文档先阐述数字化工厂的定义,广义上指企业运用数字技术实现产品全生命周期数字化,提升经营效益&…...
n8n 中文系列教程_02. 自动化平台深度解析:核心优势与场景适配指南
在低代码与AI技术深度融合的今天,n8n作为开源自动化平台正成为开发者提效的新利器。本文深度剖析其四大核心技术优势——极简部署、服务集成、AI工作流与混合开发模式,并基于真实场景测试数据,厘清其在C端高并发、多媒体处理等场景的边界。 一…...
MCP认证难题破解
一、MCP 认证体系现状与核心挑战 微软认证专家(MCP)体系在 2020 年后逐步向基于角色的认证转型,例如 Azure 管理员(AZ-104)、数据分析师(DP-100)等,传统 MCP 考试已被取代。当前备考的核心难题集中在以下方面: 1. 技术栈快速迭代 云原生技术占比提升:Azure 认证中,…...
【滑动窗口】串联所有单词的⼦串(hard)
串联所有单词的⼦串(hard) 题⽬描述:解法⼀(暴⼒解法):算法思路:C 算法代码:Java 算法代码: 题⽬链接:30. 串联所有单词的⼦串 题⽬描述: 给定⼀…...
SQL注入之information_schema表
1 information_schema表介绍: information_schema表是一个MySQL的系统数据库,他里面包含了所有数据库的表名 SQL注入中最常见利用的系统数据库,经常利用系统数据库配合union联合查询来获取数据库相关信息,因为系统数据库中所有信…...
高级java每日一道面试题-2025年4月13日-微服务篇[Nacos篇]-Nacos如何处理网络分区情况下的服务可用性问题?
如果有遗漏,评论区告诉我进行补充 面试官: Nacos如何处理网络分区情况下的服务可用性问题? 我回答: 在讨论 Nacos 如何处理网络分区情况下的服务可用性问题时,我们需要深入理解 CAP 理论以及 Nacos 在这方面的设计选择。Nacos 允许用户根据具体的应用…...
Elasticsearch:使用 ES|QL 进行搜索和过滤
本教程展示了 ES|QL 语法的示例。请参考 Query DSL 版本,以获得等效的 Query DSL 语法示例。 这是一个使用 ES|QL 进行全文搜索和语义搜索基础知识的实践介绍。 有关 ES|QL 中所有搜索功能的概述,请参考《使用 ES|QL 进行搜索》。 在这个场景中&#x…...
R语言之.rdata文件保存及加载
在 R 中,.rdata 文件是通过 save() 函数创建的。 使用 save() 函数可以将一个或多个 R 对象保存到 .rdata 文件中。使用 load() 函数可以将 .rdata 文件中的对象恢复到当前工作环境中。 1.创建并保存对象到.rdata 假设有一个基于 iris 数据集训练的线性回归模型&a…...
二进制和docker两种方式部署Apache pulsar(standalone)
#作者:闫乾苓 文章目录 1、二进制安装部署Pulsar(standalone)1.1 安装配置JDK1.2 下载解压pulsar安装包1.3 启动独立模式的Pulsar 集群1.4 创建主题测试1.5 向主题写入消息测试1.6 从主题中读取消息测试 2.docker安装部署Pulsar(standalone)2.1 使用docker 启动Pul…...
MySQL表与表之间的左连接和内连接
前言: 在上个实习生做的模块之中,在列表接口,涉及到多个表的联表查询的时候总会出现多条不匹配数据的奇怪的bug,我在后期维护的时候发现了,原来是这位实习生对MySQL的左连接和内连接不能正确的区分而导致的这种的情况。 表设置 …...
RAG知识库中引入MCP
MCP(Memory, Context, Planning)是一种增强AI系统认知能力的框架。将MCP引入RAG知识库可以显著提升系统的性能和用户体验。下面我将详细介绍如何实现这一整合。 MCP框架概述 MCP框架包含三个核心组件: Memory(记忆):存储和管理历史交互和知识Context(上下文):理解当…...
TDengine 性能监控与调优实战指南(二)
四、TDengine 性能调优实战 4.1 硬件层面优化 硬件是 TDengine 运行的基础,其性能直接影响着 TDengine 的整体表现。在硬件层面进行优化,就如同为高楼大厦打下坚实的地基,能够为 TDengine 的高效运行提供有力支持。 CPU:CPU 作…...
低代码开发平台:企业数字化转型的加速器
一、引言 在数字化时代,企业的转型需求日益迫切。为了在激烈的市场竞争中保持领先地位,企业需要快速响应市场变化、优化业务流程、提升运营效率。然而,传统的软件开发模式往往面临开发周期长、成本高、灵活性差等问题,难以满足企业…...
【AI图像创作变现】02工具推荐与差异化对比
引言 市面上的AI绘图工具层出不穷,但每款工具都有自己的“性格”:有的美学惊艳但无法微调,有的自由度极高却需要动手配置,还有的完全零门槛适合小白直接上手。本节将用统一格式拆解五类主流工具,帮助你根据风格、控制…...
相控阵列天线:原理、优势和类型
本文要点 相控阵列天线 (Phased array antenna) 是一种具有电子转向功能的天线阵列,不需要天线进行任何物理移动,即可改变辐射讯号的方向和形状。 这种电子转向要归功于阵列中每个天线的辐射信号之间的相位差。 相控阵列天线的基…...
【HD-RK3576-PI】Ubuntu桌面多显、旋转以及更新Logo
硬件:HD-RK3576-PI 软件:Linux6.1Ubuntu22.04 在基于HD-RK3576-PI硬件平台运行Ubuntu 22系统的开发过程中,屏幕方向调整是提升人机交互体验的关键环节。然而,由于涉及uboot引导阶段、内核启动界面、桌面环境显示全流程适配&#x…...
树莓派超全系列教程文档--(36)树莓派条件过滤器设置
树莓派条件过滤器设置 条件过滤器[all] 过滤器型号过滤器[none] 过滤器[tryboot] 过滤器[EDID*] 过滤器序列号过滤器GPIO过滤器组合条件过滤器 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 条件过滤器 当将单个 SD 卡(或卡图像&am…...
【Rust 精进之路之第3篇-变量观】`let`, `mut` 与 Shadowing:理解 Rust 的变量绑定哲学
系列: Rust 精进之路:构建可靠、高效软件的底层逻辑 作者: 码觉客 发布日期: 2025-04-20 引言:为数据命名,Rust 的第一道“安全阀” 在上一篇文章中,我们成功搭建了 Rust 开发环境,并用 Cargo 运行了第一个程序,迈出了坚实的一步。现在,是时候深入了解构成程序的基…...
wordpress独立站的产品详情页添加WhatsApp链接按钮
在WordPress外贸独立站的产品展示页添加WhatsApp链接按钮,可以帮助客户更方便地与你联系。以下是实现这一功能的步骤: 方法一:使用HTML代码添加按钮 编辑产品展示页 进入WordPress后台,找到需要添加WhatsApp按钮的产品展示页。…...
jetpack之LiveData的原理解析
前言 在一通研究下,我打算LiveData的解析通过从使用的方法上面切入进行LiveData的工作原理分析😋。感觉这样子更能让大家伙理解明白,LiveData的实现和Lifecycle分不开,并且还得需要知道LiveData的使用会用到什么样的方法。所以&a…...
Viper配置管理笔记
一、什么是 Viper? Viper 是 Go 语言的一个强大工具,就像一个超级管家,专门负责帮你打理程序的各种配置。它能把配置文件(比如 JSON、YAML、TOML 等格式)里的内容读出来,还能监控配置文件的变化࿰…...
go+mysql+cocos实现游戏搭建
盲目的学了一段时间了,刚开始从Box2d开始学习,明白了很多,Box2d是物理模型的基础,是我们在游戏中模拟现实的很重要的一个开源工具。后来在朋友的建议下学习了cocos,也是小程序开发的利器,而golang是一款高效…...
【微知】服务器如何获取服务器的SN序列号信息?(dmidecode -t 1)
文章目录 背景命令dmidecode -t的数字代表的字段 背景 各种场景都需要获取服务器的SN(Serial Number),比如问题定位,文件命名,该部分信息在dmi中是标准信息,不同服务器,不同os都能用相同方式获…...
Android开发中广播(Broadcast)技术详解
在 Android 开发中,广播(Broadcast) 是一种广泛使用的组件通信机制,它允许应用程序在不直接交互的情况下传递消息。本文将详细讲解 Android 广播的基本概念、类型、发送与接收流程、使用场景及注意事项,并结合具体的代…...
MySQL视图高级应用与最佳实践
1. 视图与索引的协同优化 物化视图(模拟实现) MySQL原生不支持物化视图,但可通过“定时刷新”的物理表模拟: -- 1. 创建存储结果的物理表 CREATE TABLE cached_monthly_sales (product_id INT,total_sales DECIMAL(10…...
xss4之cookie操作
一、登录网站情况分析 1. 登录状态与Cookie的关系 已登录状态: 当用户登录网站后,如admin123456,网站会通过某种方式(如Cookie)在客户端保存用户的登录状态。Cookie的作用: Cookie是服务器发送到用户浏览器并保存在本地的一小块…...
51c大模型~合集119
我自己的原文哦~ https://blog.51cto.com/whaosoft/13852062 #264页智能体综述 MetaGPT等20家顶尖机构、47位学者参与 近期,大模型智能体(Agent)的相关话题爆火 —— 不论是 Anthropic 抢先 MCP 范式的快速普及,还是 OpenAI …...
Vue3 + TypeScript,关于item[key]的报错处理方法
处理方法1:// ts-ignore 注释忽略报错 处理方法2:item 设置为 any 类型...
【记录】服务器用命令开启端口号
这里记录下如何在服务器上开启适用于外界访问的端口号。 方法 1 使用防火墙 1 su ,命令 输入密码 切换到root节点 2 开启防火墙 systemctl start firewalld3 配置开放端口 firewall-cmd --zonepublic --add-port8282/tcp --permanent4 重启防火墙 firewall-cmd…...
