摸鱼精选第 15 期

1. 字节跳动开源 Go HTTP 框架 Hertz 设计实践

Hertz 是字节调研了大量开源 HTTP 框架(如 Fasthttp、Gin、Echo)之后,基于自研网络库 Netpoll 开发的内部框架。

  1. 架构设计 分为以下四层:

  2. 应用层:提供各种用户交互的 API,包括 Server、Client 等一些通用抽象。

  3. 路由层:负责根据 URI 匹配对应的处理函数,支持静态路由和动态路由。
  4. 协议层:负责不同协议的实现和扩展,比如 HTTP1.1、HTTP2、QUIC 等。
  5. 传输层:负责底层的网络库的抽象和实现,时延优化、TLS 支持等。

  6. 功能特性

  7. 中间件:除了有 Server 的中间件,还有 Client 的中间件,可处理日志记录、性能统计、异常处理、鉴权逻辑等等。

  8. 流式处理:在上传、下载中使用

  9. 性能表现 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 版本中完全重写了。

9. 淘宝 iOS 扫一扫架构升级 - 设计模式的应用

10. 浅谈软件开发架构模式

11. 这⼀次彻底弄懂:React 服务端渲染

12. C++17 在业务代码中最好用的十个特性

13. 善用 Git 的 sparse checkout 跟 shallow clone/pull 來提高工作效率

14. Linux 后台开发常用调试工具

15. Swift 后缀表达式(逆波兰式)转换计算

16. H.265 编码原理入门

17. Flutter 绘制探索 | 箭头端点的设计

18. React Native 中实现动态导入