go框架设计5 | 青训营笔记

94 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的的第15天

性能优化和微服务架构

针对网络库的优化

优化

1.go net:

存下全部 Header

减少系统调用次数

能够复用内存

能够多次读

2.go net with bufio:

绑定一块缓冲区

3.netpoll:

存下全部 Header

拷贝出完整的 Body

4.netpoll with nocopy peek:

分配足够大的buffer

限制最大 buffer size

不同网络库优势

1.go net:流式友好、小包性能高。

2.netpoll:中大包性能高、时延低。

针对协议的优化

Headers解析

找到 Header Line边界:\r\n,先找到\n再看它前一个是不是\r。

针对协议相关的 Headers快速解析:

1.通过Header key首字母快速筛除掉完全不可能的key

2.解析对应value 到独立字段

3.使用byte slice管理对应header 存储,方便复用

取:核心字段快速解析,使用byte slice存储,额外存储到成员变量中

舍:普通header性能较低,没有map结构

热点资源池化

与请求一一对应,贯穿一个请求始终

取:减少了内存分配,提高了内存复用,降低了GC压力,性能提升

舍:额外的 Reset逻辑,请求内有效,问题定位难度增加

微服务架构

介绍

彻底的服务化

优势:1.开发效率

2.业务独立设计

3.自下而上

4.故障隔离

劣势:

1.治理、运维难度

2.观测挑战

3.安全性

4.分布式系统

核心要素:

1.服务治理

2.可观测性

3.安全

基本概念

服务:一组具有相同逻辑的运行实体。

实例:一个服务中,每个运行实体即为一个实例。

实例与进程的关系:实例与进程之间没有必然对应关系,可以一个实例可以对应一个或多个进程(反之不常见)。

集群:通常指服务内部的逻辑划分,包含多个实例。

常见的实例承载形式:进程、VM、k8s pod……

有状态/无状态服务:服务的实例是否存储了可持久化的数据(例如磁盘文件)

服务间通信:对于单体服务,不同模块通信只是简单的函数调用。对于微服务,服务间通信意味着网络传输。