首页 > 其他分享 >Golang-微服务-紧急升级-缓存

Golang-微服务-紧急升级-缓存

时间:2023-03-16 11:24:50浏览次数:62  
标签:缓存 Exec ORM 接口 Golang 紧急 API 使用

1. 背景


API 服务器 timewait 一直下不去
尝试阿里云优化方案, 修改内核配置, 也不管用

前端表现为:

  • 页面访问卡顿
  • 页面丢失(接口504)
  • Postman start_trasfer 参数忽高忽低(100ms-10s)

推测 API 拒绝服务了

2. 分析

  • 监控查看到 io 耗时增加

  • 日志查询到后端微服务没问题, 响应很快

  • Postman 查看接口访问链接时间

  • 阿里云ALB监控页面显示 5xx 状态码明显增加

3. 解决

  • 为热点接口增加缓存
  • 收紧该热点接口限流设置
  • 修改日志级别到 warn (此项操作做完 io 明显下降)

4. 为热点接口增加缓存踩坑纪要

1. ORM缓存

  • 线上业务仍在运行的情况下, 分步热更新 后台微服务
  • 首先尝试为 ORM 加缓存, 因为快, 只需要增加两行代码
cacher := xorm.NewLRUCacher(xorm.NewMemoryStore(), 1000)
engine.MapCacher(&user, cacher)

但是这里有坑

不过需要特别注意不适用缓存或者需要手动编码的地方:
当使用了Distinct,Having,GroupBy方法将不会使用缓存
在Get或者Find时使用了Cols,Omit方法,则在开启缓存后此方法无效,系统仍旧会取出这个表中的所有字段。
在使用Exec方法执行了方法之后,可能会导致缓存与数据库不一致的地方。因此如果启用缓存,尽量避免使用Exec。如果必须使用,则需要在使用了Exec之后调用ClearCache手动做缓存清除的工作。

整个 后台 server 的开发工作不仅仅是我一人完成的, 这里也没有去查询是否有用到 Exec 方法, 最终导致用户锁单失败, 超售了
后来紧急回滚了

2. GIN 中间件缓存

基于架构设计, API 承上启下, 实现 HTTP 接口, 调用微服务; API 使用 GIN 框架作为 HTTP 服务框架, 尝试寻找一个 GIN 框架的缓存轮子

  • 官方版本
    不好用, 需要前端配合, 放弃
  • 三方版本
    优点: 中间件实现形式, 方便使用, 性能比官方好一些
    缺点:
    • 只支持 URI 做接口缓存, 但是我这里的需求是 POST 形式, 参数在 body 内, 无法适用
    • 暂不支持 redis 集群作为缓存介质
  • 三方版本PR
    修改了三方版本里只支持URI作为key缓存的情况, 增加了 body 的 hash 为key缓存, 刚好符合要求(用内存形式先上)

5. 小结

  • ORM缓存不可轻易使用, 加了ORM缓存后, 需要回测
  • 接口缓存注意缓存有效期, 根据具体业务需求来定

标签:缓存,Exec,ORM,接口,Golang,紧急,API,使用
From: https://www.cnblogs.com/gettolive/p/17221637.html

相关文章

  • Vscode golang初始化配置
    1、下载安装GO插件2、写代码时vscode提示你需要安装go插件,点击installall进行安装如果安装失败,原因是有道墙,解决方法是,配置国内源如下:goenv-wGO111MODULE=ongoe......
  • Laravel清除缓存
    清除应用程序缓存phpartisancache:clear清除路由缓存phpartisanroute:cache清楚配置缓存phpartisanconfig:cache清楚已编译的视图文件phpartisanview:cl......
  • 一文彻底搞懂前端缓存机制
    浏览器缓存步骤1)浏览器在加载资源时,先根据这个资源的一些httpheader判断它是否命中强缓存,强缓存如果命中,浏览器直接从自己的缓存中读取资源,不会发请求到服务器。比如某个......
  • Ubuntu 上安装 Golang 环境
    下载的相应Go版本压缩包https://golang.org/dl/##官网地址 打开终端并转到下载目录。 解压缩下载的Go二进制文件。可以使用以下命令解压缩:tar-C......
  • golang的命令行参数os.Args和flag
    os.Args是一个string的切片,用来存储所有的命令行参数1.基本使用packagemainimport("fmt""os")funcmain(){fmt.Println("命令行的参数有",len(......
  • 缓存穿透、雪崩
    缓存穿透问题查询缓存中不存在的数据时,每次都要查询数据库。解决缓存穿透的通用方案是: 给所有指定的key预先设定一个默认值,比如空字符串“Null” 缓存并发问题......
  • golang_导包
    golang导包导包同一个项目下的导包文件的目录结构.├──README.md├──go.mod├──main.go├──mymath│  ├──multip.go│  └──sum.go......
  • golang 报错 pkg/mod/github.com/klauspost/[email protected]/zstd/blockdec.go:17:2
    golang报错pkg/mod/github.com/klauspost/[email protected]/zstd/blockdec.go:17:2://go:buildcommentwithout//+buildcomment这个问题一般是需要升级golang的......
  • redis缓存测试
    为什么要使用缓存?当然是为了快和省。快是因为业务系统的数据处理结果暂时存在内存中,下次访问时直接从内存取出,所以会很快。省是节省数据的处理流程及服务器的资源消耗。......
  • 前端性能优化——采用高效的缓存策略提供静态资源
    前端性能优化——采用高效的缓存策略提供静态资源一、发现性能问题通过Chrome开发者工具的Lighthouse工具对目标站点的某个页面进行分析,其生成的报告如图所示:由分......