通过分析过往大促流量,分钟级流量增长率为75%,大促仓内反馈三方订单下传不及时,库存预占吞吐量和性能是导致订单积压因素之一。目前库存使用mysql数据库作为接单预占的扛量手段,随着一体化供应链建设以及重点KA商家不断接入,现有库存架构在业务支撑上存在风险和缺陷。
名词解释:
库存预占:是指消费者拍下商品订单后,库存先为该订单短暂预留,预留的库存即为预占库存。
StringBuffer md5Key = new StringBuffer();
md5Key.append(logicWarehouseStock.getGoodsNo()+"_"+logicWarehouseStock.getWarehouseNo()+"_"+logicWarehouseStock.getOwnerNo()+
"_"+logicWarehouseStock.getDeptNo()+"_"+logicWarehouseStock.getStockType()+"_"+logicWarehouseStock.getGoodsLevel());
if(StringUtils.isBlank(logicWarehouseStock.getFactor1())){
md5Key.append("_0");
}else {
md5Key.append("_"+logicWarehouseStock.getFactor1());
}
if(StringUtils.isBlank(logicWarehouseStock.getFactor2())){
md5Key.append("_0");
}else {
md5Key.append("_"+logicWarehouseStock.getFactor2());
}
if(StringUtils.isBlank(logicWarehouseStock.getFactor3())){
md5Key.append("_0");
}else {
md5Key.append("_"+logicWarehouseStock.getFactor3());
}
if(StringUtils.isBlank(logicWarehouseStock.getFactor4())){
md5Key.append("_0");
}else {
md5Key.append("_"+logicWarehouseStock.getFactor4());
}
if(logicWarehouseStock.getYn()== null){
md5Key.append("_1");
}else {
md5Key.append("_"+logicWarehouseStock.getYn());
}
md5Key.toString().hashCode()
public void fillMd5Value(){
StringBuffer md5Key = new StringBuffer();
md5Key.append(warehouseNo);
md5Key.append("_");
md5Key.append(goodsNo);
md5Key.append("_");
md5Key.append(goodsLevel);
md5Key.append("_");
md5Key.append(stockType);
//遍历类字段不遍历map是为了控制MD5的组成顺序
Class clazz = BatchAttrStock.class;
Field[] fields = clazz.getDeclaredFields();
try {
int batchFieldCount = 0 ;
for (Field field : fields){
BatchAttrEnum attrEnum = BatchAttrEnum.batchFieldEnumMap.get(field.getName());
//不是批属性的字段不进入MD5的组成
if (attrEnum == null){
continue;
}
batchFieldCount ++;
field.setAccessible(true);
Object value = field.get(this);
if (value == null ){
md5Key.append("0");
continue;
}
if(field.getType().toString().contains("String")){
md5Key.append(value);
continue;
}
if(field.getType().toString().contains("Date")){
Date timeField = (Date) value;
md5Key.append(timeField.getTime());
continue;
}
throw new RuntimeException(attrEnum.getField()+"填充MD5异常");
}
//默认50个批属性长度,长度不够0补齐
int remainLength = 50 - batchFieldCount;
String str = String.format("%0"+remainLength+"d", 0);
md5Key.append(str);
}catch (Exception e){
throw new RuntimeException("填充MD5异常.");
}
md5Key.append(yn);
String md5Value = MD5Util.md5(md5Key.toString());
setMd5Value(md5Value);
}