Cloud Native Foundation - Go IO
|Word Count:202|Reading Time:1mins
阻塞 IO
阻塞:
等待数据就绪
阻塞 + 同步
非阻塞 IO
非阻塞:
等待数据就绪
轮询:效率不高
非阻塞 + 同步
IO 多路复用
(集中线程)阻塞 + 同步
当数据就绪后,集中线程会
唤醒其他线程,阻塞的仅仅只是一个线程
select / poll
通过
传参的形式来轮询fd 列表,长度有上限(1024)
epoll
通过
mmap将用户态的内存和内核态的内存进行共享,不再需要传参,解决了 fd 长度受限的问题
基于
事件侦听,而非轮询
wq:wait queue, rdlist:ready list, rbr:red black tree
Go HTTP:
goroutine 与 fd 绑定
异步 IO
非阻塞 + 异步
异步:
拷贝数据(Socket 缓冲区->应用缓冲区)的过程也是由Kernel来完成
Author: zhongmingmao
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
Related Articles

2022-05-01
Go Engineering - Foundation - Error - Code
设计方式 场景:用户账号没有找到 200 HTTP Code 通常代表的是 HTTP Transport 层的状态信息;但对性能有一定的影响,因为需要解析 HTTP Body 12345678{ "error": { "message": "Syntax error \"Field picture specified more than once. This is only possible before version 2.1\" at character 23: id,name,picture,picture", "type": "OAuthException", "code": 2500, "fbtrace_id": "xxxxxxxxxxx" }} 4xx + 简单信息 可以让客户端快速感知请求失败,但提供的信息过于简单,不能准确地定位问题 ...

2023-05-08
Go Engineering - Error Code
预期功能 有业务 Code 码标识 - HTTP Code 码有限 安全 - 对内对外展示不同的错误信息 设计方式 无论请求成功与否,都返回 200,在 HTTP Body 中包含错误信息 HTTP Code 通常代表 HTTP Transport 层的状态信息 缺点:性能不佳(需解析 Body) + 对客户端不友好 返回 4xx or 5xx,并在 Body 中返回简单的错误信息 返回 4xx or 5xx,并在 Body 中返回详细的错误信息 - 推荐 设计思路 区别于 http status code,业务码需要有一定的规则,可以通过业务码判断出是哪类错误 请求出错时,可以通过 http status code,直接感知到请求出错 需要在请求出错时,返回详细的信息:Code + Message + Reference(Optional) 返回的错误信息,需要是可以直接展示给用户的安全信息,不能包含敏感信息 但同时也要有内部更详细的错误信息,方便 Debug 返回的数据格式应该是固定的,规范的 错误信息要保持简洁,并提供有用的信息 Biz Code 纯数字表示,不同部位代表不同的服...

2022-03-14
Go Engineering - IAM
概述 IAM:Identity and Access Management 用途:在特定条件下,用户能够对哪些资源做哪些操作 工作流程 3 种平台资源:User、Secret、Policy 系统架构 核心功能 创建平台资源 用户通过 iam-webconsole 或者 iamctl 请求 iam-apiserver,完成 User、Secret、Policy 的 CRUD iam-apiserver 将这些资源持久化到 MySQL 中 请求 API 完成资源授权 用户通过 iam-authz-server 的 /v1/authz 接口进行资源授权 请求 /v1/authz 接口需要通过密钥认证,认证通过后会查询授权策略,从而决定资源是否被允许 为了提高 /v1/authz 接口的性能,iam-authz-server 将密钥和策略缓存在内存中 iam-authz-server 通过 gRPC 调用 iam-apiserver,将密钥和策略缓存到内存中 为了保证数据的一致性,借助 Redis Channel 当 iam-ap...

2023-05-10
Go Engineering - CLI
应用框架 命令行参数解析 - Pflag 配置文件解析 - Viper 应用的命令行框架 - Cobra 命令需要具备 help 功能 命令需要能够解析命令行参数和配置文件 命令需要能够初始化业务代码,并最终启动业务进程 Pflag 命令行参数解析工具 - Kubernetes / Istio / Helm / Docker / Etcd / … Flag 一个命令行参数会被解析成一个 Flag 类型的变量 1234567891011121314// A Flag represents the state of a flag.type Flag struct { Name string // name as it appears on command line Shorthand string // one-letter abbreviated flag Usage string ...

2022-02-08
Cloud Native Foundation - Go Thread Scheduling
进程 & 线程 进程:资源分配的基本单位 线程:调度的基本单位 在内核视角,线程与进程无本质差别,在 Linux 中都是以**task_struct**进行描述 glibc 中的 pthread 库提供了 Native POSIX Thread Library 支持 Native POSIX Thread Library (NPTL) is an implementation of the POSIX Threads specification for the Linux operating system. 子进程通过 fork 的方式产生,基于父子关系形成进程树,Linux 中的初始进程一般为systemd 12$ pmap 11: /lib/systemd/systemd --system --deserialize 37 Linux 进程内存 虚拟地址 https://ggirjau.com/text-data-bss-heap-stack-and-where-in-memory-are-stored-variables-of-c-program/ Segme...

2023-05-04
Go Engineering - RPC API
RPC Client Stub / Server Skeleton Client 通过本地调用,调用 Client Stub Client Stub 将参数打包(Marshalling)成一个消息,并发送这个消息 Client 所在的 OS 将消息发送给 Server Server 端接收到消息后,将消息传递给 Server Stub Server Stub 将消息解包(Unmarshalling)得到参数 Server Stub 调用服务端子函数,处理完毕后,将最终结果按相反步骤返回给 Client gRPC Google Remote Procedure Call 简介 由 Google 开发的高性能、开源、跨语言的通用 RPC 框架 基于 HTTP 2.0 协议 + 默认采用 Protocol Buffers 数据序列化协议 特征 支持多语言 - Go、Java、C++、Node.js、Python 等 基于 IDL - Interface Definition Language 文件定义服务 通过 proto3 工具生成指定语言的数据结构、Server API 以及 ...
Announcement
Things are always unexpected!










