Skip to content
Calvin's Blog

摸鱼精选第 15 期

Jul 15, 2022 — Reading

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

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

    • 应用层:提供各种用户交互的 API,包括 Server、Client 等一些通用抽象。
    • 路由层:负责根据 URI 匹配对应的处理函数,支持静态路由和动态路由。
    • 协议层:负责不同协议的实现和扩展,比如 HTTP1.1、HTTP2、QUIC 等。
    • 传输层:负责底层的网络库的抽象和实现,时延优化、TLS 支持等。
  2. 功能特性

    • 中间件:除了有 Server 的中间件,还有 Client 的中间件,可处理日志记录、性能统计、异常处理、鉴权逻辑等等。
    • 流式处理:在上传、下载中使用
  3. 性能表现 Hertz 的极限吞吐、TP99 等指标均处于业界领先水平。

本文翻译自 VS Code 之父 Erich 的演讲,Erich 还主导开发了 Eclipse。

VS Code 的历史发展经历了以下几个大的里程碑:

VS Code 之所以成功,有很多因素。除了 LSP 这个大杀器,我们无法直接照搬,很多方面我们在做产品的时候可以借鉴。

我们总是容易高估短期,低估长期。

Be patient, be persistent, be fit, be willing to pivot, be lucky.

本文探索了在 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;
};

组合优于继承 (opens in a new window)

不是不用继承,而是尽量少用。

继承最大的问题就在于:继承层次过深、继承关系过于复杂会影响到代码的可读性和可维护性。这也是为什么我们不推荐使用继承。

我们还有组合(composition)、接口、委托(delegation)三个技术手段,可以达到继承的复用效果。

本文首先介绍了:

随后温习了线程上下文相关的知识,包括:

紧接着介绍了几种协程的实现种类:

然后探讨了关于协程的一些其他内容,包括:

随后是实践部分,包括:

一位开发人员对维护一个基于已有的设计规范,并且在 DigitalOcean 中广泛使用的组件库的一些想法。

检测并响应用户的活动/闲置时间。可以检测用户是否在和应用产生交互,从而使你可以对其做出响应。该组件在最新发布的 v5 版本中完全重写了。