线上问题复盘
背景:现在开仓是需要打开一系列开关,其中仓这边一共有开关如下,有独立的群产品统一通知相关人员进行开关配置.
xxxxx仓,仓code :
1.开启联运收货
2.配置发货dts-是否针对加工品
3.越库回传dts
4.采购开启多配多发开关
5.打开配货单接收开关
6.打开波次完整性校验开关
7.取消、延期接口开关
8.打开内部仓开关
9.库存占用开关
-
作为ums整个链路的入口,现在接单这边主要维护两个开关,b2bOutDecouplingWids和b2bWarehouseIdList
-
- b2bOutDecouplingWids为接耦名单,DTS占用和生成拣货单都依赖该开关进行占用
-
- b2bWarehouseId是B2B仓白名单
-
开关推送
-
- 16:54 产品通知新开仓开关
-
- 17:15:56进行开关推送
-
- diamond反馈推送成功
-
正常发布
-
- 20:11:10开始灰度部署
-
- 20:30左右反馈缺货出
-
- 21:00开始回滚
-
- 发现是实操打包完成依赖开关outDecouplingWids为空
-
- 检查日志发现是diamond解析报错
-
问题原因
-
- 开关推送diamond该配置是一个字符串的解析,该推送在末尾存在一个无法肉眼识别的回车
-
- 该解析代码:
private void parseOutDecouplingWids(String config) {
log.info("[Diamond] outDecouplingWids:" + config);
if (StringUtil.isBlank(config)) {
return;
}
try {
Set<Long> set = Sets.newHashSet();
for (String widStr : config.split(",")) {
set.add(Long.valueOf(widStr));
}
outDecouplingWids = Lists.newArrayList(set);
// 容器加载完成,静态变量加载
outDecouplingWidConstant = Lists.newArrayList(set);
} catch (Exception e) {
log.error("parse out decoupling switch error", e);
}
}
config.split(",")这里解析报错,被catch住。
逻辑是解析报错只会记录一个日志信息,系统仍然使用上一次推送缓存的值.
这样的结果就是线上正常运行,只是推送值无效。
4. 3. 正式发布机器重新启动。diamond的init方法开始去解析配置最新值, 依旧解析错误,正式发布机器无法获取配置,获取的值为空
4. 4. 线上机器与发布机器的开关不一致,发布机器上的RF请求打包依赖的开关配置为空,打包缺货出回传
-
问题解决
-
- UMX紧急评估影响主要在缺货出,由于已经回传,相关链路需要进行数据订正
-
- 各个域相关同学进行数据订正
拉取2019-02-20 00:00:00 ~ 23:40的缺货xx订单数据
整理出其中需要订正的缺货的单子, 同步客服处理退款的方案
整批次缺货出的订单筛选是否需要重新下发
根据履约单单状态,给出不同的处理方案在途库存不需要订正,实物库存根据第二天的配送,需要ums跟库存进行对比订正
财务根据配送结果进行缺货订单的订正
- 各个域相关同学进行数据订正
-
后续action
-
- 开关配置注意避免使用回车与空格或中文等特殊字符, 推送完要尽量确认各种指标是否正常
-
- 开关解析代码需要优化, diamond配置不像switch强行定义的推送类型,推送成功失败有明确的反馈,因此需要格外注意
-
- diamond解析错误监控需要配置