1.21项目开发交流
1.15、16
-
体验竞品,然后根据教学视频大概了解了go-zero的基本特性(知己知彼)
-
api语法规范还有protocol大概的规范(之前只是有了解,不太清楚具体语法)
-
根据go-zero官方文档安装了goctl等工具。
-
搭建windows docker环境。docker for windows 安装配置,总是显示starting,解决方案是挂梯子,右上角登录一下
-
这两天都坚持晚上开组会,但是当时很明显跟不上阳哥讲解的思路,在开发流程方面,然后就看回放,腾讯会议的转文字还是很给力,每次会议很长但是可以通过文字快速定位到自己需要的地方。
1.17
- 拉取looklook项目,根据开发环境搭建文档进行搭建;
- 在想部署looklook的时候发现无论怎么样都跑不起来kafka,而且mysql总是提示进不去,花了很多时间找原因,最后还是没找到,果断放弃部署looklook,转战我们自己的项目lottery,按照文档很轻松就跑起来开发环境了(现在也觉得怪,但雀氏是这样的)。
- 然后根据usercenter中登录注册的逻辑,加上文档中的项目开发流程,梳理整体项目架构,了解到主要分为api和rpc两层,这样在开发的时候就和之前gofame电商项目从开发感受来说差不多了。其他很多组件都没学过(虽然很慌,但大概知道还用不上,按照学过mysql redis还有之前goframe的开发经验肯定能满足当前开发需求)
1.18 第一个任务
- 支持根据is_selected字段取值,是否精选 1是 0否,首页只取精选数据
- 调优一下首页接口,让lastId和isSelected传参生效,目前是不生效的。lastId解决的是大量数据偏移量性能差的问题
设置抽奖精选接口
- 特定账号在查看抽奖详情时,支持将当前抽奖设置为“精选抽奖”,展示在首页中。
- 设置抽奖接口的需求:
- user表新增了字段:is_admin,只有值为1才允许设置
-
第一次进行需求评审,还是很懵,在和阳哥对接的时候理解的很慢(还有就是对竞品的理解不够,了解不够深刻,导致后续开发的时候有需求理解错误的情况,但是及时和阳哥沟通了,修改了相关实现,后话了)
-
当天就开始了is_selected字段的开发。
-
通过这个需求,一步步跑通了整个开发流程,(很重要的就是会模仿,找一条很类似的代码流程左右对照着写,这也是之前在goframe电商的时候学到的,比如searchLottery你肯定能找到类似的开发流程)。对项目结构有了更深刻的理解。(收获:快速理解一个项目最快的方法就是给你一个很简单的需求,你根据需求和开发流程亲自跑通一下,就能有很深的体会了)
错误
错误1:理解错了is_selected的需求
- 应该是在searchLottery接口里面和lastId一样进行代码优化,但是我当时直接新创建了一个接口,不过整体思路没错,而且已经跑通了整个项目,(达到了能上手开发的目的)
踩坑
踩坑1:返回相应没有状态码和msg
- 原先的脚本生成handler的时候用的httpx包下面的返回,得手动改为result.HttpResult封装的返回就能有状态码和msg。
踩坑2:在写pb的时候忘记写rpc接口的声明
- 有一次排查了很久,没找到生成的logic文件,发现是这个原因
踩坑2:缓存问题
- 之前做的项目其实都没有加上缓存,gozero很多数据库操作是直接带缓存的,因此在测试设置是否精选接口的时候,当时没有设置admin的接口(后续已经加上了),我操库改的值,发现不管用,然后想起来这一点,清理了缓存就好了。
踩坑3:指针问题
- 在返回值是指针类型的时候一定要记得初始化指针,在返回时候声明或者显式new一下都行,踩过很多次,浪费过挺多时间。
踩坑4:能用copier的尽量用。
- copier是jinzhu大佬写的一个大概是快速赋值的库,能方便Model到rpc,rpc到api层的赋值。但是也需要注意copy的时候指针类型需要先初始化,
踩坑5:在返回值一层只有一个键的时候可以不用在包一层
踩坑6:502的问题。
- 我这边是每次服务启动的比较慢,多等一下就好了。有时候因为代码问题某个服务exit了在访问这个服务的时候也会502。
踩坑7:git stash的使用。
- git stash用于隐藏暂存区和非暂存区,但是对于没有进行版本管理的文件不起作用。项目中logic部分的代码不会主动加入版本管理,要手动添加一下,否则隐藏的时候隐藏不上去,代码就错乱了。
踩坑8:.gitignore不起作用,导致test文件被提交到了远端。
-
之前用test/*。后来改用test/。在远端已经出现test文件后,下面是处理方案:
git rm -r --cached . git add . git commit -m 'update .gitignore' git push -u origin master // 改为自己的分支
踩坑9:解决WSL2占用内存过多问题(Docker on WSL2: VmmemWSL)
踩坑10:git bash执行脚本的时候不会被默认启动
- 在资源管理下打开目录,然后手动打开git bash执行脚本
- 或者可以参考下面方法修改默认打开终端
难点
1:如何调用其他rpc服务。
在做setIsSelected需求的时候需要调用usercenter的rpc判断当前用户是否有权限。当时阳哥是让我参照其他有调rpc服务的地方写。但是找了很久没有找到。然后我就问gpt,gpt给出了相应的解决:
- 在svc下面ServiceContext注册需要的rpc服务 eg:
userinfo, err := l.svcCtx.UserCenterRpc.GetUserInfo(l.ctx, &usercenter.GetUserInfoReq{
Id: in.UserId,
})
收获
收获1
-
在优化lastId字段的时候了解到了优化大数据量分页offset的时候的两种优化方式:
-
首先是offset limit 的实现方式是先找到比目标数量大的一个数,比如10000条记录就得先找到第100001条,时间复杂度O(n);然后再根据limit限制的条数得到结果10000+n条,还得回表,回表是随机IO,性能差,可以发现前10000条是没必要的。因此有一种常见的方式是使用覆盖索引,避免这一万条数据的回表。
-
在这里我们使用另外一种方式,使用lastId记录上次页的最后一条记录的id,下次访问接口的时候携带这个lastId,可以基于它,在where条件里面利用聚簇索引的特性,快速找到对应的offset,时间复杂度O(logn)在移动端上下页上很常见这种方式。
收获2
- 前面几天的组会很有意义,阳哥也带我们从0-1开发了一条业务流程。现在回顾来看在部署完项目后看那个会议记录,是能在很短时间内上手开发的。
19
-
也是完成需求。需求已经合并,但是需要优化,20号的时候对一些细节进行了优化,提交了代码。
-
19号同时阳哥给出了新的需求评审,通过阳哥和翔哥的讨论理解了整个开奖的大概流程,定时任务和消息处理这块是交给了翔哥对接,我主要负责业务块的对接。在理解了业务需求后用gpt 写了伪码(真香),然后理解了gpt的代码做了相应修改。
20
- 20号根据伪码,在项目中写了个初版的业务逻辑结构,然后和肖华哥这边交流了一波,学习到了很多。
- 创建一个lottery_setting表进行处理,既可以避免lottery表结构太大也可以避免开奖相关业务操作lottery表,还有可能有其他业务也需要操作lottery表影响该表相关的性能。
- 还有一个亮点是策略模式,之前没系统学习过设计模式。然后我用gpt迅速了解了这个模式,发现很符合业务需求。
- 虽然最后面目前是都在lottery表,但是学习到了设计的一些思路(做业务也讲点儿格局hhh)
21
-
lottery表结构设计
-
使用策略模式优化一下之前完成的按时开奖业务

浙公网安备 33010602011771号