个人学习进程

学习进程

1、golang底层
——slice
数据结构,第一个变量指向数组第一个元素的地址;第二个变量len,表示现有数组元素个数,第三个cap表示初始化数组内存数量,append时如果cap还有空位,则不会扩容,还是原数组地址,如果cap没有空位,则根据数组长度扩容,小于1024,则翻倍扩容,大于1024则四分之一倍扩容,扩容后数组地址变化。
——map
数据结构主要设计就是数组+桶(tophash、8key、8value)+链表;对key进行hash算法得到hash值,低位确定在数组的桶位置,高位依次和桶的tophash对比,如果存在,则判断对应的key是否相等,如果这个桶内没有则看链表关联的下个桶是否存在。
——channel
不要通过共享内存进行通信,而是通过通信来共享内存;
数据结构主要设计就是buf数组,记录缓冲区数组数据,两个索引记录数组读和取的下标;recvq和sendq两个等待队列,队列里面都是持有G的sudog元素;如果是无缓冲区chan,则直接将数据放到recv和send的等待队列,阻塞当前G,等待相对应另外的事件把数据获取掉;如果是有缓冲的,会往buf数组存和取,存只有当buf数组满了,会放到send队列中;取是默认从buf队列取,并更新索引,如果当前有sendq,则将其对应的sudog中的元素更新到数组,并通过goready唤醒对应的G。
——defer
顺序是以栈的方式先入后出。
panic前会执行栈上的所有defer。
defer 后直接方法,那是值传递,除非传指针对象; 或者 用func(){} 变量才会是引用。
Return 后会先执行defer顺序, return变量,类似定义了临时变量赋值。
——panic
panic 一般是和defer recover成对存在, panic前会执行栈上的所有defer方法。
——select
Io多路复用;
随机打乱顺序注册case;随机选取满足条件的case,如果没有满足的则执行default case,如果没有,则阻塞;
——GMP模型
G用户态线程,即Goroutine,每个Goroutine有一个G结构体,保存其栈信息,方法函数等,可重用;P是表示逻辑处理器,对于G来说,他属于CPU,G只有绑定在P上才能调度,对于M来说,他提供了一个可执行G的环境,P确定有多少个G可以同时并行处理;M是内核态线程,只有与P绑定后才形成一个可以执行G的环境,他存储了自身需要的信息和当前在M上执行的G信心和绑定的P信息。
——协程泄漏场景
for循环一直go func;
go func后,func执行时间很久。曾经遇到过一个场景,程序限制消费mq队列的数量,需要等待任务处理完才继续消费,然而代码处理业务的核心逻辑用go 起了个协程处理,导致基本就是一直消费mq处理核心业务,模块限制了redis的连接数,导致协程过多,连接redis timeout,后面经过pprof的观察,协程增长很快,然后查看了代码才发现有一段go协程。
不合理的使用channel,导致协程阻塞。

2、数据库
——索引
B+树索引,非叶子结点只存key,叶子结点存key和数据,叶子结点间升序连接;
B+树的索引又分为主索引和辅助索引,主索引(聚集索引)的叶子节点存数据,辅助索引(非聚集索引)的叶子节点存主键id。
——锁
共享锁和排它锁。
一个事务将记录上了共享锁,则其他事务是能拥有读锁;
一个事务对记录上了排它锁,则其他事务均不可上锁。
——事务
四个特性:原子性(要么提交成功,要么回滚),一致性(事务执行前后状态是一致的),隔离型(事务内操作,其他事务无不可见),持久性(事务完成数据永久保存到数据库中)
通过begin commit实现,innode的隔离级别默认是可重复读,所以上了锁,其他事务只能等待,避免脏读和幻读。
——隔离级别
未提交读(一个事务提交前修改,其他事务可知),提交读(一个事务只有提交修改后,其他事务才可感知),可重复读(一个事务的多次数据读取是一致的),串行化(强制事务串行执行)
——优化
索引优化,通过explain分析是否走了索引;
查询字段只查询自己想要的字段;
分区,分表,分库;
建立中间表;
读写分离;
添加缓存

3、redis
——基本数据类型且其底层数据结构、场景
string:SDS简单动态字符串,有点类似golang的slice设计,场景:缓存、计数器;
hash:压缩队列(节省内存)和hashtable(数组+链表),场景:对象存储;
list:压缩队列(节省内存)和链表,场景:队列,列表;
set:整数集合(均为整数的有序数组)和hashtable(数组+链表),场景:去重数据;
zset:压缩队列(节省内存)和跳表,场景:好评榜,延迟队列。


——分布式锁
获取锁:set key value(唯一) ex nx
释放锁:lua脚本,get key 得到的value和业务自己的value对比,一致则del key。
——rdb和oof
rdb:数据快照,每隔一段时间记录内存数据保存到磁盘文件,fork子进程先写入临时文件,成功才覆盖,一般用作全量数据备份;
优点:适合对大规模的数据恢复,比AOF的启动效率高;只有一个文件 dump.rdb,方便持久化;性能最大化,在开始持久化时,它唯一需要做的只是fork出子进程,之后再由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行IO操作了。
缺点:数据安全性低,在一定间隔时间内做一次备份,如果Redis突然宕机,会丢失最后一次快照的修改;由于RDB是通过fork子进程来协助完成数据持久化工作的,因此当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。
aof:增量备份,配置备份规则会定期将指令追加到文件,一般用作增量数据备份;
优点:异常情况数据丢失少了;
缺点:备份速度比较慢
——redis主从架构数据会丢失吗
异步主从复制丢失:主节点数据还没来得及同步到从节点主节点就挂了;如果持久化到磁盘,这种情况是哨兵模式下,也是会丢失,因为已经有新的主节点,当前挂了的主节点重启后还是需要同步现有主节点的数据。
集群产生脑裂:这种也是哨兵情况,主机点和备节点因为网络问题断开了联系,哨兵集群会选举出新的主节点,其实主节点没有挂,连接他的服务数据写入;后续再发现这个问题后,降级为从节点,同步新的主几点数据,导致数据丢失。

4、mq
——怎么保证数据不丢失
生产者到mq中间件:通过异步confirm机制,mq会回成功或者失败消息;
mq中间件:通过持久化机制;
Mq中间件到消费者:通过手动auto ack机制。
如果出现因积压导致的数据丢失,则需要后续通过人工找出这批数据,然后手工导入。
——怎么保证数据不重复
Mq本身只能保证数据不丢,无法保证数据不重复。
业务测通过唯一id判断是否消费过;
如果是操作数据库,可以通过主键、唯一键处理
——怎么保证数据不挤压
业务测通过按需拉取mq数据,可以按评估的资源进行多消费端部署;
如果出现消息积压,可以通过横向扩容模块处理;
如果是消费端业务代码有问题,能修复就修复让其正常消费;如果需要时间,则尽快写工具将积压数据消费到多个queue中,然后写代码每个消费者消费一个queue处理业务。解决了之后将工具下掉业务正常消费。
——mq怎么保证消息顺序性
需要保证顺序的数据放到同一个queue中
——上游怎么知道下游结果
异步mq+回执网关的方式。发送完mq后则处理其他业务,然后用回执模块业务消费下游模块处理完成后,通知业务测去消费。
——设计一个mq架构
可扩展性:多个机器每个broker代表一个节点,每个channel多个分区,分区数据分布在多个节点上,每个节点只包含一部分数据;
高可用:多副本备份,所有备份节点组成一个集群,选举出master,生产消费都于master打交道;挂了重新选举。
持久化:持久化到硬盘,顺序写。

5、操作系统
——进程、线程、协程的区别
进程:是应用程序运行的载体,是操作系统分配资源的最小单位,一个进程可以有多个线程,进程间相互独立,都有自己的内存空间,进程间切换开销大;
线程:内核态线程,程序执行的最小单位,同一个进程内的多个线程共享进程的内存空间,每个线程自己还会有自己的栈和寄存器,栈空间一般是MB级别,所以线程创建的消耗资源比进程小;线程间切换开销比进程小;线程可以创建很多个协程。
协程:用户态线程,通过go的方式启用一个协程,协程的上下文切换完全有用户决定,所以协程切换开销比线程小很多,而且协程所需要的栈空间一般是kb级别的,可动态增加,所以创建一个协程的资源很小。

6、网络协议
——三次握手和四次挥手
三次握手:client将标记位SYN=1,seq=J发送给server,然后进入SYN_SENT状态;server收到客户端标记位SYN=1知道要建立连接,则也将标记为SYN=1,ACK=1,ack=J+1,seq=K 发送给client,然后进入SYN_RECV状态;client收到确认后,判断ack是否等于J+1,如果是则进入ESTABLISHED状态,然后发送ACK=1,ack=K+1给server;servier端收到后判断ack是否等于K+1,如果是也进入ESTABLISHED状态。
四次挥手:client发送FIN=N发送到server,然后进入FIN_WAIT_1状态;server收到client的断开连接,回复一个ACK=N+1给client,进入CLOSE_WAIT状态,然后客户端收到这个消息会进入FIN_WAIT_2状态;同时server会往client发送FIN=M给client,说我要断开连接,然后进入LAST_ACK状态;client收到消息后,进入TIME_WAIT状态,并回复一个ACK=M+1给server,server收到后进入CLOSED状态。

——浏览器输入url后都发生了什么,具体阐述下。
通过域名找到对应的ip地址过程,依次经过浏览器缓存,host缓存,递归搜索根域名服务器等;
建立tcp三次握手连接;
浏览器发送http请求;
经过路由器的转发,服务器收到该http请求;
服务器接处理业务,并返回html文件;
浏览器接收到html,渲染页面。

7、算法

8、笔试题
——手写lur算法

9、设计模式
简单工厂:不同的对象,实现接口,通过一个方法判断不同类型,初始化对象;
抽象工厂:不同的对象,实现接口,通过工厂模式实现不同的方法初始化对象;
简单抽象工厂:在抽象工厂模式基础上,实现简单工厂,通过一个方法判断不同类型,初始化对象;
单例模式:通过sync.once实现初始化单个对象;
代理模式:将真正的对象通过代理对象封装起来,调用代理对象进行操作;
装饰模式:动态地给现有对象增加一些功能;
建造者模式:将一个复杂的对象的构建与它的表现分离,使得同样的构建可以得到不同的表示;

10、hr问题
——离职原因
在公司工作了4年,目前主要做的工作偏业务性,技术强度不高,希望换个平台,拓宽下技术和视野,也希望学习更多更新的技术;
目前公司领导和组内有几个6-7年的员工,基本上很难有晋升空间,我自己也希望做管理开发岗。
基于以上两个原因,在考虑换个新的平台。
——规划
1-2年内先花半年的时间熟悉公司的技术栈、业务,再花一年多的时间沉淀,深入学习并掌握所用到的技术和持续关注学习新技术;
两年以后如果有机会希望往管理岗靠,俗话说不想当将军的小兵不是好小兵,后面如果有机会也会去独立带团队。
——个人优势
编码:个人编码上保持了良好的编码习惯,多添加注释,会注释上方法的业务说明,并且将入参和返回值都做说明;
对部分核心业务会编写单元测试;
技术:关注技术前沿,进行技能储备,可以比较快速的应对复杂多变的需求变化。比如说之前产品上需要给客户做容器化部署,而我刚好具备了docker和k8s的技能储备,所以领导会直接将这个任务让我来完成;
项目:产品服务于50+证券银行公司,有丰富的客户沟通经验,部署包优化交付经验。完成过轻量版包的部署,完成一键化部署单机版推送服务。
——如果让你重新做一次你举得可以改进的项目,你觉得有哪些点可以优化的
现在设计筛选用户目标这块,在task核心模块,里面承载了较多的功能,而且现在模式无法实现一个消息多个模块处理这批用户的场景,现在是通过代码的方式协程去处理用户数据;改造点,可以在上游模块去做筛选目标的操作,并拆分成多个mq消息分批往task模块来处理,可以提高系统的可扩展性和高可用性。
——项目中遇到的难点,如何解决,以后怎么避免
缓存大量失效导致往数据库的大量查询; 之前测试有个场景,客户每天会广播推送,用户信息缓存到redis,设置过期时间固定,导致每天都得重新读库获取用户信息,影响业务性能;后面发现这个问题后,将缓存过期时间设置一个固定值加随机值,尽量避免所有数据同时过期;以后针对这种场景会提前采用这个方案。
之前系统负责统计功能的同事选取了clickhouse作为统计的存储组件,后面离职了之后,统计的功能开发就交接到我和另一个同事负责,然后我们两都是第一次接触clickhouse这个组件,所以对于我俩来说也是一个比较难的地方;后面我们花了几天的时间去熟悉那块功能的代码,并且去了解下当时为什么选择clickhouse的原因,并学习了clickhouse的一些基础知识,现在能基本掌握,并对业务做功能开发。以后可以多去了解一些比较好的开源组件做技能储备,避免临时有需要才去学习。
——平时和同事的关系怎么样
个人觉得还挺不错的,小组内同事都比较友好,平常上下班见面都打招呼,中午一起下楼吃个饭聊聊天吹吹水,周末有时间还可以一起玩下游戏;其他组内打过交道的同事平时遇到也会打下招呼,还有平时可以买点零食分给大家一起分享,加强下关系。
——你有什么想问我的么
hr:
1、这个职位为什么要招人?
2、公司在技术人才这块有什么培养计划?晋升流程是怎么样的?
3、公司五险一金交的比例?
4、公司的企业价值,人文关怀怎么样?
技术面试:
1、现有组织、常用技术栈,后端人员有多少?团队里面初级和高级工程师的比例是多少?
2、公司在技术人才这块有什么培养计划?
3、未来加入这个团队,公司对我的期望是什么?

一点一点补充

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值