Go 进阶训练营 – 评论系统架构设计四:可用性设计
Singleflight 对于热门的主题,如果存在缓存穿透的情况,会导致大量的同进程、跨进程的数据回源到存储层,可能会引起存储过载的情况,如何只交给同进程内,一个人去做加载存储? 使用归并回源的思路:https://pkg.go.dev/golang.org/x/sync/singleflight,同一时间只有一个协程去拿数据,拿到数据前,相同任务…
跳表:为什么Redis一定要用跳表来实现有序集合?
前言 时间复杂度O(logn)的二分查找很高效,但是依赖数组随机访问的特性,如果是链表,如何做到O(logn)? 跳表 原始链表查找时,需要遍历链表,时间复杂度就是O(n),光靠原始链表是不行的。 我们可以增加辅助链表,达到索引的作用,使用起来类似二叉搜索树。 查找时,从上往下,一层一层的查找,类似二叉搜索树。索引层可以继续增加,效率会得到提升。 …
Go 进阶训练营 – 评论系统架构设计三:存储设计
存储设计 comment_subject 抽象的主题表,把评论的主体抽象出来,包含专有属性,例如state。 id:mysql必须有主键,不建立主键mysql也会提供一个rowId 使用自增,为了顺序存储,提高读写性能。 索引搜索快还是主键搜索快? 索引搜索是根据索引字段找到主键,再通过主键去找到记录,也就是二级索引。 用递增int不会带来安全性问…
Go 进阶训练营 – 评论系统架构设计二:详细设计
详细设计 comment-service 专注在评论数据处理(认真想下 Separation of Concerns 关注点分离,职责更清晰)。我们一开始是 comment-service 和 comment 是一层,业务耦合和功能耦合在一起,非常不利于迭代,当然在设计层面可以考虑目录结构进行拆分,但是架构层次来说,迭代隔离也是好的。 读的核心逻辑…
Go 进阶训练营 – 评论系统架构设计一:概要设计
评论系统架构设计 这节课程是结合实际业务场景,来做系统架构设计。 架构设计 做架构设计前,需要深度理解产品的业务背景,才能做出更好的设计与抽象,而不是简单的翻译需求。 例如视频评论系统,就可以抽象出通用的评论功能,从而实现评论平台,接入到各种业务形态:文章评论、漫画评论等。 核心功能 发布评论: 支持回复楼层、楼中楼。 读取评论: 按照时间、热度排…
Go 进阶训练营 – Go 工程化实践三:配置管理
配置分类 环境变量(配置) 在部署、运行时能获取到的信息,没必要放到配置文件里。可通过K8S注入到容器或者物理机,供kit 库读取使用。 Region:区域 Zone:可用区 Cluster:集群 Environment:环境,由集群本身决定,而不是取决于应用 Color:染色信息,可用于分发流量,实现多租户 Discovery:注册中心?课程没说…
Go 进阶训练营 – Go 工程化实践二:API 设计
API 定义文件放在哪? 放在当前项目 使用时,需要import此项目,造成API和源码绑定,不好单独管理权限。 放在当前项目,并通过CI自动同步到API大仓——B站的方案 为了统一检索和规范 API,B站内部建立了一个统一的 bapis 仓库,整合所有对内对外 API。 参考 https://github.com/googleapis/googl…
Gitlab CI/CD 实践八:同步文件到其他 Git 仓库
背景 项目里存放了部署到测试环境的k8s资源定义文件,这部分文件需要提交到一个资源定义文件集中仓库,给运维部署到生产环境用。但这部分文件可能会改动,例如存放的项目配置文件就是以configmap的形式在k8s中使用,如果更改项目配置,就需要同步提交到集中仓库。 最开始,这部分工作是人工手动完成的,但是一份文件保存在多个地方,就可能出现不同步的问题,…
Gitlab CI/CD 实践七:公共脚本仓库
前言 之前将流水线脚本所有内容都放到项目里,出现了些问题。 不好维护,当我发现流水线可以优化,需要做些调整的时候,需要在群里跟所有人说,要怎么怎么改。很麻烦,而且不能保证所有项目都会去更新,导致有的基础设施就需要做兼容,例如我封装的基础镜像。 新项目需要使用流水线时,可能出现随便找个脚本抄过来用,而那个脚本并不保证是最新的。 Gitlab 官方也意…
Go 进阶训练营 – Go 工程化实践一:工程项目结构
工程项目结构 序言 go工程的项目结构多种多样,不同的框架对应不同的结构,即使是同一个框架,也有可能出现不同的结构。我个人感觉目前go很年轻,处于百花齐放的时代。而不像java,早已形成业界标准,主流框架spring全家桶,你想要的它都有。基本不用纠结项目结构,只需照着来就行。这对刚从java转到go的同学造成很大的困扰,不知道怎么写符合业界标注,…