查询问题:
场景
一个表中5000W多记录,用户查询,插入响应非常慢。
思路一:
索引
思路二:
少查,尽量索引覆盖
思路三:
读写分离
思路四:
读写分离+缓存
思路五:
冷热数据
垂直分表+垂直分库+缓存
思路六:
冷热数据
垂直分表+垂直分库+读写分离+缓存
思路七:
宽表同步到es,查询走es
RPC问题
场景1:
订单系统中,一个订单有200件商品,查看商品明细,cat not create native thread
思路一:批量查询
思路二:缓存
思路三:批量查询导致OOM,则分片批量查询
场景2:
收货扫描商品码
ReceiveOrder receiveOrder = receiveOrderRepository.getById(receiveOrderId);
List<Sku> skus = skuRepository.queryByScanerCode(thirdScanCode);
receiveOrderRepository.updateById(receiveOrder);
ProductVo productVo = productService.getProduct(sku.getSpuId());
receiveOrderRepository.updateById(receiveOrder);
List<ReceiveOrderSplitDetail> receiveOrderSplitDetails = receiveOrderSplitDetailRepository.queryBySkuId(receiveOrderId, sku.getId());
receiveOrderRepository.updateById(receiveOrder);
PurchaseOrder purchaseOrder = purchaseOrderRepository.getById(receiveOrderSplitDetailQ.getPurchaseOrderId());
WmsReceiveExceptionItem wmsReceiveExceptionItem = wmsReceiveExceptionItemRepository.getById(exceptionDetail.getRefId());
PurchaseSplitDetail purchaseSplitDetail = purchaseSplitDetailRepository.getByOrderIdAndSkuIdPurchaseOrderId(wmsReceiveExceptionItem.getOrderId(), wmsReceiveExceptionItem.getSkuId(),wmsReceiveExceptionItem.getPurchaseOrderId());
Order order = orderRepository.getById(purchaseSplitDetail.getOrderId());
List<PurchaseSplitDetail> purchaseSplitDetails = purchaseSplitDetailRepository.queryByPurchaseOrderAndSkuId(receiveOrderSplitDetail.getPurchaseOrderId(), receiveOrderSplitDetail.getSkuId());
List<WmsReceiveExceptionItem> wmsReceiveExceptionItems1 = wmsReceiveExceptionItemRepository.queryByOrderSkuIdAndPurchaseOrderId(purchaseSplitDetail.getOrderId(), purchaseSplitDetail.getSkuId(), purchaseSplitDetail.getPurchaseOrderId());
ReceiveOrderSplitDetail receiveOrderSplitDetail1 = receiveOrderSplitDetailRepository.queryByRefId(wmsReceiveExceptionItem.getId());
Order order = orderRepository.getById(purchaseSplitDetail.getOrderId());
List<PurchaseSplitDetail> purchaseSplitDetails = purchaseSplitDetailRepository.queryByPurchaseOrderAndSkuId(receiveOrderSplitDetail.getPurchaseOrderId(), receiveOrderSplitDetail.getSkuId());
dubbo设置的超时时间为3秒,【收货扫描商品码】处理逻辑的时长可能在5秒以上,会导致rpc的重试,占用数据库连接资源,导致其他业务逻辑线程等待,超时。
思路一: 前端: 对于用户操作,在操作按钮上添加活性非活性事件,在用户点击后,按钮置为不可点,减少用户的重试次数。 后端: 关闭耗时长的方法的重试功能,用快速失败的策略,并对单个方法设置超时时间(消费端/服务端:设置时间短的时间生效) 思路二: 数据库设计范式适用于单体的大部分场景。但是对于soa,微服务,设计范式很多时候就是瓶颈的根源。 对于过于复杂的业务逻辑,利用数据宽表,将多字段插入同一个表,能很大程度减少查询的IO次数,提高性能。 对于后期同步es也能提高同步速度。 思路三:异步操作
场景:
订单捡货进入待打包状态,且需要记录操作日志
实现方法一
1.记录日志
2.修改订单sku捡货数量
3.计算订单是否捡货完成
4.捡货未完成->捡货状态:process
5.捡货完成->捡货状态:finish
6.判断捡货状态是finish,更新订单状态
实现方法二
同步流程1
1.修改订单sku捡货数量
2.一步记录日志
3.发送异步消息
异步流程2:
1.修改订单sku捡货数量
2.捡货未完成->捡货状态:process
3.捡货完成->捡货状态:finish
4.判断捡货状态是finish,更新订单状态
应用分离
- 供应商
- 小B
- trendsi
功能独立部署
服务器性能
cpu
memory
io