Processes and Threads 进程 操作系统会为该应用程序创建一个进程。作为一个应用程序,它像一个为所有资源而运行的容器。这些资源包括内存地址空间、文件句柄(文件描述符)、设备和线程。 不同的应用程序使用的内存空间不同,在操作系统里,就是用进程来做的资源管理、隔离。 线程 线程是操作系统调度的一种执行路径,用于在处理器执行我们在函数中…
Singleflight 对于热门的主题,如果存在缓存穿透的情况,会导致大量的同进程、跨进程的数据回源到存储层,可能会引起存储过载的情况,如何只交给同进程内,一个人去做加载存储? 使用归并回源的思路:https://pkg.go.dev/golang.org/x/sync/singleflight,同一时间只有一个协程去拿数据,拿到数据前,相同任务…
存储设计 comment_subject 抽象的主题表,把评论的主体抽象出来,包含专有属性,例如state。 id:mysql必须有主键,不建立主键mysql也会提供一个rowId 使用自增,为了顺序存储,提高读写性能。 索引搜索快还是主键搜索快? 索引搜索是根据索引字段找到主键,再通过主键去找到记录,也就是二级索引。 用递增int不会带来安全性问…
详细设计 comment-service 专注在评论数据处理(认真想下 Separation of Concerns 关注点分离,职责更清晰)。我们一开始是 comment-service 和 comment 是一层,业务耦合和功能耦合在一起,非常不利于迭代,当然在设计层面可以考虑目录结构进行拆分,但是架构层次来说,迭代隔离也是好的。 读的核心逻辑…
评论系统架构设计 这节课程是结合实际业务场景,来做系统架构设计。 架构设计 做架构设计前,需要深度理解产品的业务背景,才能做出更好的设计与抽象,而不是简单的翻译需求。 例如视频评论系统,就可以抽象出通用的评论功能,从而实现评论平台,接入到各种业务形态:文章评论、漫画评论等。 核心功能 发布评论: 支持回复楼层、楼中楼。 读取评论: 按照时间、热度排…
配置分类 环境变量(配置) 在部署、运行时能获取到的信息,没必要放到配置文件里。可通过K8S注入到容器或者物理机,供kit 库读取使用。 Region:区域 Zone:可用区 Cluster:集群 Environment:环境,由集群本身决定,而不是取决于应用 Color:染色信息,可用于分发流量,实现多租户 Discovery:注册中心?课程没说…
API 定义文件放在哪? 放在当前项目 使用时,需要import此项目,造成API和源码绑定,不好单独管理权限。 放在当前项目,并通过CI自动同步到API大仓——B站的方案 为了统一检索和规范 API,B站内部建立了一个统一的 bapis 仓库,整合所有对内对外 API。 参考 https://github.com/googleapis/googl…
工程项目结构 序言 go工程的项目结构多种多样,不同的框架对应不同的结构,即使是同一个框架,也有可能出现不同的结构。我个人感觉目前go很年轻,处于百花齐放的时代。而不像java,早已形成业界标准,主流框架spring全家桶,你想要的它都有。基本不用纠结项目结构,只需照着来就行。这对刚从java转到go的同学造成很大的困扰,不知道怎么写符合业界标注,…
error type: 错误定义与判断 Sentinel Error 哨兵错误,就是定义一些包级别的错误变量,然后在调用的时候外部包可以直接对比变量进行判定,在标准库当中大量的使用了这种方式。例如下方 io 库中定义的错误。 // EOF is the error returned by Read when no more input is ava…
同系列文章:Go 进阶训练营 Go error/panic VS java exception 和java相比,go的异常处理两极化,panic比exception更严重,java exception是线程级别的,而go的panic是进程级别,任意goroutine出现panic都会导致整个进程挂掉,更能提醒异常情况。error比exception…