摸鱼精选第 15 期
1. 字节跳动开源 Go HTTP 框架 Hertz 设计实践
Hertz 是字节调研了大量开源 HTTP 框架(如 Fasthttp、Gin、Echo)之后,基于自研网络库 Netpoll 开发的内部框架。
-
架构设计 分为以下四层:
- 应用层:提供各种用户交互的 API,包括 Server、Client 等一些通用抽象。
- 路由层:负责根据 URI 匹配对应的处理函数,支持静态路由和动态路由。
- 协议层:负责不同协议的实现和扩展,比如 HTTP1.1、HTTP2、QUIC 等。
- 传输层:负责底层的网络库的抽象和实现,时延优化、TLS 支持等。
-
功能特性
- 中间件:除了有 Server 的中间件,还有 Client 的中间件,可处理日志记录、性能统计、异常处理、鉴权逻辑等等。
- 流式处理:在上传、下载中使用
-
性能表现 Hertz 的极限吞吐、TP99 等指标均处于业界 领先水平。
2. 在 Go 中使用 Raft 编写分布式和复制式的状态机
3. 从 VS Code 的历史中可以学到的经验
本文翻译自 VS Code 之父 Erich 的演讲,Erich 还主导开发了 Eclipse。
VS Code 的历史发展经历了以下几个大的里程碑:
- 2011 故事开始,Monaco Editor, 一个 Web 端的编辑器
- 2013 年:全面转向 TypeScript,但用户量很少,差点挂掉
- 2014 年:选择 Electron 开发桌面应用,并从"Monaco"改名"Visual Studio Code"
- 2015 年:VS Code 选择在 BUILD 大会上正式发布
- 2016 年:多语言支持 LSP(Language Server Protocol),大放异彩的功能
- 2017~2019 年:开发 VS Code Remote
- 2020 年:重返 Web
VS Code 之所以成功,有很多因素。除了 LSP 这个大杀器,我们无法直接照搬,很多方面我们在做产品的时候可以借鉴。
- 性能够 快!
- 预见未来,适时、而变
- 关注用户声音,持续优化,坚持 10 年,做时间的朋友。
- 运气好
我们总是容易高估短期,低估长期。
Be patient, be persistent, be fit, be willing to pivot, be lucky.
4. 探秘 Weak 实现原理
本文探索了在 Objective-C 语言中的 weak 指针实现原理。
内存中有一个weak_table_t
哈希表,存储 App 内的所有 weak 对象和指针:
struct weak_table_t {
// 弱引用数组,用来存储weak_entry_t对象,是一个链表结构
weak_entry_t *weak_entries;
// 弱引用数组大小,如果到阈值会自动扩容
size_t num_entries;
// 进行哈希运算的mask,大小是num_entries-1
uintptr_t mask;
// 最大冲突数,一般不会大于这个数
uintptr_t max_hash_displacement;
};
在 runtime 里面还有一个SideTable
结构体,定义如下:
struct SideTable {
// 自旋锁,保证线程安全
spinlock_t slock;
// 引用计数表,在未开启isa指针优化,或isa指针存储满了才会用
RefcountMap refcnts;
// 弱引用表
weak_table_t weak_table;
};
5. 为什么组合优于继承?
不是不用继承,而是尽量少用。
继承最大的问题就在于:继承层次过深、继承关系过于复杂会影响到代码的可读性和可维护性。这也是为什么我们不推荐使用继承。
我们还有组合(composition)、接口、委托(delegation)三个技术手段,可以达到继承的复用效果。
6. 浅谈协程
本文首先介绍了:
- 什么是协程;
- 协程的优势;
- 协程的一些特点等;
随后温习了线程上下文相关的知识,包括:
- 线程时间、内存消耗;
- 如何保存上下文:setjmp/longjmp、ucontext、汇编;
紧接着介绍了几种协程的实现种类:
- 有栈和无栈协程;
- 对称与非对称协程;
然后探讨了关于协程的一些其他内容,包括:
- N:1 & N:M 协程;
- 协程的组成;
- 协程的调度;
- 协程相关的工具:锁、条件变量等;
- 协程和线程的对比;
- 协程对 CPU/IO 的影响;
随后是实践部分,包括:
- 使用 C++20 标准中的协程;
- 动手实践协程:
- 基于汇编实现的有栈协程;
- 基于 ucontext 实现的无栈协程;
7. 维护内部 React 组件库的注意事项
一位开发人员对维护一个基于已有的设计规范,并且在 DigitalOcean 中广泛使用的组件库的一些想法。
8. IdleTimer
检测并响应用户的活动/闲置时间。可以检测用户是否在和应用产生交互,从而使你可以对其做出响应。该组件在最新发布的 v5 版本中完全重写了。