您现在的位置是:首页 >学无止境 >技术日志2023-5-19网站首页学无止境

技术日志2023-5-19

Owen Guo 2024-06-17 11:19:14
简介技术日志2023-5-19

记录今天的线上事故

事故1

今天忽然发生了一个线上事故,是因为之前的需求有一个司机管理,在新增司机的时候会将这个用户增加到用户中心,然后赋予这个用户司机的角色。

对于用户中心的角色,它肯定也是一条数据,每一个角色都是有一个id的,然后赋予用户角色就是将用户id和角色id进行关联。

在业务系统中业务开发人员肯定是不会关心这个角色id的,id是数据库的主键,万一修改一下记录,那这个id变了,业务系统的代码也需要跟着修改。

这样就需要一个角色编码来和角色id关联,用户都是通过这个角色编码来获取底层的角色id的,有了角色id后再进行操作。

回到我们上面提到的事故,这个事故是因为我们业务系统中获取司机角色id的问题,开发中是直接通过初始化代码块,在项目启动的时候将角色编码和角色id写道redis中的,最开始是直接通过@PostConstruct注解修饰的代码快来初始化的。

// todo(没有看代码,周一补一下这里的逻辑)
因为。。。,所以就把这个初始化方法加到。。。方法中

所以导致上线之后获取这个角色id的时候获取到了空Map,然后就是一连串的控制在报错。

解决

这里其实可以做到如果查询不到角色id的话就一定要有兜底方案来去执行初始化操作,不论是去查数据库还是写死的初始化。

事故2

在这次需求上线之前对于司机信息其实是有一些原始数据的,因为这次需求将原始的司机信息迁移到了我们组来负责,所以上线的时候要将原始的数据迁移到我们这里。

不知道是遗漏的原因还是怎么样,数据没有进行迁移,上线第二天才想到迁移。但是公司上线只有周二和周四才能上线,其他时候都需要走紧急上线才可以。所以就工作走工单的方式直接执行sql,将数据同步到线上数据库。

工单的形式就是有一个系统,可以通过这个系统来执行一个sql在线上数据库,只不过是需要一定的权限,并且需要领导审批通过才可以。这样对于线上数据库的任何操作都是有迹可寻的

这次同步数据逻辑是这样的:
从线上将用户数据导出一份到线下,然后写了一个方法获取的用户的数据,然后再将用户的数据执行插入sql插入到我们的数据库中。这些都是在开发环境执行的,然后将插入到开发环境数据的数据到处一份sql出来,通过工单来执行这些sql同步数据。

通过逻辑的代码是这样的
这份同步数据的代码写成了一个非常低效的代码,大致逻辑是这样的,因为数据不多,所以将原始数据通过list全部查询到集合中,然后便利这个集合,一条一套的将这些数据插入到我们的数据库。因为两个表的字段不完全一样,所以就是一个字段一个字段的对应起来,get一下然后再set一下,非常笨的一个代码。

对这里的一些想法
1、同步数据的代码是不是可以能写的快速简单一些,或者可以利用AI来快速生成一份代码
2、直接将用户数据获取到本地这是一个非常不可取的操作,如果是隐私数据那就会造成非常大的事故了。
3、执行sql来同步数据这是目前的数据量非常少,大概只有不到1000条,如果要是达到1000w条那该如何操作。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。