摘要:
1 基本的知识 queue 绑定 exchange 有三种模式 fanout -- exchange 将消息发送到所有的 queue。 direct -- exchange 根据消息的 routing key,选择 routing key 相同的 queue,将消息发送到符合条件的 queue 中, 阅读全文
posted @ 2023-02-04 14:26
kohn
阅读(902)
评论(0)
推荐(0)
摘要:
操作系统面经 操作系统基础 系统调用 根据进程访问资源的特点,我们可以把进程在系统上的运行分为两个级别: 用户态(user mode) : 用户态运行的进程可以直接读取用户程序的数据。 系统态(kernel mode):可以简单的理解系统态运行的进程或程序几乎可以访问计算机的任何资源,不受限制。 说 阅读全文
posted @ 2023-02-04 14:24
kohn
阅读(51)
评论(0)
推荐(0)
摘要:
1 数据库基础知识 1.1 数据库三大范式 第一范式:每一个列都不可拆分 第二范式:在第一范式的基础上,非主键完全依赖于主键,而不能是依赖于主键的一部分。 第三范式:在第二范式的基础上,非主键完全直接依赖于主键,而不能传递依赖于主键。 1.2 MySQL 的 binlog 有几种录入格式 state 阅读全文
posted @ 2023-02-04 14:21
kohn
阅读(100)
评论(0)
推荐(0)
摘要:
1 持久化 1.1 RDB fork 一个子线程来将数据进行持久化,使用写时复制的技术,如果主线程要对数据进行修改,那么就复制一份,交给主线程修改,原来的那一份交给子线程来复制到 RDB 文件中。 也可以直接使用主进程来进行持久化,在持久化期间 Redis 挂起。 优点:数据集较大时,启动效率比 A 阅读全文
posted @ 2023-02-04 14:20
kohn
阅读(139)
评论(0)
推荐(0)
摘要:
视频流系统设计 设计 Youtube Scenario 月活跃用户(MAU): 20亿 日活跃用户(DAU): 1.5亿 每天观看视频数量: 50亿 每分钟上传视频时长: 500个小时 用户平均观看时间: 40分钟 Service 上传服务 Upload Service 缩略图服务 Thumb Se 阅读全文
posted @ 2023-02-04 10:58
kohn
阅读(95)
评论(0)
推荐(0)
摘要:
聊天系统设计 设计微信: Work Solution Real-time Service Online Status: Pull vs Push 相关设计题: Design Facebook Messenger Design WhatsApp Design Facebook Live Comment 阅读全文
posted @ 2023-02-04 10:58
kohn
阅读(98)
评论(0)
推荐(0)
摘要:
协同编辑系统设计 Scenario 协同合作 Service + Storage 实时系统 (real time application) 游戏 聊天 (wechat, whatsapp, messager) 股票交易 (robinhood, webull) 协同合作 (google docs) 实 阅读全文
posted @ 2023-02-04 10:57
kohn
阅读(73)
评论(0)
推荐(0)
摘要:
短网址设计 Scenario 需求 Apply Short URL graph LR A(用户) --> |http://www.jiuzhang.com| B(http://bit.ly) B --> |http://bit.ly/1UloQB6| A 根据 Short URL 还原 Long U 阅读全文
posted @ 2023-02-04 10:57
kohn
阅读(113)
评论(0)
推荐(0)
摘要:
用户系统设计 4S Scenario 注册, 登录, 查询, 用户信息修改 支持 100M DAU 注册, 登录, 信息修改 QPS 约 100M * 0.1 * 3 / 86400 = 300 0.1 = 平均每个用户每天登录 + 注册 + 信息修改 查询 QPS 约 100M * 100 * 3 阅读全文
posted @ 2023-02-04 10:57
kohn
阅读(76)
评论(0)
推荐(0)
摘要:
新鲜事系统设计 Twitter, 朋友圈 新鲜事系统的核心因素? 关注与被关注, 每个人看到的新鲜事都是不同的. Pull Model 算法: 在用户查看 New Feed 时, 获取每个好友的前 100 条 Tweets, 合并出前 100 条 News Feed. (K 路归并算法) 复杂度分析 阅读全文
posted @ 2023-02-04 10:57
kohn
阅读(101)
评论(0)
推荐(0)
摘要:
实操-秒杀系统与订票系统设计 1 Scenario (场景) 限量出售, 售完为止. QPS 分析: 平均每秒 1000 人访问, 秒杀时每秒 10w 人访问, QPS 100 倍增加. 流程如下: graph LR A((用户)) --> |"购买"| B(创建订单) B --> K{"库存已无? 阅读全文
posted @ 2023-02-04 10:57
kohn
阅读(88)
评论(0)
推荐(0)
摘要:
MapReduce 框架 Input Split Map 传输整理 Reduce Output Map Reduce 函数的输入输出接口? Map Reduce 函数的输入输出接口必须是 key, value 形式. graph TB A(file) --> |"分片"| B(Map) A --> 阅读全文
posted @ 2023-02-04 10:56
kohn
阅读(47)
评论(0)
推荐(0)
摘要:
RowKey 设计 RowKey 概念 HBase 中 RowKey 可以唯一标识一行记录, 在 HBase 查询的时候有以下几种方式: 通过 Get 方式, 指定 RowKey 获取唯一一行记录 通过 Scan 方式, 设置 startRow 和 stopRow 参数进行范围匹配 全表扫描, 直接 阅读全文
posted @ 2023-02-04 10:56
kohn
阅读(56)
评论(0)
推荐(0)
摘要:
BigTable 技术选型: | NoSQL Database | Company | | | | | BigTable | Google | | HBase | Yahoo(Open source of BigTable) | | Cassandra | Facebook | | DynamoDB 阅读全文
posted @ 2023-02-04 10:56
kohn
阅读(45)
评论(0)
推荐(0)
摘要:
分布式文件系统 (GFS) 设计流程 文件位置 一个 chunk 备份到三个 chunk server 中 | | | Master | | | | filename | | chunk-01 -> CS1, CS3, CS4 | | chunk-02 -> CS2, CS3, CS5 | | ch 阅读全文
posted @ 2023-02-04 10:56
kohn
阅读(64)
评论(0)
推荐(0)
摘要:
UUID的版本 UUID具有多个版本,每个版本的算法不同,应用范围也不同。 首先是一个特例--Nil UUID--通常我们不会用到它,它是由全为0的数字组成,如下: 00000000-0000-0000-0000-000000000000 UUID Version 1: 基于时间的UUID 基于时间 阅读全文
posted @ 2023-02-04 10:55
kohn
阅读(98)
评论(0)
推荐(0)
摘要:
数据库扩展 QPS, 单点故障使得数据库必须要进行扩展. 扩展只需要做两件事情, 数据拆分 Sharding, 数据复制 Replica. 数据拆分可以分摊写流量, 数据复制可以做到读写分离. 数据库拆分 Sharding 纵向拆分 Vertical Sharding 将一个表拆分成为多个表, 每个 阅读全文
posted @ 2023-02-04 10:55
kohn
阅读(45)
评论(0)
推荐(0)
摘要:
SQL vs NoSQL 怎么选择 是否需要支持事务? 是: SQL + 1 否: NoSQL + 1 是否需要丰富的 SQL query? 是: SQL + 1 否: NoSQL + 1 是否想偷懒, 因为SQL 实现往往更简单? 是, SQL 实现比 NoSQL 简单很多: SQL + 1 否, 阅读全文
posted @ 2023-02-04 10:55
kohn
阅读(39)
评论(0)
推荐(0)
摘要:
如何设计限流器 阅读全文
posted @ 2023-02-04 10:55
kohn
阅读(33)
评论(0)
推荐(0)
摘要:
系统设计面试 1 系统设计面试官想要考察什么? 系统架构设计的能力 知识的广度与深度 综合能力 (开放性题目, 沟通能力, 系统抽象能力, 逻辑思维能力) 定级别是通过系统设计来的 2 如何准备系统设计 知识储备 可用性, 可扩展性, 性能, 安全性, 大数据量, 高并发, 分布式设计 多刷题和模拟 阅读全文
posted @ 2023-02-04 10:55
kohn
阅读(98)
评论(0)
推荐(0)
摘要:
调度器 用户级线程和内核级线程 | 特性 | 用户级线程 | 内核级线程 | | | | | | 创建者 | 应用程序 | 内核 | | 操作系统是否感知存在 | 否 | 是 | | 开销成本 | 创建成本低,上下文切换成本低,上下文切换不需要硬件支持 | 创建成本高,上下文切换成本高,上下文切换需 阅读全文
posted @ 2023-02-04 10:30
kohn
阅读(128)
评论(0)
推荐(0)
摘要:
垃圾收集器 Go 语言垃圾收集器的实现原理 | Go 语言设计与实现 1 设计原理 1.1 标记清除 标记清除(Mark-Sweep)算法是最常见的垃圾收集算法,标记清除收集器是跟踪式垃圾收集器,其执行过程可以分成标记(Mark)和清除(Sweep)两个阶段: 标记阶段 — 从根对象出发查找并标记堆 阅读全文
posted @ 2023-02-04 10:30
kohn
阅读(154)
评论(0)
推荐(0)
摘要:
uintptr & unsafe.Pointer unsafe.Pointer 从名字来看它是不安全的和指针相关,unsafer.pointer主要的功能就是不同类型指针间的转换。 func main() { var a *int8 var b *int16 a = new(int8) b = ne 阅读全文
posted @ 2023-02-04 10:26
kohn
阅读(65)
评论(0)
推荐(0)
摘要:
其他场景如何退出协程 1 channel 忘记关闭 事实上除了超时场景,其他使用协程(goroutine)的场景,也很容易因为实现不当,导致协程无法退出,随着时间的积累,造成内存耗尽,程序崩溃。 例如下面的例子: func do(taskCh chan int) { for { select { c 阅读全文
posted @ 2023-02-04 10:26
kohn
阅读(46)
评论(0)
推荐(0)
摘要:
控制协程的并发数量 1 并发过多 一个例子: func main() { var wg sync.WaitGroup for i := 0; i < math.MaxInt32; i++ { wg.Add(1) go func(i int) { defer wg.Done() fmt.Println 阅读全文
posted @ 2023-02-04 10:26
kohn
阅读(93)
评论(0)
推荐(0)
摘要:
互斥锁和自旋锁的区别 两种锁的加锁原理 互斥锁:线程会从sleep ——>running,过程中有上下文的切换,cpu的抢占,信号的发送等开销。 自旋锁:线程一直是running,死循环检测锁的标志位,机制不复杂。 互斥锁属于sleep-waiting类型的锁。例如在一个双核的机器上有两个线程(线程 阅读全文
posted @ 2023-02-04 10:25
kohn
阅读(126)
评论(0)
推荐(0)
摘要:
读写锁与互斥锁 Go 语言标准库 sync 提供了两种锁,互斥锁 sync.Mutex 和读写锁 sync.RWMutex 。 1. 区别 1.1 互斥锁(sync.Mutex) 互斥即不可同时运行。即使用了互斥锁的两个代码片段互相排斥,只有其中一个代码片段执行完成后,另一个才能执行。 Go 标准库 阅读全文
posted @ 2023-02-04 10:25
kohn
阅读(504)
评论(0)
推荐(0)
摘要:
超时场景如何退出协程 1 超时返回时的陷阱 超时控制在网络编程中是非常常见的,利用 context.WithTimeout 和 time.After 都能够很轻易地实现。 1.1 time.After 实现超时控制 func doBadthing(done chan bool) { time.Sle 阅读全文
posted @ 2023-02-04 10:25
kohn
阅读(89)
评论(0)
推荐(0)
摘要:
Lock-free Map 在开始之前,先定义一个概念 Write-Rarely-Read-Many,也就是读多写少。这代表了一个典型的优化并发性能的场景(例如 Linux 内核中的路由表)。我们来实现一个Write-Rarely-Read-Many 场景下的 map。 Lock-based Map 阅读全文
posted @ 2023-02-04 10:25
kohn
阅读(73)
评论(0)
推荐(0)
摘要:
1 Go sync.RWMutex 怎么实现的 sync.RWMutex 是 Go 语言标准库中的一种典型的读写锁(reader-writer lock)实现。 加读锁:先判断是否有 goroutine 持有写锁。如果有持有写锁的 goroutine,那么就休眠当前的读 goroutine;如果没有 阅读全文
posted @ 2023-02-04 10:24
kohn
阅读(33)
评论(0)
推荐(0)
摘要:
Pool 连接池 Pool 的另一个很常用的一个场景就是保持 TCP 的连接。一个 TCP 的连接创建,需要三次握手等过程,如果是 TLS 的,还会需要更多的步骤,如果加上身份认证等逻辑的话,耗时会更长。所以,为了避免每次通讯的时候都新创建连接,我们一般会建立一个连接的池子,预先把连接创建好,或者是 阅读全文
posted @ 2023-02-04 10:23
kohn
阅读(73)
评论(0)
推荐(0)
摘要:
Context 基本使用方法 type Context interface { Deadline() (deadline time.Time, ok bool) Done() <-chan struct{} Err() error Value(key interface{}) interface{} 阅读全文
posted @ 2023-02-04 10:22
kohn
阅读(157)
评论(0)
推荐(0)
摘要:
Cond 使用方法举例 func main() { c := sync.NewCond(&sync.Mutex{}) var ready int for i := 0; i < 10; i++ { go func(i int) { time.Sleep(time.Duration(rand.Int6 阅读全文
posted @ 2023-02-04 10:22
kohn
阅读(61)
评论(0)
推荐(0)
摘要:
Channel Channel 的应用场景 Don’t communicate by sharing memory, share memory by communicating. Go Proverbs by Rob Pike “communicate by sharing memory”和“sha 阅读全文
posted @ 2023-02-04 10:22
kohn
阅读(261)
评论(0)
推荐(0)
摘要:
atomic Mutex、RWMutex 等并发原语的实现,最底层是通过 atomic 包中的一些原子操作来实现的. 在很多场景中,使用并发原语实现起来比较复杂,而原子操作可以帮助我们更轻松地实现底层的优化. atomic 原子操作的应用场景 可以使用 atomic 实现自己定义的基本并发原语. 如 阅读全文
posted @ 2023-02-04 10:21
kohn
阅读(117)
评论(0)
推荐(0)
摘要:
Map 1 Go Map 的底层实现原理 Go 中 Map 是一个指针,指向 hmap 结构体。hmap 包含 buckets(Pointer) 和 oldbuckets(Pointer),Pointer 指针的地址是 bmap 数组作为 hash 表,散列的方式是将 bmap 连成链表来进行散列。 阅读全文
posted @ 2023-02-04 10:21
kohn
阅读(107)
评论(0)
推荐(0)

浙公网安备 33010602011771号