写点什么

GO 训练营第 9 周——网络编程

用户头像
Glowry
关注
发布于: 2021 年 03 月 19 日

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


用户头像

Glowry

关注

还未添加个人签名 2019.02.13 加入

还未添加个人简介

评论

发布
暂无评论
GO训练营第9周——网络编程