
一般常规的上线,需要做哪些准备,确保不会因为遗漏这种低级错误导致线上问题?
- 开发中遇到问题标注TODO,避免遗漏,单元测试覆盖业务逻辑
- 准备上线checklist,验收方案
- 检查上线配置
- 是否需要配置定时任务
- 重新检查一遍变更的代码
扩展
- 涉及app的,需要考虑旧版本兼容和回归测试(重点回归若干个高流量的旧版本)
- 若上线后出现问题,先回滚再查问题(适用于大多数场景)
- 核心业务要重点测试

每个服务都有相应的前置校验,有些前置校验逻辑不统一,就会导致服务间数据的不一致。比如风控拦截,服务A未拦截,而服务B却拦截了,从而导致不一致。
送礼请求----------> 服务A(送礼服务)
[1.出仓库礼物]------------>服务B(仓库服务)
[2.收礼者加分成]------------>服务C(消费服务[含分成服务])
送礼请求----------> 服务A(送礼服务)
[1.出仓库礼物]------------>服务B(仓库服务)
[2.收礼者加分成]------------>服务C(消费服务[含分成服务])
[查询是否风险用户]------------>服务D(风控服务)
服务C增加查询之后,如果是风险用户,将会拦截加分成的操作。这样就会导致用户仓库礼物出仓了,但是收礼者却无法接收分成
服务B也要进行风险用户判断,针对资金操作相关的校验,可以统一逻辑,避免相同逻辑维护多个地方
送礼请求----> 服务A(送礼服务)
[1.出仓库礼物]----->服务B(仓库服务)
[ 1.1查询用户是否允许资金变动]----->服务C
[1.1.1查询是否风险用户]--->服务D(风控服务)
[2.收礼者加分成]----->服务C(消费服务[含分成服务])
[2.1查询是否风险用户]----->服务D(风控服务)
若用户是风险用户,操作1就会返回失败,不出仓,也无后续的操作2,这样就避免不一致的问题
送礼请求----------> 服务A(送礼服务)
[1.出仓库礼物和加分成]--------->服务C(消费服务)
[1.1查询是否风险用户]------------>服务D(风控服务)
[1.2出仓库礼物]------------>服务B(仓库服务)
[1.3收礼者加分成]
由消费服务统一对资产进行“出”和“入”

在平常编码的时候,经常会看到很多人喜欢把一次RPC调用和数据库事务绑定在一起,RPC调用成功则提交事务,RPC调用失败或超时,则回滚事务。那么这样做是对的吗?
考虑以下一种业务场景:用户加入群聊需要花费200金币。
服务架构:服务A(群服务),服务B(消费服务),操作都是幂等的。
加群请求----------> 服务A
[1.新增事务]
[2.RPC进行扣费]------------>服务B
[3.执行加群操作(DB操作)]
[4.提交事务]
业务异常表现为:用户已经扣费,但是没加群成功(即服务A和服务B数据不一致)
服务A通过本地事务表解决。
加群流程图
加群请求----------> 服务A
[1.新增“待扣费”订单(DB操作)]
[2.RPC进行扣费]------------>服务B
[3.更新订单状态为“已扣费”(DB操作)]
[4.执行加群操作(DB操作)]
[5.更新订单状态为“已加群”(DB操作)]
上图的每个操作都是单独的,其中某一步异常都会导致后续中断,因此需要两个定时任务,分别检查“待扣费”和“已扣费”的订单。
定时任务1---------> 服务A
[1.查询“待扣费”订单]
[2.RPC查询是否已扣费]------------>服务B
|(1)已扣费 |(2)未扣费
| |[3.更新订单状态为“已扣费”(DB操作)] [3.更新订单状态为“无效”(DB操作)]
[4.执行加群操作(DB操作)]
[5.更新订单状态为“已加群”(DB操作)]
定时任务2---------> 服务A
[1.查询“已扣费”订单]
[2.执行加群操作(DB操作)]
[3.更新订单状态为“已加群”(DB操作)]
当然定时任务1和2可以放在同一个定时任务执行


如上所示,服务器A是新代码,走的是新逻辑,服务器B和C未发版,走的旧逻辑。
(图不画了,自行想象)

1 | CREATE TABLE `t_order_202002` ( |
1 | ALTER TABLE t_order_202003 |
select *, 那么久的历史表可以不处理,但是这样违反了按需查询原则select order_id, room_id,那么查询到旧的表时会报错
移动互联网下微服务大行其道,服务之间按业务拆分精细,各司其职,通过服务发现rpc相互调用,实现各自的需求场景。
一个简单的列表,如果不依赖其他服务,只依赖自身的数据库,可以简单的通过sql即可查询出来。
而如果数据来源于其他服务,根据特定的需求场景,可能就需要调用多个服务,获取数据,判断属性,过滤数据,再展示,那么可能未免会出现分页的问题。
以下面的场景为例:


拿高薪不是为了钱,是为了证明自己的价值
如果Billy接受这笔钱,就可以一洗之前的“屈辱”,不但个人生活有了保障,还能在新的球队自由发挥,不再被金钱束手束脚。但是Billy没有接受,意料之中又意料之外。离开自己带了几十年的球队不容易,离开自己一直居住的加州不容易,最重要的是离开自己可爱懂事的女儿不容易。当钱的问题终于解决,才发现事情的关键并不是钱,说白了,一个人的成就感并不能用钱来衡量。
如果真要把这部电影当成励志片,它告诉我的并不是“努力就能创造奇迹”,而是人要有勇气作出改变。Billy一直拒绝跟球员亲近,理由是如果投入太多情感,想炒人的时候会下不了手,可却在40几岁的时候,放下了这些防御,主动跟球员沟通,为他们加油打气。在遇到小胖之前,Billy一辈子都在听老一辈人的经验之谈,十八九岁的时候,听了这帮人的游说,放弃了全奖的斯坦福,直接加盟了职业联赛,结果十年也没出成绩,到后来当上经理人,也要听这帮人的建议来买卖队员经营球队,可却在40几岁的时候,选择力排众议,听一个25岁年轻人的建议。如果相信,就要拿出勇气改变。这就是我所学到的。
