如何理解高并发系统
所谓设计高并发系统,就是设计一个系统,保证它整体可用的同时,能够处理很高的并发用户请求,能够承受很大的流量冲击。
我们要设计高并发的系统,那就需要处理好一些常见的系统瓶颈问题,如内存不足、磁盘空间不足,连接数不够,网络宽带不够等等,以应对突发的流量洪峰。
1. 分而治之,横向扩展
如果你只部署一个应用,只部署一台服务器,那抗住的流量请求是非常有限的。并且,单体的应用,有单点的风险,如果它挂了,那服务就不可用了。
因此,设计一个高并发系统,我们可以分而治之,横向扩展。也就是说,采用分布式部署的方式,部署多台服务器,把流量分流开,让每个服务器都承担一部分的并发和流量,提升
工作中碰到哪些异常。 框架、多线程、集合类 异常
在使用nacos中碰到哪些异常?
多线程环境下,线程通信
springcloud网关
spring 事务传播级别
数据库连接池。 druid 和其他连接池对比有哪些优缺点
spring事务怎么手动开启
spirng事务失效场景
spring事务失效场景,但是我要以事务的方式执行,怎么做
mysql锁。 自增锁 表锁
kafaka优缺点
怎么自己设计一个消息队列
rocketmq怎么保证顺序
synchronized 和reentrentLock 异同
reentrantLock的原理
reentrantLock业务中的可使用场景。
synchronized的使用场景
聚簇索引和非聚簇索引
b树和b+树
springboot源码
springboot bean的生命周期
@Resource @Autowired
spring事务什么时候会失效
codereview流程
单例模式
java
JUC
volatile 原理
AQS源码实现
jvm运行时内存区域
mysql
分库分表
聚簇索引 和非聚簇索引
联合索引是否会用到索引 (a_b_c, select * from t where a = xxx and c = xxx)
mysql隔离级别,分别会有什么问题,默认隔离级别
b+树
mvcc
redis
基本数据类型
set的底层实现,zset
redis挂掉之后,本地缓存 + 限流。 reids持久化
场景题
限流怎么做的
抽奖权重 怎么做的
工作中有么有什么灵光一现的想法
自我介绍 、项目经历
数据库:
1. 业务量多少
2. 表结构
用户表,分表
用户活动进度表,乐观锁 version 字段,(并发场景使用kafka消息队列异步处理)
如果要保证消息消费的顺序,可以根据业务key将同一种类型的消息放在一个broker partition中
操作历史记录表 ,全局唯一流水号,操作类型,操作数据 ,创建时间,更新时间
奖励发送表
3. 分库分表怎么设计
瓶颈分析: IO瓶颈 、CPU瓶颈
IO瓶颈:
* 磁盘读io瓶颈,热点数据太多,缓存存不下,每次查询都会产生大量io,查询速率降低—->分库 or 垂直分表
* 网络io瓶颈,请求的数据太多,网
Goroutine的定义:
说到 gmp之前要先了解goroutine,golang在语言级别支持协程,称作goroutine。golang标准库提供的所有系统调用操作(包括所有同步的I/O操作),都会出让CPU给其他Goroutine。这让goroutine的管理不依赖于系统的进程和线程,也不依赖于cpu的核心数量,而是交给golang的运行时同意调度。
GMP是什么:
G: goroutine,用户级的轻量协程,每个goroutine对象中的sched保存着齐上下文信息。
M: machine 内核级线程的封装,数量对应真实的cpu核心数(真正干货的对象)
P: processor.
go性能观测 pprof
* 你的程序时性能敏感型吗
* GC带来的延迟影响到了你的程序性能吗
* 你的程序有过多的内存分配吗
golang程序在启动时,会向系统申请一定区域的内存,分为栈(stack) 和堆(heap)
栈内存会随着函数的调用分配和回收;
堆内存由程序申请分配,由垃圾回收器(Garbage Collector)负责回收。
性能上,栈内存的使用和回收更迅速一些;
尽管Golang 的 GC 很高效,但也不可避免的会带来一些性能损耗。因此,Go 优先使用栈内存进行内存分配。在不得不将对象分配到堆上时,才将特定的对象放到堆中。
内存分配原则:
* Shari
定时任务
需要频繁 扫描主订单号 ,造成磁盘IO 和网络 IO的消耗 ,对实时交易产生影响
rocketmq延迟队列
消息延迟级别分别为1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h ,共18个级别
recordMsg.setDelayLevel(14); // 第14个级别 ,即10分钟
缺点不够灵活, 商业版支持自定义时间
rabbitMq死信队列
时间轮算法
创建环形队列,例如可以创建一个包含3600个slot的环形队列(本质是个数组)
任务集合,环上每一个slot是一个Set 同时,启动一个timer,这个
Golang开发面试题汇总
请分析以下代码两个方法的执行效率,哪个更快,为什么?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package main
const matrixLength = 200000
func foo() {
// 二维数组
matrixA := CreateMatrix(matrixLength)
matrixB := CreateMatrix(matrixLength)
for i := 0; i < matrixLength; i
前言
一、基础部分
1、golang 中 make 和 new 的区别?(基本必问)
**共同点:**给变量分配内存
不同点:
1)作用变量类型不同,new给string,int和数组分配内存,make给切片,map,channel分配内存;
2)返回类型不一样,new返回指向变量的指针,make返回变量本身;
3)new 分配的空间被清零。make 分配空间后,会进行初始化;
1. 字节的面试官还说了另外一个区别,就是分配的位置,在堆上还是在栈上?这块我比较模糊,大家可以自己探究下,我搜索出来的答案是golang会弱化分配的位置的概念,因为编译的时候会自动内存逃逸处理,懂的大佬帮