GO 训练营第 9 周——网络编程
linux 系统分析
top: sy/us/wa/si
nmon: CPU/switch(上下文切换)/interrupts/net
nload: 网卡
tcpflow: 抓包
ifconfig: RX errors
dmesg -T: 看网络错误
netstat 成本高,用 ss 替代
磁盘:vmstat/iostat(r/s, w/s)/iotop
查看进程打开的文件:lsof -p $pid
跟踪进程系统调用:strace -p $pid
perf: 排查程序的各种性能问题
ethtool: 网卡,TSO/UFO
相关优化:
网卡多队列,队列可绑 CPU;
conntrack-table 卸载很坑;
linux list: https://zhjwpku.com/2018/11/20/kernel-data-structure-list-and-hlist.html
网络基础
Socket
操作系统提供的通用的面向流的接口
TCP
面向连接,有顺序,可靠传输
UDP
无连接,无顺序,不可靠
http1.1
长连接,单路传输
长轮询实现及时刷新数据:发起一个超时时间很长的请求,等待数据返回
http2.0
双向通信,二进制分帧,多路复用,头部压缩
http3.0(QUIC)
解决 2.0 的头阻塞,一次往返建立 https 连接,拥塞控制优化,4G 切 wifi 不会断连
Go 网络编程
优点:简洁
I/O 模型
go 采用 IO 多路复用模型,在不同平台用不同的实现方式。
Goim 长连接网关
架构
comet: 长连接管理,与 logic 直连原因是因为 comet 可能放在边缘节点上,而 kafka 在核心机房,且 logic 是无状态的可以大量扩容;
logic: 无状态,逻辑层
job:流量消峰
各模块用 gRPC 通信
协议
Sequence Id: 消息序列号,用来响应前的匹配请求消息量,且方便同时传多条消息;
缺少 CRC 校验;
负载均衡:
长连接负载均衡比较特殊,需要按一定的负载算法进行分配节点,可以通过 HTTPDNS 方式,请求获致到对应的节点 IP 列表
消息存储
读、写扩散
KV 存储
ID 生成器
Snowflake
评论